Docker与Iptables端口映射问题:跨端口外部访问解决方案
解决Docker端口映射被Iptables阻止的问题
我一眼就看出问题出在你的DOCKER-USER链规则上——你把所有从eth0进来的流量(包括要转发到容器的流量)都丢给FILTERS链过滤了。当你用465:25这种跨端口映射时,转发到容器的流量目的端口是25,而你的FILTERS链只允许了465、22、80、443这些端口的新连接,所以这条流量直接被REJECT掉,导致出现"No route to host"错误。而465:465映射时,转发的目的端口刚好是465,在允许列表里,所以能正常访问。
修复方案
我们需要调整DOCKER-USER的规则,让它只过滤直接发往主机本身的流量,而对Docker端口映射的转发流量开绿灯。具体步骤如下:
删除旧的DOCKER-USER规则:
sudo iptables -D DOCKER-USER -i eth0 -j FILTERS添加新的规则:
# 先允许所有被Docker做了DNAT的流量(也就是端口映射的流量) sudo iptables -A DOCKER-USER -m conntrack --ctstate DNAT -j ACCEPT # 只对发往主机本地IP的流量应用FILTERS过滤(比如SSH、网站等直接访问主机的服务) sudo iptables -A DOCKER-USER -i eth0 -m addrtype --dst-type LOCAL -j FILTERS保存规则(可选):
如果想让规则在重启后仍然生效,执行:sudo iptables-save > /etc/iptables/rules.v4
为什么这样做有效?
-m conntrack --ctstate DNAT会精准匹配所有已经被Docker的端口映射规则处理过的流量,这些流量直接被允许转发到容器,不管你映射的是哪个端口组合。-m addrtype --dst-type LOCAL只会匹配发往主机自身IP的流量,这些流量才会经过你的FILTERS链做安全过滤,既保证了主机的安全性,又不会干扰Docker的正常转发。
这样修改后,你再配置任何端口映射(比如8080:80、587:25等),外部都能正常访问容器服务了。
内容的提问来源于stack exchange,提问作者Régis B.
相关产品推荐
相关产品推荐

