在一个 Docker 容器中,通过主机的 Hostname 访问 另一个容器 中架设的网站,会被 ufw 拦截

2021-04-23 16:44:02 +08:00
 essethon

背景

众所周知,一般 ufw 防火墙是不会对 Docker 容器映射的端口起作用的,因为 ufw 的原理是向 iptables 里添加规则,而 Docker 映射端口时也会向 iptables 添加规则,而且 Docker 添加的那两个 Chains (DOCKER-USER 和 DOCKER) 优先级要比 ufw 的那些 chains 高。( ref: https://docs.docker.com/network/iptables/

所以,在我的 VPS 上,我一直是用 Docker 运行一个 Traefik 容器,然后这个容器开启端口映射 0.0.0.0:443:443,对公网开放了 443 端口,作为我的网站入口。假设我的域名是 domain.tld.,该域名有一条 A 记录指向我 VPS 的 IP 地址。

而由于 DOCKER 在防火墙上打洞比 ufw 优先级高,ufw 不需要 allow https(443) ,访客就能通过 https://domain.tld 访问我的网站,这没问题,works as expected.

问题

但是今天意外发现,如果我在运行 Traefik 容器(网站)的同一台 VPS 再跑一个容器 test,在 test 容器内运行 curl https://domain.tld,这个访问居然会被 VPS 上的 ufw 防火墙拦截。

因为我只要在 VPS 上运行 ufw allow https,上述访问就能成功; ufw delete allow https 删掉规则,上述访问就会卡住。已经反复多次试验,在该 VPS 上可稳定复现。

补充信息

更加令人百思不得其解的是,我的另一台 VPS,同样的配置:

这台 VPS 就完全和我想象的一样,在 ufw allow https 的情况下,另开一个容器,容器内也能正常 curl https://xxx 访问到另一个 traefik 容器。

请问 V 友们知道还有什么可以排查问题的思路么? 为什么我访问一个本机 Docker 开放了端口的容器,会被本机的 ufw 拦截呢

1143 次点击
所在节点    Docker
4 条回复
Showfom
2021-04-23 19:23:46 +08:00
我也被 docker 的 bridge 网络困惑了很久,最后索性直接 host 模式一劳永逸哈哈哈
oott123
2021-04-23 20:04:32 +08:00
两边打 iptables-save 对比
leschans
2021-04-24 07:21:29 +08:00
allow localhost 不知道管不管用
ypcs03
2021-05-08 01:58:12 +08:00
会不会是 dns 解析的时候出问题?看看 dns 缓存

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/772758

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX