众所周知,一般 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 拦截呢
1
Showfom 2021-04-23 19:23:46 +08:00
我也被 docker 的 bridge 网络困惑了很久,最后索性直接 host 模式一劳永逸哈哈哈
|
2
oott123 2021-04-23 20:04:32 +08:00
两边打 iptables-save 对比
|
3
leschans 2021-04-24 07:21:29 +08:00 via iPhone
allow localhost 不知道管不管用
|
4
ypcs03 2021-05-08 01:58:12 +08:00 via iPhone
会不会是 dns 解析的时候出问题?看看 dns 缓存
|