Docker环境下DOCKER-USER链iptables配置:拦截443入站且允许对应端口出站
Docker 环境下 DOCKER-USER 链规则误拦出站流量的调整方案
原配置与故障现象
在Ubuntu主机部署容器化测试环境,最初为限制公网对容器端口的访问,配置了如下DOCKER-USER链规则:
iptables -I DOCKER-USER -p tcp --dport 80 -j REJECT iptables -I DOCKER-USER -p tcp --dport 443 -j REJECT iptables -I DOCKER-USER -p tcp --dport 3306 -j REJECT iptables -I DOCKER-USER -s <my ip> -p tcp --dport 443 -j RETURN iptables -I DOCKER-USER -s 172.18.0.0/16 -p tcp --dport 3306 -j RETURN
这套规则可以正常拦截非授权来源对80、443、3306端口的访问,但会误拦截所有出站的443端口流量,导致主机、容器对外发起HTTPS API调用、拉取外部资源等功能完全失效。需要在保留入站访问限制能力的同时,放行本机主动发起的对外443端口流量。
故障根因
- 原有REJECT规则仅匹配「TCP协议、目标端口为对应服务端口」的特征,没有限制流量的来源接口方向,也没有基于连接状态做筛选
- 本机/容器主动对外发起443端口请求时,出站的请求包特征刚好匹配「TCP、目标端口443」的条件,会直接被REJECT规则命中拦截,无法正常到达外部网络
- 原有规则采用链头插入(-I)的方式,规则优先级与插入顺序颠倒,进一步提升了规则冲突的概率
调整后的正确配置
调整核心思路:拦截仅针对外部接口进入的入站新建连接,不限制本机、容器主动发起的出站流量,同时基于连接追踪放行已建立的合法连接。
操作步骤:
- 通过
ip a命令确认主机连接公网的实际网卡名称(常见为eth0、ens33等),后续规则中替换为实际值 - 清空DOCKER-USER链上的原有自定义规则,避免残留冲突
iptables -F DOCKER-USER
- 按优先级顺序配置规则:
# 优先放行所有已建立、关联的连接流量,不拦截已经合法建立的连接双向通信 iptables -I DOCKER-USER -m conntrack --ctstate ESTABLISHED,RELATED -j RETURN # 白名单规则:指定IP可正常访问本地443端口的新建连接 iptables -I DOCKER-USER -s <my ip> -p tcp --dport 443 --syn -j RETURN # 白名单规则:Docker内部网段可正常访问本地3306端口的新建连接 iptables -I DOCKER-USER -s 172.18.0.0/16 -p tcp --dport 3306 --syn -j RETURN # 拦截规则:仅拒绝从公网网卡进入的、访问本地80/443/3306端口的新建SYN包 # 此处将eth0替换为实际的公网网卡名 iptables -A DOCKER-USER -i eth0 -p tcp --dport 80 --syn -j REJECT iptables -A DOCKER-USER -i eth0 -p tcp --dport 443 --syn -j REJECT iptables -A DOCKER-USER -i eth0 -p tcp --dport 3306 --syn -j REJECT # 其余所有流量默认放行 iptables -A DOCKER-USER -j RETURN
配置生效效果
- 非白名单IP从公网访问容器的80、443、3306端口时,会被直接拦截
- 白名单指定IP可正常访问443端口服务,Docker内部网段可正常访问3306端口服务
- 主机、容器主动对外发起的80、443、3306端口请求,在DOCKER-USER链的入接口为Docker网桥,与拦截规则要求的公网网卡匹配条件不符,可正常通行,不会被规则误拦。
内容的提问来源于stack exchange,提问作者Lennart
相关产品推荐
相关产品推荐

