透明 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 = 11
# 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