原作者@H_404_3@http://www.lxy520.net/2015/09/24/centos-7-docker-qi-dong-bao/@H_404_3@@H_404_3@
启动一个有nat映射端口的容器时iptables 报No chain/target/match by that name
docker run -d@H_404_3@ -p 2181@H_404_3@:2181@H_404_3@ -p 2888@H_404_3@:2888@H_404_3@ -p 3888@H_404_3@:3888@H_404_3@ garland/zookeeper
Error response from daemon: Cannot start container 565@H_404_3@c06efde6cd@H_404_3@4411e2596ef3d726817c58dd777bc5fd13762e0c34d86076b9e: iptables Failed: iptables --wait -t nat -A DOCKER -p tcp -d@H_404_3@ 0@H_404_3@/0@H_404_3@ --dport 3888@H_404_3@ -j DNAT --to-destination 192.168@H_404_3@.42.11@H_404_3@:3888@H_404_3@ ! -i docker0: iptables: No chain/target/match by that name
找了N多网站和官方issue后,还是没找到真正的解决方法,网上到处转载的只是分析了原因,
找到系统的/etc/sysconfig/iptables
,如果没有用以下命令保存一下,然后查看里边的内容
iptables-save > /etc/@H_404_3@sysconfig/iptables
cat /etc/sysconfig/iptables
发现内容如下
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-N whitelist@H_404_3@
-A whitelist -s 192.168.42.0/24 -j ACCEPT@H_404_3@
#syn
-N syn-flood@H_404_3@
-A INPUT -p tcp --syn -j syn-flood@H_404_3@
-I syn-flood -p tcp -m limit --limit 3/s --limit-burst 6 -j RETURN@H_404_3@
-A syn-flood -j REJECT@H_404_3@
#DOS
-A INPUT -i eth0 -p tcp --syn -m connlimit --connlimit-above 15 -j DROP@H_404_3@
-A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT@H_404_3@
## 省略一些简单的防火墙规则
查看启动容器的报错信息发现-A DOCKER
DOCKER链,但在iptables文件里并没有找到,
由于之前在自己的系统(archlinux)学习使用docker时并没遇到这问题,
所以马上去看了下自己系统里的iptables的文件,
内容如下
*nat
:PREROUTING ACCEPT [27:11935]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [598:57368]
:POSTROUTING ACCEPT [591:57092]
:DOCKER - [0:0]
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER@H_404_3@
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER@H_404_3@
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
-A POSTROUTING -s 172.17.0.3/32 -d 172.17.0.3/32 -p tcp -m tcp --dport 1521 -j MASQUERADE@H_404_3@
-A POSTROUTING -s 172.17.0.3/32 -d 172.17.0.3/32 -p tcp -m tcp --dport 22 -j MASQUERADE@H_404_3@
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 49161 -j DNAT --to-destination 172.17.0.3:1521@H_404_3@
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 49160 -j DNAT --to-destination 172.17.0.3:22@H_404_3@
COMMIT@H_404_3@ # Completed on@H_404_3@ Sun Sep 20@H_404_3@ 17@H_404_3@:35@H_404_3@:31@H_404_3@ 2015@H_404_3@ # Generated by@H_404_3@ iptables-save v1.4@H_404_3@.21@H_404_3@ on@H_404_3@ Sun Sep 20@H_404_3@ 17@H_404_3@:35@H_404_3@:31@H_404_3@ 2015@H_404_3@ *filter :INPUT@H_404_3@ ACCEPT [139291@H_404_3@:461018923@H_404_3@] :FORWARD ACCEPT [0@H_404_3@:0@H_404_3@] :OUTPUT@H_404_3@ ACCEPT [127386@H_404_3@:5251162@H_404_3@] :DOCKER - [0@H_404_3@:0@H_404_3@] -A FORWARD -o docker0 -j DOCKER -A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT@H_404_3@ -A FORWARD -i docker0 ! -o docker0 -j ACCEPT -A FORWARD -i docker0 -o docker0 -j ACCEPT -A DOCKER -d 172.17@H_404_3@.0@H_404_3@.3@H_404_3@/32@H_404_3@ ! -i docker0 -o docker0 -p tcp -m tcp --dport 1521 -j ACCEPT@H_404_3@ -A DOCKER -d 172.17@H_404_3@.0@H_404_3@.3@H_404_3@/32@H_404_3@ ! -i docker0 -o docker0 -p tcp -m tcp --dport 22 -j ACCEPT@H_404_3@ COMMIT@H_404_3@ # Completed on@H_404_3@ Sun Sep 20@H_404_3@ 17@H_404_3@:35@H_404_3@:31@H_404_3@ 2015@H_404_3@ @H_404_3@
对比后以去掉不相关的规则,以现*nat
规则里有以下的对于docker的配置
*nat
:PREROUTING@H_404_3@ ACCEPT@H_404_3@ [27@H_404_3@:@H_404_3@11935@H_404_3@]
:INPUT@H_404_3@ ACCEPT@H_404_3@ [0@H_404_3@:@H_404_3@0@H_404_3@]
:OUTPUT@H_404_3@ ACCEPT@H_404_3@ [598@H_404_3@:@H_404_3@57368@H_404_3@]
:POSTROUTING@H_404_3@ ACCEPT@H_404_3@ [591@H_404_3@:@H_404_3@57092@H_404_3@]
:DOCKER@H_404_3@ - [0@H_404_3@:@H_404_3@0@H_404_3@]
-A@H_404_3@ PREROUTING@H_404_3@ -m addrtype --dst-type LOCAL@H_404_3@ -j DOCKER@H_404_3@
-A@H_404_3@ POSTROUTING@H_404_3@ -s 172.17@H_404_3@.0@H_404_3@.0@H_404_3@/16@H_404_3@ ! -o docker0@H_404_3@ -j MASQUERADE@H_404_3@
COMMIT@H_404_3@
*filter
规则里对docker的配置如下
*filter@H_404_3@
:INPUT@H_404_3@ ACCEPT@H_404_3@ [139291:461018923]@H_404_3@
:FORWARD@H_404_3@ ACCEPT@H_404_3@ [0:0]@H_404_3@
:OUTPUT@H_404_3@ ACCEPT@H_404_3@ [127386:5251162]@H_404_3@
:DOCKER@H_404_3@ -@H_404_3@ [0:0]@H_404_3@
-A@H_404_3@ FORWARD@H_404_3@ -o@H_404_3@ docker0@H_404_3@ -j@H_404_3@ DOCKER@H_404_3@
-A@H_404_3@ FORWARD@H_404_3@ -o@H_404_3@ docker0@H_404_3@ -m@H_404_3@ conntrack@H_404_3@ --ctstate@H_404_3@ RELATED@H_404_3@,ESTABLISHED@H_404_3@ -j@H_404_3@ ACCEPT@H_404_3@
-A@H_404_3@ FORWARD@H_404_3@ -i@H_404_3@ docker0@H_404_3@ ! -o@H_404_3@ docker0@H_404_3@ -j@H_404_3@ ACCEPT@H_404_3@
-A@H_404_3@ FORWARD@H_404_3@ -i@H_404_3@ docker0@H_404_3@ -o@H_404_3@ docker0@H_404_3@ -j@H_404_3@ ACCEPT@H_404_3@
COMMIT@H_404_3@
去掉不相关规则后的配置文件如下(可以直接用):
*nat
:PREROUTING@H_404_3@ ACCEPT@H_404_3@ [27@H_404_3@:@H_404_3@11935@H_404_3@]
:INPUT@H_404_3@ ACCEPT@H_404_3@ [0@H_404_3@:@H_404_3@0@H_404_3@]
:OUTPUT@H_404_3@ ACCEPT@H_404_3@ [598@H_404_3@:@H_404_3@57368@H_404_3@]
:POSTROUTING@H_404_3@ ACCEPT@H_404_3@ [591@H_404_3@:@H_404_3@57092@H_404_3@]
:DOCKER@H_404_3@ - [0@H_404_3@:@H_404_3@0@H_404_3@]
-A@H_404_3@ PREROUTING@H_404_3@ -m addrtype --dst-type LOCAL@H_404_3@ -j DOCKER@H_404_3@
-A@H_404_3@ OUTPUT@H_404_3@ ! -d 127.0@H_404_3@.0@H_404_3@.0@H_404_3@/8@H_404_3@ -m addrtype --dst-type LOCAL@H_404_3@ -j DOCKER@H_404_3@
-A@H_404_3@ POSTROUTING@H_404_3@ -s 172.17@H_404_3@.0@H_404_3@.0@H_404_3@/16@H_404_3@ ! -o docker0@H_404_3@ -j MASQUERADE@H_404_3@
COMMIT@H_404_3@
# Completed on Sun Sep 20 17:35:31 2015@H_404_3@
# Generated by iptables-save v1.4.21 on Sun Sep 20 17:35:31 2015@H_404_3@
*filter
:INPUT@H_404_3@ ACCEPT@H_404_3@ [139291@H_404_3@:@H_404_3@461018923@H_404_3@]
:FORWARD@H_404_3@ ACCEPT@H_404_3@ [0@H_404_3@:@H_404_3@0@H_404_3@]
:OUTPUT@H_404_3@ ACCEPT@H_404_3@ [127386@H_404_3@:@H_404_3@5251162@H_404_3@]
:DOCKER@H_404_3@ - [0@H_404_3@:@H_404_3@0@H_404_3@]
-A@H_404_3@ FORWARD@H_404_3@ -o docker0@H_404_3@ -j DOCKER@H_404_3@
-A@H_404_3@ FORWARD@H_404_3@ -o docker0@H_404_3@ -m conntrack --ctstate RELATED@H_404_3@,ESTABLISHED@H_404_3@ -j ACCEPT@H_404_3@
-A@H_404_3@ FORWARD@H_404_3@ -i docker0@H_404_3@ ! -o docker0@H_404_3@ -j ACCEPT@H_404_3@
-A@H_404_3@ FORWARD@H_404_3@ -i docker0@H_404_3@ -o docker0@H_404_3@ -j ACCEPT@H_404_3@
COMMIT@H_404_3@
# Completed on Sun Sep 20 17:35:31 2015@H_404_3@
然后再加上自己服务器的过滤规则,合并后覆盖到Centos 7的/etc/sysconfig/iptables
文件
重启iptables 服务
systemctl@H_404_3@ restart iptables.service
两次启动对应docker容器,
docker run -d@H_404_3@ -p 2181@H_404_3@:2181@H_404_3@ -p 2888@H_404_3@:2888@H_404_3@ -p 3888@H_404_3@:3888@H_404_3@ garland/zookeeper
发现容器启动成功,虽然有警告,但并不影响容器的使用
PS: @孙振树 提供的解决办法: 如果iptables是在docker后安装的,把docker重新安装下就可以了