



















https://chat.deepseek.com/share/zunsaivd56nifllp1x
以下是为您生成的一份完整、详细、可直接参考的操作总结,涵盖了从问题现象、排查思路、解决方案到持久化配置的整个流程。您可以将此文档保存为 容器访问外部服务配置记录.md 或类似文件,供后续维护或团队参考。
curl 访问 http://10.100.1.90:9090/api/Light/PostTest/ 并正常返回 "你好!",但 Docker 容器(如 docker-backend-1)无法访问该地址。iptables 的 DOCKER-USER 链中存在一条通用 DROP 规则(目标端口包含 9090),丢弃了所有不在 ACCEPT 白名单内的源 IP 的流量。172.30.0.0/16 网段,而现有的 ACCEPT 规则只放行了其他网段(如 10.204.52.0/24、10.66.17.0/24 等),未包含 172.30.0.0/16。curl 返回 "你好!"。docker inspect docker-backend-1 | grep IPAddress
docker network inspect docker_mes-network | grep Subnet
得到容器 IP 172.30.100.2,子网 172.30.0.0/16。sudo iptables -L DOCKER-USER -n -v --line-numbers
发现第 13 条为 DROP 规则,匹配所有源 IP 访问多个端口(含 9090),且前面没有允许 172.30.0.0/16 的规则。sudo iptables -I DOCKER-USER 1 -s 172.30.0.0/16 -d 10.100.1.90/32 -p tcp --dport 9090 -j ACCEPT
命令解析:
-I DOCKER-USER 1:在 DOCKER-USER 链的第 1 条位置插入规则(优先级最高)。-s 172.30.0.0/16:源地址为容器的所在网段。-d 10.100.1.90/32:目标地址(外部服务)。-p tcp --dport 9090:协议 TCP,端口 9090。-j ACCEPT:允许匹配的流量通过。sudo iptables -L DOCKER-USER -n -v --line-numbers | head -5
输出应显示第一条规则为:
1 0 0 ACCEPT tcp -- * * 172.30.0.0/16 10.100.1.90 tcp dpt:9090
进入容器并调用 API:
docker exec -it docker-backend-1 sh -c "curl -X POST -H 'Content-Type: application/json' -d '{}' http://10.100.1.90:9090/api/Light/PostTest/"
预期返回:"你好!"
若容器内没有
curl,可使用wget:docker exec -it docker-backend-1 sh -c "wget --post-data='{}' --header='Content-Type: application/json' -O- http://10.100.1.90:9090/api/Light/PostTest/"
安装 iptables-services(若未安装):
sudo yum install iptables-services -y
停止并禁用 firewalld(避免冲突,可选但推荐):
sudo systemctl stop firewalld
sudo systemctl disable firewalld
保存当前规则到配置文件:
sudo service iptables save
或手动执行:
sudo iptables-save > /etc/sysconfig/iptables
确保 iptables 服务开机自启:
sudo systemctl enable iptables
验证持久化是否成功(重启后检查):
sudo systemctl restart iptables
sudo iptables -L DOCKER-USER -n -v | head -2
其他发行版(Ubuntu/Debian)可使用
iptables-persistent,通用方案可创建 systemd 服务,但 CentOS 7 推荐上述iptables-services方法。
| 组件 | 说明 |
|---|---|
DOCKER-USER 链 |
Docker 推荐用户自定义规则的位置,该链在 FORWARD 链之前生效,且不受 Docker 服务重启影响。 |
| 规则顺序 | iptables 按顺序匹配,一旦匹配则不再继续。因此允许规则必须插入到 DROP 规则之前。 |
| 容器网段 | 不同 Docker 网络可能使用不同子网,需根据实际容器 IP 确定 -s 参数。 |
| 持久化 | iptables-save + 开机加载服务(iptables 或 netfilter-persistent)是保证重启不丢失的标准做法。 |
172.30.0.0/16)内,或为它们所在网段添加类似规则。iptables 命令修改规则后,记得重新执行 sudo service iptables save 更新配置文件。LOG 规则(需加载 nf_log 模块)。# 查看 DOCKER-USER 链详细规则
sudo iptables -L DOCKER-USER -n -v --line-numbers
# 查看所有 iptables 规则
sudo iptables -L -n -v
# 查看容器 IP
docker inspect <容器名> | grep IPAddress
# 查看 Docker 网络子网
docker network ls
docker network inspect <网络名> | grep Subnet
# 测试容器内网络连通性(不依赖 HTTP)
docker exec -it <容器名> ping 10.100.1.90
docker exec -it <容器名> nc -zv 10.100.1.90 9090
文档版本:1.0
最后更新:2026-05-27
适用环境:CentOS 7 + Docker + iptables
按照上述步骤操作,即可实现 Docker 容器访问指定外部 IP+端口的网络连通,并保证重启后规则依然生效。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。