启动一个有 nat 映射端口的容器时,iptables 报 No chain/target/match by that name
Shell
docker run - d - p 2181 : 2181 - p 2888 : 2888 - p 3888 : 3888 garland / zookeeper
Error response from daemon : Cannot start container 565c06efde6cd4411e2596ef3d726817c58dd777bc5fd13762e0c34d86076b9e : iptables failed : iptables -- wait - t nat - A DOCKER - p tcp - d 0 / 0 -- dport 3888 - j DNAT -- to - destination 192.168.42.11 : 3888 ! - i docker0 : iptables : No chain / target / match by that name
找了N多网站和官方issue后,还是没找到真正的解决方法,网上到处转载的只是分析了原因,并没有明确的解决方案,为此与同事通宵加班终于解决了这个问题。
找到系统的/etc/sysconfig/iptables
Shell
iptables - save > / etc / sysconfig / iptables
cat / etc / sysconfig / iptables
发现内容如下
Shell
* filter
: INPUT ACCEPT [ 0 : 0 ]
: FORWARD ACCEPT [ 0 : 0 ]
: OUTPUT ACCEPT [ 0 : 0 ]
- N whitelist
- A whitelist - s 192.168.42.0 / 24 - j ACCEPT
#syn
- N syn - flood
- A INPUT - p tcp -- syn - j syn - flood
- I syn - flood - p tcp - m limit -- limit 3 / s -- limit - burst 6 - j RETURN
- A syn - flood - j REJECT
#DOS
- A INPUT - i eth0 - p tcp -- syn - m connlimit -- connlimit - above 15 - j DROP
- A INPUT - p tcp - m state -- state ESTABLISHED , RELATED - j ACCEPT
## 省略一些简单的防火墙规则
查看启动容器的报错信息发现-A DOCKER
由于之前在自己的系统(archlinux)学习使用docker时并没遇到这问题,
所以马上去看了下自己系统里的iptables的文件,
内容如下
Shell
* 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
- A OUTPUT ! - d 127.0.0.0 / 8 - m addrtype -- dst - type LOCAL - j DOCKER
- 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
- A POSTROUTING - s 172.17.0.3 / 32 - d 172.17.0.3 / 32 - p tcp - m tcp -- dport 22 - j MASQUERADE
- A DOCKER ! - i docker0 - p tcp - m tcp -- dport 49161 - j DNAT -- to - destination 172.17.0.3 : 1521
- A DOCKER ! - i docker0 - p tcp - m tcp -- dport 49160 - j DNAT -- to - destination 172.17.0.3 : 22
COMMIT
# Completed on Sun Sep 20 17:35:31 2015
# Generated by iptables-save v1.4.21 on Sun Sep 20 17:35:31 2015
* filter
: INPUT ACCEPT [ 139291 : 461018923 ]
: FORWARD ACCEPT [ 0 : 0 ]
: OUTPUT ACCEPT [ 127386 : 5251162 ]
: DOCKER - [ 0 : 0 ]
- A FORWARD - o docker0 - j DOCKER
- A FORWARD - o docker0 - m conntrack -- ctstate RELATED , ESTABLISHED - j ACCEPT
- A FORWARD - i docker0 ! - o docker0 - j ACCEPT
- A FORWARD - i docker0 - o docker0 - j ACCEPT
- A DOCKER - d 172.17.0.3 / 32 ! - i docker0 - o docker0 - p tcp - m tcp -- dport 1521 - j ACCEPT
- A DOCKER - d 172.17.0.3 / 32 ! - i docker0 - o docker0 - p tcp - m tcp -- dport 22 - j ACCEPT
COMMIT
# Completed on Sun Sep 20 17:35:31 2015
*nat
规则里有以下的对于docker的配置
Shell
* 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
- A POSTROUTING - s 172.17.0.0 / 16 ! - o docker0 - j MASQUERADE
COMMIT
*filter
Shell
* filter
: INPUT ACCEPT [ 139291 : 461018923 ]
: FORWARD ACCEPT [ 0 : 0 ]
: OUTPUT ACCEPT [ 127386 : 5251162 ]
: DOCKER - [ 0 : 0 ]
- A FORWARD - o docker0 - j DOCKER
- A FORWARD - o docker0 - m conntrack -- ctstate RELATED , ESTABLISHED - j ACCEPT
- A FORWARD - i docker0 ! - o docker0 - j ACCEPT
- A FORWARD - i docker0 - o docker0 - j ACCEPT
COMMIT
去掉不相关规则后的配置文件如下(可以直接用):
Shell
* 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
- A OUTPUT ! - d 127.0.0.0 / 8 - m addrtype -- dst - type LOCAL - j DOCKER
- A POSTROUTING - s 172.17.0.0 / 16 ! - o docker0 - j MASQUERADE
COMMIT
# Completed on Sun Sep 20 17:35:31 2015
# Generated by iptables-save v1.4.21 on Sun Sep 20 17:35:31 2015
* filter
: INPUT ACCEPT [ 139291 : 461018923 ]
: FORWARD ACCEPT [ 0 : 0 ]
: OUTPUT ACCEPT [ 127386 : 5251162 ]
: DOCKER - [ 0 : 0 ]
- A FORWARD - o docker0 - j DOCKER
- A FORWARD - o docker0 - m conntrack -- ctstate RELATED , ESTABLISHED - j ACCEPT
- A FORWARD - i docker0 ! - o docker0 - j ACCEPT
- A FORWARD - i docker0 - o docker0 - j ACCEPT
COMMIT
# Completed on Sun Sep 20 17:35:31 2015
然后再加上自己服务器的过滤规则,合并后覆盖到Centos 7的 /etc/sysconfig/iptables
文件
重启iptables 服务
Shell
systemctl restart iptables .service
两次启动对应docker容器,
Shell
docker run - d - p 2181 : 2181 - p 2888 : 2888 - p 3888 : 3888 garland / zookeeper
发现容器启动成功,虽然有警告,但并不影响容器的使用