📌 什么是 TCP 转发
定义:TCP 转发就是把一个机器上的某个 TCP 端口收到的流量,中间件或系统内核直接转发到另一台机器的某个 TCP 端口。对于访问者来说,就像直接连到了目标机器。
本文需求背景
↓ TCP 50101 (用户:张三)
10.10.10.201 (可直连 10.10.10.200)
↓ TCP 3306 (MySQL)
10.10.10.200 (转发代理)
↓ TCP 3306
10.10.10.100 (真实 MySQL 服务)
10.10.10.200 对客户端(用户:张三)来说,就是一个“跳板”或“代理”,把所有发到它端口的 TCP 数据,原封不动转到 10.10.10.100:3306。
🔹 常见的 TCP 转发实现方式
1. 基于系统内核的透明转发
- iptables / nftables
用 Linux 内核的 NAT 表做 DNAT -> 目标地址映射。 - 优点:性能高、不需要额外进程。
# 开启IP转发
sudo sysctl -w net.ipv4.ip_forward=1
# 把200端口的3306流量转到100
## 入站
sudo iptables -t nat -A PREROUTING -p tcp --dport 3306 -j DNAT --to-destination 10.10.10.100:3306
## 出站
sudo iptables -t nat -A POSTROUTING -p tcp -d 10.10.10.100 --dport 3306 -j MASQUERADE
# 1. 开启内核 IP 转发(仅需执行一次)
sudo sysctl -w net.ipv4.ip_forward=1
先约定一些信息!!!
宿主机(网关)的外网端口 = SRC_PORT
宿主机的外网 IP = SRC_IP(可省略,iptables可直接匹配端口)
目标内网服务器 IP = DST_IP
目标内网服务端口 = DST_PORT
# 2. DNAT:外部访问宿主机,占位符可自定义
sudo iptables -t nat -A PREROUTING -p tcp --dport <SRC_PORT> \
-j DNAT --to-destination <DST_IP>:<DST_PORT>
# 3. MASQUERADE:源地址伪装,保证回包路径正确
sudo iptables -t nat -A POSTROUTING -p tcp -d <DST_IP> --dport <DST_PORT> \
-j MASQUERADE
规则太复杂了,在线html帮我们一键生成
规则有入站,有出站的。太复杂了。下面可输入表单,生成TCP转发 开启与删除命令!
iptables NAT 映射命令生成器(添加 / 删除 / 高级选项) iptables NAT 映射命令生成器 添加 / 删除 / 高级选项用于快速生成端口转发规则(端口映射):宿主机端口 → 内网 IP:端口, 支持 TCP/UDP、删除规则、一键复制等功能。映射规则配置填写参数后,可一键生成「添加」或「删除」规则。在线生成 · 不会直接修改你的系统使用说明 & 常用命令1. 生成规则的基本思路
本工具主要帮你生成
iptables -t nat的端口映射规则,核心命令包括:
PREROUTING + DNAT:将访问宿主机端口的流量转发到内网 IP:端口。POSTROUTING + MASQUERADE:进行源地址伪装,保证回包能正确返回。2. 常用查看 / 保存命令
- 查看 NAT 表规则:
sudo iptables -t nat -vnL --line-numbers- 保存当前规则(不同系统命令可能不同):
sudo iptables-save > /etc/iptables.rules- 恢复规则:
sudo iptables-restore < /etc/iptables.rules3. 安全 & 排错建议
建议:
- 务必先在测试环境验证规则是否符合预期。
- 对外暴露数据库端口时,务必配合防火墙 + 账号密码 + 白名单。
- 可以给每条规则加上清晰的备注,后面方便回溯。
注意:
- 错误的 NAT 规则可能导致服务不可访问或暴露敏感服务。
- 在远程 SSH 场景下操作防火墙,请小心避免把自己“锁在门外”。
2. 基于中间进程的TCP代理
- socat / ncat / rinetd
在 10.10.10.200 起一个服务进程监听端口,把数据流转到 10.10.10.100。 - 优点:简单,命令就能跑;缺点:有额外进程消耗。
socat TCP-LISTEN:3306,fork TCP:10.10.10.100:3306
3. 应用层转发(程序实现)
- 用 Node.js / Python / Go 等写一个小程序,读取 TCP 流再发到另一台机器。
- 优点:可以加额外功能(如加密、认证、日志)。
- 缺点:开发成本高,性能不一定比内核转发好。
4. SSH 隧道
- 特殊的 TCP 转发,通过 SSH 协议桥接。
ssh -L 3306:10.10.10.100:3306 user@10.10.10.200
✅ 方案总结
你的需求就是 在中间机实现 TCP 转发,技术方案可以这样选:
- 长期且高性能 → iptables / nftables 透明转发
- 快速测试 → socat / ncat 一行命令!
- 临时安全访问 → SSH 隧道
演示Demo
一键 TCP 转发脚本(iptables NAT)
需root权限,修改内核开启IP转发
注意iptables 重启后 就失效。
#!/bin/bash
# 开启内核 IP 转发
echo "开启 IP 转发..."
sudo sysctl -w net.ipv4.ip_forward=1
# 目标 IP & 端口
TARGET_IP="10.10.10.100"
TARGET_PORT="3306"
LISTEN_PORT="3306"
echo "配置 iptables 转发规则: 监听 ${LISTEN_PORT} -> ${TARGET_IP}:${TARGET_PORT}"
sudo iptables -t nat -A PREROUTING -p tcp --dport ${LISTEN_PORT} -j DNAT --to-destination ${TARGET_IP}:${TARGET_PORT}
sudo iptables -t nat -A POSTROUTING -p tcp -d ${TARGET_IP} --dport ${TARGET_PORT} -j MASQUERADE
echo "转发配置完成!"
# echo "现在客户端可以连接: mysql -h 10.10.10.200 -P 3306 -u 用户名 -p"
用 socat 起一个 TCP 代理(更简单)
sudo yum install socat # 或 apt install socat
# 启动代理:监听本机 3306,转发到 10.10.10.100:3306
socat TCP-LISTEN:3306,fork TCP:10.10.10.100:3306
🔹 SSH 隧道示例
如果你的客户端可以 SSH 到 200 这台机器:
ssh -L 3306:10.10.10.100:3306 user@10.10.10.200
这样,本地 3306 会被映射到 100 的 MySQL,你本地命令:
bash
mysql -h 127.0.0.1 -P 3306 -u 用户名 -p
注意事项:
- 无论哪种方法,记得:
- MySQL 用户权限 的 host 要允许来自 10.10.10.200(或客户端 IP)
- 防火墙放行 3306 端口
- 检查网络连通性(ping / telnet 10.10.10.100 3306)
实际上NG也支持TCP/UDP转发:
特殊说明:
上述文章均是作者实际操作后产出。烦请各位,请勿直接盗用!转载记得标注原文链接:www.zanglikun.com
第三方平台不会及时更新本文最新内容。如果发现本文资料不全,可访问本人的Java博客搜索:标题关键字。以获取最新全部资料 ❤
免责声明: 本站文章旨在总结学习互联网技术过程中的经验与见解。任何人不得将其用于违法或违规活动!所有违规内容均由个人自行承担,与作者无关。
第三方平台不会及时更新本文最新内容。如果发现本文资料不全,可访问本人的Java博客搜索:标题关键字。以获取最新全部资料 ❤
免责声明: 本站文章旨在总结学习互联网技术过程中的经验与见解。任何人不得将其用于违法或违规活动!所有违规内容均由个人自行承担,与作者无关。
