Docker 网络 与 iptables的关系

8 min read

首先启动一个 tomcat容器,将其8080端口映射到宿主机上的18080端口上

docker run -itd --name  tomcat01 -p 18080:8080 tomcat:latest 

查看iptabels规则

iptables-save | grep 18080
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 18080 -j DNAT --to-destination 172.17.0.3:8080
iptables-save | grep 8080

*nat
-A POSTROUTING -s 172.17.0.3/32 -d 172.17.0.3/32 -p tcp -m tcp --dport 8080 -j MASQUERADE

*filter
-A DOCKER -d 172.17.0.3/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 8080 -j ACCEPT
  • 规则将访问宿主机18080端口的流量转发到了172.17.0.48080端口上(即真正提供服务的Docker容器IP端口
  • natfilterDocker链中分别增加了一条规则
  • 外界访问Docker容器是通过iptablesDNAT(目的地址转换)实现的

自定义限制外部ip规则

  • Dockerforward规则默认允许所有的外部IP访问容器
  • 可以通过在filterDOCKER链上添加规则来对外部的IP访问做出限制
iptables -I DOCKER -i docker0 ! -s 192.168.0.0/16 -j DROP
// 只允许源IP192.168.0.0/16的数据包访问容器

docker网络与ip-forward

在Docker容器和外界通信的过程中,还涉及了数据包在多个网卡间的转发
如从docker0网卡转发到宿主机ens160网卡

这需要内核将ip-forward功能打开

即将ip_forward系统参数设1:

echo 1 > /proc/sys/net/ipv4/ip_forward

Docker daemon启动的时候默认会将其设为1(--ip-forward=true)