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

推荐订阅源

Jina AI
Jina AI
V
Visual Studio Blog
博客园 - 司徒正美
TaoSecurity Blog
TaoSecurity Blog
博客园 - 聂微东
IT之家
IT之家
博客园_首页
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
C
Cyber Attacks, Cyber Crime and Cyber Security
博客园 - Franky
雷峰网
雷峰网
罗磊的独立博客
S
Schneier on Security
C
Cybersecurity and Infrastructure Security Agency CISA
The Cloudflare Blog
T
Tailwind CSS Blog
B
Blog RSS Feed
H
Help Net Security
T
The Blog of Author Tim Ferriss
C
CXSECURITY Database RSS Feed - CXSecurity.com
T
Threatpost
C
CERT Recently Published Vulnerability Notes
博客园 - 三生石上(FineUI控件)
P
Palo Alto Networks Blog
I
Intezer
G
GRAHAM CLULEY
Engineering at Meta
Engineering at Meta
S
Securelist
J
Java Code Geeks
V
V2EX
Y
Y Combinator Blog
Simon Willison's Weblog
Simon Willison's Weblog
L
LINUX DO - 热门话题
云风的 BLOG
云风的 BLOG
Spread Privacy
Spread Privacy
MongoDB | Blog
MongoDB | Blog
P
Privacy International News Feed
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
B
Blog
Forbes - Security
Forbes - Security
Google Online Security Blog
Google Online Security Blog
Help Net Security
Help Net Security
S
SegmentFault 最新的问题
N
Netflix TechBlog - Medium
Webroot Blog
Webroot Blog
Microsoft Security Blog
Microsoft Security Blog
SecWiki News
SecWiki News
Scott Helme
Scott Helme
aimingoo的专栏
aimingoo的专栏
N
News and Events Feed by Topic

杂烩饭

彻底删除CCLibrary 在 Nginx 中禁止 IP 直连与域名暴露 使用 RustFS 自建对象存储 使用cURL命令管理对象存储(s3) AGENTS.md Prometheus使用kubeconfig做k8s的service 自动发现监控 定制Windows系统镜像iso 使用create-dmg工具制作dmg安装包 使用create-dmg工具制作dmg安装包 - 技术栈 superpowers Nexus仓库搭建记录 Git Merge代码冲突的解决方式 在 Linux 系统中安装与配置 OpenVPN:从入门到精通 使用 Easytier-web 管理 easytier 节点 ingress-nginx 去除指定context path 在macOS上使用MusicPlayer2听本地音乐 Kubernetes 1.34 + RHEL10 + Cilium + kube-vip 高可用集群部署 使用腾讯云CLS收集TKE(k8s)业务日志 容器调试工具之BusyBox 无Docker环境进行容器镜像操作 使用kubeadm部署一套高可用k8s集群1.34 for Ubuntu 轻量级组网工具WireGuard 在Kubernetes中部署一个单节点Elasticsearch 使用openssl制作自签名双向认证(mTLS)证书 minio自建对象存储 ingress-nginx 使用自定义的nginx配置 P12格式证书与PEM格式转换 使用blackbox-exporter做域名监控 记一次MySQL字符集转换导致的故障 使用双向认证增加git仓库安全性 Prometheus自动监控K8S集群中的service Grafana 查询SQL 自定义变量 使用selenium来实现Grafana的自动截图
正在运行的Docker容器增加端口映射
张理坤 · 2025-09-27 · via 杂烩饭

为什么有这个需求

假设有如下情况:

  1. 这个服务很重要,很多服务在连,停服不知道会有什么影响。
  2. 服务是运行在 docker 里的,但是 docker 启动命令找不到了。
  3. 想给 docker 容器临时增加一个端口映射。

方法一、使用工具反向代理

这个方法性能不如上面的 iptables 规则,比如可以用 nginxstream 四层代理,或者用 socat 一条命令搞定。

查看容器的 IP 地址

1
docker inspect postgres

在结果中找到 NetworkSettings -> Networks -> <你的网络名称> -> IPAddress

1
2
3
4
5
6

sudo apt-get install socat


socat TCP-LISTEN:5432,fork TCP:172.18.0.2:5432

docker 的 -p 命令来进行端口映射,本质上也是维护了一套 iptables 规则来实现的,docker-proxy 会维护 docker 需要的 iptables 规则,执行 iptables-save 可以查看所有的规则 (iptables-save 并不会真的 save,想保存 iptables 规则还需要额外的操作)。

获取容器的 IP 地址

1
docker inspect postgres

在结果中找到 NetworkSettings -> Networks -> <你的网络名称> -> IPAddress

查看 docker 的虚拟网卡

docker 的一个 bridge 网卡就对应了 linux 机器上的一个网卡,要新增端口映射,需要知道你的容器连接的虚拟网卡是什么。

比如我想让 Postgres 的 5432 端口映射到外网,先查看 Postgres 的容器信息。

1
docker inspect postgres

在结果中找到 NetworkSettings -> Networks -> <你的网络名称> -> Gateway ,记录一下网关的 IP

1
ip addr

image.png|511

可以知道网卡的名称是 br-342eceae259f

配置 iptables 规则

比如我的容器 IP:172.18.0.2
Docker 虚拟网卡:br-342eceae259f
要映射的端口:5432

1
2
iptables -A DOCKER-USER -o br-342eceae259f ! -i br-342eceae259f -d 172.18.0.2/32 -m tcp -p tcp --dport 5432 -j ACCEPT
iptables -t nat -A DOCKER ! -i br-342eceae259f -p tcp -m tcp --dport 5432 -j DNAT --to-destination 172.18.0.2:5432

不需要做 SNAT,因为 Docker 默认已经做了 SNAT 了。
image.png|705

方法三、传统的 iptables 规则

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/bash

IP=10.0.0.21
PORT=8000
CONTAINER_IP=172.17.0.2
CONTAINER_PORT=80


iptables -t nat -A PREROUTING -4 -p tcp -d ${IP} --dport ${PORT} -j DNAT --to-destination ${CONTAINER_IP}:${CONTAINER_PORT}


iptables -t nat -A OUTPUT -4 -p tcp -d ${IP} --dport ${PORT} -j DNAT --to-destination ${CONTAINER_IP}:${CONTAINER_PORT}


iptables -I FORWARD -p tcp -d ${CONTAINER_IP} --dport ${CONTAINER_PORT} -j ACCEPT
iptables -I FORWARD -p tcp -s ${CONTAINER_IP} --sport ${CONTAINER_PORT} -j ACCEPT


iptables -t nat -A POSTROUTING -4 -p tcp -d ${CONTAINER_IP} --dport ${CONTAINER_PORT} -j SNAT --to-source ${IP}

如果规则不加,或加在了 DOCKER-USER 的下面,会兜兜转转,最后匹配到了 DROP

image.png|534

知道了原理后,那么还有一种方法:删除这个 DROP(不要这么做)

1

版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 杂烩饭