当我关闭iptables时,为什么docker容器仍然可以与外部通信

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (564)

我是docker的新手,并且有关于docker容器网络的一些基本问题需要帮助

有一部分介绍如何使用iptables使docker容器与外部通信,实际上我可以理解这部分:

1从容器到外面,在postrouting链上有一个伪装规则,与SNAT相同

    Chain POSTROUTING (policy ACCEPT)
    target     prot opt source               destination
    MASQUERADE  all  --  172.17.0.0/16       !172.17.0.0/16

2从外面访问容器内的服务,在prerouting链中有一个DNAT规则然后主机将它转发到docker0,容器最终会收到数据包

    Chain DOCKER (2 references)
    target     prot opt source               destination
    DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:49153 to:172.17.0.2:80

但实际上,当我停止iptables服务时,docker的网络仍然正常,我使用“iptables -L”和“iptables -t nat -L”进行检查,内核中没有规则,这是我的设置(假设10.170.28.0/24是外部网络,172.17.0.0/16是docker容器的内部网络):

首先,关闭iptables服务,fiter和nat表为空,如下所示:

    iptables -t nat -L
    Chain PREROUTING (policy ACCEPT)
    target     prot opt source               destination         

    Chain POSTROUTING (policy ACCEPT)
    target     prot opt source               destination         

    Chain OUTPUT (policy ACCEPT)
    target     prot opt source 

    iptables -L
    Chain INPUT (policy ACCEPT)
    target     prot opt source               destination         

    Chain FORWARD (policy ACCEPT)
    target     prot opt source               destination         

    Chain OUTPUT (policy ACCEPT)
    target     prot opt source               destination

这是主机中的路由表(主机IP为10.170.28.8):

    route
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    10.170.28.0     *               255.255.255.192 U     0      0        0 eth0
    192.168.0.0     *               255.255.255.0   U     0      0        0 br-data
    link-local      *               255.255.0.0     U     1002   0        0 eth0
    link-local      *               255.255.0.0     U     1003   0        0 eth1
    link-local      *               255.255.0.0     U     1040   0        0 br-data
    172.17.0.0      *               255.255.0.0     U     0      0        0 docker0
    default         10.170.28.1     0.0.0.0         UG    0      0        0 eth0

确实上面的表中有规则将目的地为172.17.0.0/16的数据包转发到桥接器docker0,但在此之前,谁做了DNAT将10.170.28.8转换为172.17.0.2(容器IP)?如何从容器(172.17.0.0/16)到外部(10.170.28.0/24)的流量如何在没有SNAT或伪装的情况下工作?

提问于
用户回答回答于

首先,'停止'iptables是不可能的,它只是重置规则。正如您的帖子所示,*过滤器 INPUT链的策略是ALLOW。

Docker默认运行TCP转发代理,捕获转发端口的所有流量(验证方式ss -lnp | grep 49153)。

我的机器上的测试表明,出站连接是不可能的:

  1. 启动容器
  2. '停'iptables
  3. 执行它
  4. ping 1.1 ......没有回复

省略2.,ping按预期工作。

$ docker --version
Docker version 18.09.2-ce, build 62479626f2

扫码关注云+社区

领取腾讯云代金券