You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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端口映射的转发流量开绿灯。具体步骤如下:

  1. 删除旧的DOCKER-USER规则:

    sudo iptables -D DOCKER-USER -i eth0 -j FILTERS
    
  2. 添加新的规则:

    # 先允许所有被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
    
  3. 保存规则(可选):
    如果想让规则在重启后仍然生效,执行:

    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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 03:53:07