TCP转发(TCP Forwarding)

admin2026-02-22 18:15:564854

📌 什么是 TCP 转发定义:TCP 转发就是把一个机器上的某个 TCP 端口收到的流量,中间件或系统内核直接转发到另一台机器的某个 TCP 端口。对于访问者来说,就像直接连到了目标机器。

本文需求背景代码语言:javascript复制↓ 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 -> 目标地址映射。优点:性能高、不需要额外进程。代码语言:javascript复制# 开启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 MASQUERADE2. 基于中间进程的TCP代理socat / ncat / rinetd

在 10.10.10.200 起一个服务进程监听端口,把数据流转到 10.10.10.100。优点:简单,命令就能跑;缺点:有额外进程消耗。代码语言:javascript复制socat TCP-LISTEN:3306,fork TCP:10.10.10.100:33063. 应用层转发(程序实现)用 Node.js / Python / Go 等写一个小程序,读取 TCP 流再发到另一台机器。优点:可以加额外功能(如加密、认证、日志)。缺点:开发成本高,性能不一定比内核转发好。4. SSH 隧道特殊的 TCP 转发,通过 SSH 协议桥接。代码语言:javascript复制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 重启后 就失效。

代码语言:javascript复制#!/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 代理(更简单)代码语言:javascript复制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 这台机器:

代码语言:javascript复制ssh -L 3306:10.10.10.100:3306 user@10.10.10.200这样,本地 3306 会被映射到 100 的 MySQL,你本地命令:

bash

代码语言:javascript复制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转发:

Nginx TCP/UDP转发 配置 –with-stream

特殊说明:

上述文章均是作者实际操作后产出。烦请各位,请勿直接盗用!转载记得标注原文链接:www.zanglikun.com

第三方平台不会及时更新本文最新内容。如果发现本文资料不全,可访问本人的Java博客搜索:标题关键字。以获取最新全部资料 ❤

免责声明:

本站文章旨在总结学习互联网技术过程中的经验与见解。任何人不得将其用于违法或违规活动!所有违规内容均由个人自行承担,与作者无关。