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

如何阻止Docker转发端口被外部访问?iptables规则失效排查

问题根源与解决方案

你的问题出在规则应用的链不对,Docker的端口转发流量根本不会走INPUT链,所以你加的那些规则完全没生效。我来给你拆解清楚:

为什么之前的规则没用?

当外部访问主机的8003/8004/8005端口时,Docker会通过DNAT(网络地址转换)把请求转发到容器内部的80端口,这类流量属于转发流量,会走FORWARD链,而不是INPUT链(INPUT链只处理直接发给主机本身的流量,比如SSH登录主机22端口的请求)。

另外,Docker专门预留了DOCKER-USER链给用户自定义规则,所有进入Docker的转发流量都会先经过这个链,所以必须在这里加规则才会生效。

正确的解决步骤

1. 先清理之前无效的INPUT链规则

先把你之前加的错误规则删掉,避免干扰:

iptables -D INPUT -s 212.154.74.194/32 -p tcp -j ACCEPT
iptables -D INPUT -s 185.22.208.0/25 -p tcp -j ACCEPT
iptables -D INPUT -p tcp -m tcp --dport 8003 -j DROP
iptables -D INPUT -p tcp -m tcp --dport 8004 -j DROP
iptables -D INPUT -p tcp -m tcp --dport 8005 -j DROP

2. 在DOCKER-USER链添加正确的规则

规则顺序很重要:先允许指定IP/IP段的访问,再拒绝其他所有请求(iptables是从上到下匹配,匹配到就停止处理)。

你可以用多端口匹配来简化规则:

# 允许指定单个IP访问三个端口
iptables -A DOCKER-USER -s 212.154.74.194/32 -p tcp -m multiport --dports 8003,8004,8005 -j ACCEPT
# 允许指定IP段访问三个端口
iptables -A DOCKER-USER -s 185.22.208.0/25 -p tcp -m multiport --dports 8003,8004,8005 -j ACCEPT
# 拒绝其他所有IP访问这三个端口
iptables -A DOCKER-USER -p tcp -m multiport --dports 8003,8004,8005 -j DROP

如果想分开每个端口配置,也可以写成:

# 允许单个IP访问各端口
iptables -A DOCKER-USER -s 212.154.74.194/32 -p tcp --dport 8003 -j ACCEPT
iptables -A DOCKER-USER -s 212.154.74.194/32 -p tcp --dport 8004 -j ACCEPT
iptables -A DOCKER-USER -s 212.154.74.194/32 -p tcp --dport 8005 -j ACCEPT
# 允许IP段访问各端口
iptables -A DOCKER-USER -s 185.22.208.0/25 -p tcp --dport 8003 -j ACCEPT
iptables -A DOCKER-USER -s 185.22.208.0/25 -p tcp --dport 8004 -j ACCEPT
iptables -A DOCKER-USER -s 185.22.208.0/25 -p tcp --dport 8005 -j ACCEPT
# 拒绝其他访问
iptables -A DOCKER-USER -p tcp --dport 8003 -j DROP
iptables -A DOCKER-USER -p tcp --dport 8004 -j DROP
iptables -A DOCKER-USER -p tcp --dport 8005 -j DROP

3. 保存规则,确保重启后不丢失

不同系统保存方式略有不同:

  • Debian/Ubuntu:用netfilter-persistent工具,先安装(如果没装):
    apt-get install netfilter-persistent
    netfilter-persistent save
    
  • CentOS/RHEL:
    service iptables save
    
  • 通用方式:
    iptables-save > /etc/iptables/rules.v4
    

验证规则是否生效

你可以用iptables -L DOCKER-USER -v -n查看规则是否正确添加,然后从非允许的IP尝试访问8003/8004/8005端口,应该会被拒绝;从允许的IP访问则正常通行。

内容的提问来源于stack exchange,提问作者Hakan Özdemir

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 06:32:24