惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 司徒正美
罗磊的独立博客
Recorded Future
Recorded Future
Cyberwarzone
Cyberwarzone
AWS News Blog
AWS News Blog
S
Securelist
Stack Overflow Blog
Stack Overflow Blog
Latest news
Latest news
T
Tailwind CSS Blog
有赞技术团队
有赞技术团队
T
Threat Research - Cisco Blogs
Scott Helme
Scott Helme
K
Kaspersky official blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Engineering at Meta
Engineering at Meta
S
Schneier on Security
P
Proofpoint News Feed
C
Cyber Attacks, Cyber Crime and Cyber Security
Last Week in AI
Last Week in AI
O
OpenAI News
P
Proofpoint News Feed
V2EX - 技术
V2EX - 技术
Google Online Security Blog
Google Online Security Blog
The Hacker News
The Hacker News
C
Cisco Blogs
V
Vulnerabilities – Threatpost
P
Palo Alto Networks Blog
Security Archives - TechRepublic
Security Archives - TechRepublic
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
P
Privacy & Cybersecurity Law Blog
博客园 - 三生石上(FineUI控件)
C
CXSECURITY Database RSS Feed - CXSecurity.com
Attack and Defense Labs
Attack and Defense Labs
S
Secure Thoughts
S
SegmentFault 最新的问题
M
MIT News - Artificial intelligence
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
S
Security @ Cisco Blogs
宝玉的分享
宝玉的分享
L
LINUX DO - 热门话题
Webroot Blog
Webroot Blog
Project Zero
Project Zero
aimingoo的专栏
aimingoo的专栏
Know Your Adversary
Know Your Adversary
U
Unit 42
Hugging Face - Blog
Hugging Face - Blog
I
Intezer
Recent Commits to openclaw:main
Recent Commits to openclaw:main
T
Troy Hunt's Blog
Google DeepMind News
Google DeepMind News

博客园 - lizhigang

DBeaver 打开 utf8的sql文件 SMT 贴片机与 MES 系统集成指南 Docker 容器间通信故障排查与修复操作总结 Docker 容器部署与运维总结报告 Nginx Docker 容器白名单配置操作总结 使用 pnpm 构建 Vue2 项目操作总结(Node 16 → Node 22) 前端项目 Docker 镜像构建完整操作总结 Windows 11 下使用 MySQL Workbench 还原多数据库备份文件操作指南 在 WSL2 + Docker Desktop 环境下构建前后端 Docker 镜像 从内网私有仓库迁移镜像到阿里云 ACR 完整指南 wsl网络设置允许访问ssh(端口22) 在 Windows 11 上安装 Docker Nginx配置 访问数据库报错 Windows系统运行RuoYi-Vue完整指南 RuoYi-Vue 项目结构分析 win11 报错 windows 11 如何使用 Microsoft Hyper-V VMware 替代产品 IntelliJ IDEA 社区版支持 Spring Boot 开发说明文档 imes开发部署(IDEA社区版 差异) IntelliJ IDEA 社区版默认支持 Spring Boot 吗? imes开发部署 IDEA 端口被占用 解决办法 使用MySQL Workbench进行数据库备份 ruoyi-nbcio ktg-mes、ktm-mes-ui部署 Widows下安装和配置Redis Windows下Redis安装与配置全攻略 mes开源 imes:注意 若依框架:开源
容器访问外部服务(10.100.1.90:9090)防火墙规则配置总结
lizhigang · 2026-05-27 · via 博客园 - lizhigang

https://chat.deepseek.com/share/zunsaivd56nifllp1x

以下是为您生成的一份完整、详细、可直接参考的操作总结,涵盖了从问题现象、排查思路、解决方案到持久化配置的整个流程。您可以将此文档保存为 容器访问外部服务配置记录.md 或类似文件,供后续维护或团队参考。


容器访问外部服务(10.100.1.90:9090)防火墙规则配置总结

1. 问题背景

  • 环境:CentOS Linux 7,使用 Docker 运行多个容器。
  • 现象:宿主机可以 curl 访问 http://10.100.1.90:9090/api/Light/PostTest/ 并正常返回 "你好!",但 Docker 容器(如 docker-backend-1)无法访问该地址。
  • 根本原因
    • 宿主机 iptablesDOCKER-USER 链中存在一条通用 DROP 规则(目标端口包含 9090),丢弃了所有不在 ACCEPT 白名单内的源 IP 的流量。
    • 容器的 IP 地址属于 172.30.0.0/16 网段,而现有的 ACCEPT 规则只放行了其他网段(如 10.204.52.0/2410.66.17.0/24 等),未包含 172.30.0.0/16

2. 排查步骤简述

  1. 确认宿主机访问目标服务正常 → curl 返回 "你好!"
  2. 查看容器 IP 及所属网络子网:
    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
  3. 查看当前 iptables 规则:
    sudo iptables -L DOCKER-USER -n -v --line-numbers
    
    发现第 13 条为 DROP 规则,匹配所有源 IP 访问多个端口(含 9090),且前面没有允许 172.30.0.0/16 的规则。

3. 最终解决方案

3.1 添加允许规则(插入到 DROP 规则之前)

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:允许匹配的流量通过。

3.2 验证规则已生效

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

3.3 测试容器内访问

进入容器并调用 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/"

3.4 规则持久化(防止重启丢失)

适用系统:CentOS 7

  1. 安装 iptables-services(若未安装):

    sudo yum install iptables-services -y
    
  2. 停止并禁用 firewalld(避免冲突,可选但推荐):

    sudo systemctl stop firewalld
    sudo systemctl disable firewalld
    
  3. 保存当前规则到配置文件

    sudo service iptables save
    

    或手动执行:

    sudo iptables-save > /etc/sysconfig/iptables
    
  4. 确保 iptables 服务开机自启

    sudo systemctl enable iptables
    
  5. 验证持久化是否成功(重启后检查):

    sudo systemctl restart iptables
    sudo iptables -L DOCKER-USER -n -v | head -2
    

其他发行版(Ubuntu/Debian)可使用 iptables-persistent,通用方案可创建 systemd 服务,但 CentOS 7 推荐上述 iptables-services 方法。

4. 关键知识点总结

组件 说明
DOCKER-USER Docker 推荐用户自定义规则的位置,该链在 FORWARD 链之前生效,且不受 Docker 服务重启影响。
规则顺序 iptables 按顺序匹配,一旦匹配则不再继续。因此允许规则必须插入到 DROP 规则之前。
容器网段 不同 Docker 网络可能使用不同子网,需根据实际容器 IP 确定 -s 参数。
持久化 iptables-save + 开机加载服务(iptablesnetfilter-persistent)是保证重启不丢失的标准做法。

5. 后续维护建议

  • 新增容器:如果其他容器也需访问同一服务,确保它们位于已允许的网段(172.30.0.0/16)内,或为它们所在网段添加类似规则。
  • 修改规则:每次使用 iptables 命令修改规则后,记得重新执行 sudo service iptables save 更新配置文件。
  • 检查 DROP 规则:若未来需要放行更多端口或地址,注意不要在 DROP 规则之后添加允许规则(必须插在前面)。
  • 日志记录:如需排查被 DROP 的流量,可在 DROP 规则前添加 LOG 规则(需加载 nf_log 模块)。

6. 附录:常用排查命令

# 查看 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+端口的网络连通,并保证重启后规则依然生效。