首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >当我关闭iptables时,为什么docker容器仍然可以与外部通信

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

Stack Overflow用户
提问于 2019-02-22 02:05:57
回答 1查看 0关注 0票数 0

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

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

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

代码语言:javascript
复制
    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,容器最终会收到数据包

代码语言:javascript
复制
    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表为空,如下所示:

代码语言:javascript
复制
    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):

代码语言:javascript
复制
    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或伪装的情况下工作?

EN

Stack Overflow用户

发布于 2019-02-22 11:27:36

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

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

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

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

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

代码语言:javascript
复制
$ docker --version
Docker version 18.09.2-ce, build 62479626f2
票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100005158

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档