如何阻止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
相关产品推荐
相关产品推荐

