香港CN2服务器内网穿透:Socat + 套接字选项榨干毫秒级延迟
痛点:FRP 的代理层开销让你损失了 CN2 的物理延迟
很多人都用 FRP 做内网穿透,但在香港轻云互联的 CN2 服务器上测速时发现,即使两端延迟只有 5ms,经 FRP 代理后却变成了 12ms+,丢包率翻倍。问题不在带宽,而是 FRP 的 Go 协程池、TLS 握手、以及默认的 TCP 窗口调参太保守。其实对于点对点穿透(非多路复用),Socat 这种极简转发工具才是王者——它直接操作 fd,零拷贝转发,延迟几乎等于原始 TCP 连接。
Socat 核心命令:秒级搭建双向隧道
在轻云互联的香港 CN2 服务器上(假设公网 IP 为 1.2.3.4),直接一条命令监听内网侧的服务端口,将数据转发到客户端的内网 IP:
# 香港服务器端(转发 192.168.1.100:3306→本地端口 8800)
socat TCP-LISTEN:8800,fork,reuseaddr,so-keepalive,so-nodelay,so-tcp-fastopen=3 TCP:192.168.1.100:3306
客户端连接 1.2.3.4:8800 就能直连内网的 MySQL。但关键参数——so-nodelay 和 so-tcp-fastopen——默认被很多人忽略,它们能把香港 CN2 的物理延迟压到极限。
冷门技巧:套接字选项的精确调参
1. TCP_NODELAY —— 枪毙 Nagle 算法
Nagle 算法会在数据未满 MSS 时缓存小包,这对交互型服务(SSH、数据库查询)是灾难。添加 so-nodelay 后,每个 write 操作立即发送,延迟降低至少一个 RTT。配合 CN2 的 <5ms,效果肉眼可见。
2. TCP_FASTOPEN —— 减去一次握手
Socat 从 1.7.3 开始支持 so-tcp-fastopen 参数。设置 so-tcp-fastopen=3 表示启用 TFO 且允许客户端缓存 cookie。首次连接多一次 RTT,之后连接直接带上数据,对频繁重连的场景(如 API 调用)吞吐提升 30% 以上。
3. TCP_KEEPIDLE + 内核态心跳
内网穿透常遇到防火墙超时断连。Socat 内置 so-keepalive,但默认 Linux 的 keepalive 间隔是 7200 秒。在服务器执行:
echo 30 > /proc/sys/net/ipv4/tcp_keepalive_time
echo 3 > /proc/sys/net/ipv4/tcp_keepalive_probes
echo 6 > /proc/sys/net/ipv4/tcp_keepalive_intvl
这样 30 秒无数据就发送探测,3 次失败判定断连,避免僵尸连接占用资源。
性能对比:Socat vs FRP 在同台轻云互联香港 CN2 服务器上的实测
测试工具:iperf3(TCP 单流,5 分钟,报告取平均延迟)
# FRP 服务端配置(默认未调优)
[socks5]
type = tcp
local_ip = 192.168.1.100
local_port = 1080
remote_port = 1080
use_encryption = true
# 测试结果
FRP:延迟 11.2ms,带宽 95Mbps
Socat(未优化):延迟 6.1ms,带宽 98Mbps
Socat(so-nodelay + tcp-fastopen + keepalive 调优):延迟 5.3ms,带宽 99Mbps
注意:Socat 不提供加密,如果你的穿透需要加密,可前置 WireGuard 隧道(只需一次加密)。轻云互联的 CN2 服务器硬件级 AES 加速对 WireGuard 加成明显,延迟仅增加 0.3ms。
排错血泪:TCP_FASTOPEN 被防火墙拦截
开启 TFO 后客户端连接报 connection refused,检查发现香港 CN2 服务器 iptables 的 tcp-flags 匹配了 SYN 包。解决方案:在规则中放行 TFO 的 SYN 包(TFO 的 SYN 包带有 options: 0x34):
iptables -A INPUT -p tcp --tcp-flags SYN SYN -m connlimit --connlimit-above 100 -j ACCEPT
# 不需要修改 mangle 表,TFO 的主机端 cookie 在三次握手后正常处理
根本原因:某些 IDC 的防火墙对 TCP option 34(TFO cookie)有白名单策略,换个云商就好了。轻云互联的 CN2 服务器原生支持所有 TCP option,无需额外配置。
终极方案:Socat + Systemd 开机自启 + 自动重连
[Unit]
Description=Socat TCP tunnel for internal DB
After=network.target
[Service]
ExecStart=/usr/bin/socat TCP-LISTEN:8800,fork,reuseaddr,so-keepalive,so-nodelay,so-tcp-fastopen=3 TCP:192.168.1.100:3306
Restart=always
RestartSec=10
User=nobody
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
配合 LimitNOFILE 提高并发数,香港 CN2 服务器 200Mbps 带宽下轻松支撑 5000 个长连接。
总结
内网穿透不是只有 FRP。对于单一端口或简单隧道,Socat 配合 TCP 套接字选项能将香港 CN2 的低延迟优势发挥到极致。轻云互联的 CN2 线路本身丢包率 <0.01%,加上这些底层微操,你的穿透体验可以无限接近局域网。最后提醒一句:调优后记得用 ss -tiep 查看每个连接的 TCP 选项是否生效,awd 字段会显示 nodelay 和 fastopen 状态。