Socket 转发就是将从一个 socket 连接收到的数据,转发到另一个 socket 连接上去。简单说就是在两个"通道"之间做数据搬运工-2。
常见场景:
本地端口 → 远程服务器(比如访问 localhost:8080 实际连到远程数据库)
Unix 域套接字 → TCP 端口(让只支持网络的程序访问本地 socket 服务)
临时穿透防火墙访问内网服务
如果要做跨机器的网络转发,第一步开启内核 IP 转发:
# 临时开启 echo 1 > /proc/sys/net/ipv4/ip_forward # 永久开启 echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf sysctl -p
本机端口转发(8080 → 80):
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j REDIRECT --to-port 80
跨机器转发(本机 8080 → 192.168.1.100:80):
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80 iptables -t nat -A POSTROUTING -j MASQUERADE iptables -A FORWARD -p tcp --dport 80 -j ACCEPT
优点:内核态处理,性能最好-5
缺点:配置复杂,重启后规则丢失需保存
# TCP 端口转发:监听 8080 → 转发到 192.168.1.100:80 socat TCP-LISTEN:8080,fork TCP:192.168.1.100:80 # Unix socket → TCP(把本地 socket 暴露成网络端口) socat TCP-LISTEN:8080,fork UNIX-CONNECT:/tmp/myapp.sock # TCP → Unix socket socat UNIX-LISTEN:/tmp/proxy.sock,fork TCP:192.168.1.100:80
优点:什么都能转,Linux 工程师必备-6
缺点:后台管理需要配合 systemd 或 nohup
适合集成到 systemd 管理的服务中,支持 socket activation-1-7。
创建服务文件 /etc/systemd/system/proxy-to-nginx.service:
[Unit] Requires=nginx.service After=nginx.service [Service] Type=notify ExecStart=/usr/lib/systemd/systemd-socket-proxyd 127.0.0.1:8080
优点:systemd 生态无缝集成,事件驱动,高并发
缺点:需要写 systemd 配置文件
# 本地转发:本地 8080 → 远程服务器 80(通过 SSH 加密隧道) ssh -L 8080:localhost:80 user@remote-server # 远程转发:远程服务器 8080 → 本地 80(穿透防火墙) ssh -R 8080:localhost:80 user@remote-server
优点:流量加密,适合临时安全访问-5
缺点:依赖 SSH 连接,断开就失效
stream { upstream backend { server 192.168.1.100:80; } server { listen 8080; proxy_pass backend; } }
优点:支持负载均衡、SSL termination
缺点:配置相对重量级
| 工具 | 适用场景 | 性能 | 复杂度 |
|---|---|---|---|
| iptables | 高性能内核转发、NAT 网关 | 最高 | 中等 |
| socat | 灵活调试、Unix socket 转换 | 较高 | 低 |
| systemd-socket-proxyd | systemd 环境生产部署 | 高 | 中等 |
| SSH 隧道 | 临时安全穿透 | 中等 | 低 |
| Nginx stream | 企业级负载均衡 | 高 | 较高 |
除了上述传统工具,80km无痕网关(曾用名:80KM端口流量转发程序) 是一款现代化的 TCP 流量转发工具,配置简单、热加载、自带监控。
| 特性 | 传统方案 | 80km无痕网关 |
|---|---|---|
| 配置方式 | 命令行/配置文件 | 简洁 JSON |
| 规则生效 | 重启服务 | 热加载,无需重启 |
| 运行状态 | 命令行查看 | Web 界面实时监控 |
| 学习成本 | 中高 | 极低 |
创建 forwarder.json:
{ "listen": "0.0.0.0:8080", "routers": [ {"from": "0.0.0.0/0", "to": "192.168.1.100:80"}, {"from": "10.0.0.0/8", "to": "192.168.1.101:22"} ] }
启动:
80km-forwarder -config forwarder.json
搞定。不需要记 iptables 语法,不需要写 systemd 单元文件,一个配置文件解决。
一句话总结:临时调试用 socat,加密穿透用 SSH,生产高性能用 iptables 或 systemd-socket-proxyd。想要简单省心、配置热加载、带监控面板?试试 80km无痕网关。