docker 中多个容器访问 expose 端口的诡异问题 - V2EX

现有机器 A,单网卡地址为 addA

机器上有两组容器,一组使用 docker-compose 编排,网段为dockernet1,另一组使用 docker run 运行,为 mongodb,mysql 之类的,网段为dockernet2,暴露出的端口有 3306,27017 等。

现在发现,在不设值任何 iptables 规则的默认情况下,dockernet1中容器的应用无法通过机器的 IP+暴露出的端口(addA:27017)访问dockernet2中的容器的数据库。但是如果我设值了iptables -I INPUT -p tcp -s dockernet1/16 --dport 27017 -j ACCEPT 之后,虽然可以从 dockernet1 中访问,但也会导致全网都可以访问这个端口了。

经过测试尝试,我发现了如下现象:

  • 数据库等服务都正常启动了;
  • 默认情况下,任何容器中都无法通过主机 IP+端口 addA:27017 的方式访问容器中启动的数据库;
  • 在主机中使用主机 IP+端口 (addA:27017)可以访问数据库,在其他主机也可以;
  • 配置的 iptables 规则,iptables -I INPUT -s dockernet1/16 --dport 27017 -j ACCEPT 后,会导致全网都可以访问这个端口,即使设值了默认 DROP 掉白名单之外的链接;
  • 开放 iptables 后,尝试使用 tcpdump 抓包在容器中使用 addA:27017形式建立的链接,但是没有抓到任何包;

请教一下大家:

  1. 为什么在其他主机上都可以通过 addA:27017 的方式访问这个数据库,但是在任何容器中都不行呢;
  2. 为什么上面设置的 iptables 会导致白名单之外的全网都可以访问这个端口;
  3. 为什么 tcpdump 抓包没有结果?
  4. 如何才能正确设置 docker 的网络和 iptables 规则呢?

Original url: Access
Created at: 2019-05-05 15:42:14
Category: default
Tags: none

请先后发表评论
  • 最新评论
  • 总共1条评论
DeepMind

rain16881

补充,docker 网络使用的是默认的 bridge 模式,另外,在容器中是能够访问主机上绑定的其他端口的服务的,但是不能访问容器 expose 出来的端口上的服务。

2019-05-05 15:42:47 回复