透明 TCP 代理-重定向
你现在的目标是:
# 🎯 目标说明
在主机 A(192.168.2.53) 上,有一个应用发起 TCP 请求到:
目标地址:115.236.18.198:11111(公网 IP,其实已经不可用)
1
你想让:
- 这个请求实际上被透明地重定向到内网主机 C(192.168.2.10)
- C 能够完整接收到请求,正常建立 TCP 连接,并响应
# ✅ 实现方式:使用 iptables
+ 内核转发 + NAT
这是一个典型的 透明 TCP 代理/重定向 场景,使用 iptables
做 DNAT(目的地址转换),将请求从公网 IP 转发到内网 IP。
# 🛠️ 操作步骤(在主机 A 上执行)
# 1️⃣ 开启内核 IP 转发
sudo sysctl -w net.ipv4.ip_forward=1
1
临时生效。想永久生效,编辑
/etc/sysctl.conf
加入:net.ipv4.ip_forward = 1
1
# 2️⃣ 添加 DNAT 转发规则(将请求 115.236.18.198 转到 C)
sudo iptables -t nat -A OUTPUT -p tcp -d 115.236.18.198 --dport 11111 -j DNAT --to-destination 192.168.2.10:11111
1
说明:
OUTPUT
链适用于本机发出的连接(你的应用就在 A 上)- 所有目标为公网 IP
115.236.18.198
的请求将被改写为192.168.2.10
# 3️⃣ 设置 SNAT(可选,一般不需要)
如果你发现 C 无法正常响应请求,可添加这条 SNAT(伪装源 IP 为 A):
sudo iptables -t nat -A POSTROUTING -p tcp -d 192.168.2.10 --dport 11111 -j MASQUERADE
1
# ✅ 整体流程说明:
步骤 | 数据包 | 说明 |
---|---|---|
应用发起连接 | 源:192.168.2.53 目标:115.236.18.198:11111 | 应用仍然以为在访问公网 |
iptables(OUTPUT 链)重写 | 修改目标地址 → 192.168.2.10 | 实际连接转向 C |
建立连接 | A ↔ C 完成三次握手 | |
C 回复响应 | 源地址为 C,目标仍是 A | |
应用收到响应 | 应用以为来自公网 IP,但其实是 C |
# 🧪 测试建议
- 在 C 上运行监听服务:
nc -l 11111
1
- 在 A 上用你原本的程序发起请求,或使用:
telnet 115.236.18.198 11111
# 或
curl http://115.236.18.198:11111
1
2
3
2
3
- C 上应该能看到连接建立。
# 🔁 如果想让其他主机的请求也被转发怎么办?
你需要改用:
iptables -t nat -A PREROUTING -p tcp -d 115.236.18.198 --dport 11111 -j DNAT --to-destination 192.168.2.10:11111
1
但这要求:
- A 是这些主机的网关
- 或者你将这些主机的流量强制经过 A(静态路由或网桥)
# ✅ 总结方案(你的场景)
在主机 A 上执行以下命令即可:
# 1. 启用 IP 转发
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
# 2. NAT 规则 - 本地应用发出的请求
sudo iptables -t nat -A OUTPUT -p tcp -d 115.236.18.198 --dport 11111 -j DNAT --to-destination 192.168.2.10:11111
1
2
3
4
5
2
3
4
5
这会让本机所有访问 115.236.18.198:11111
的 TCP 请求都发给 192.168.2.10:11111
,完全透明。
编辑 (opens new window)
上次更新: 2025/06/10, 09:18:05