众所周知,一般 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 拦截呢
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.