现有机器 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形式建立的链接,但是没有抓到任何包;
请教一下大家:
- 为什么在其他主机上都可以通过 addA:27017 的方式访问这个数据库,但是在任何容器中都不行呢;
- 为什么上面设置的 iptables 会导致白名单之外的全网都可以访问这个端口;
- 为什么 tcpdump 抓包没有结果?
- 如何才能正确设置 docker 的网络和 iptables 规则呢?