linux内网穿透工具

用 SSH 做内网穿透,网穿五分钟能跑通,透工但很多人第一步就卡在“-R”和“-L”到底谁连谁。网穿我干脆把最常用的透工几个工具拎出来,按实际踩坑顺序讲一遍。网穿

先明确场景:你有一台公网 VPS,透工家里或公司有台 Linux 机器在 NAT 后面,网穿没有公网 IP,透工但你想从外面 SSH 进去。网穿这就是透工最典型的需求。别急着上 frp、网穿nps 这些,透工OpenSSH 自带的网穿端口转发就能干,而且不用装任何额外软件。透工

命令长这样:

ssh -N -R 2222:localhost:22 user@vps_ip

在内网机器上执行。网穿意思是:把 VPS 的 2222 端口映射到本地的 22 端口。-N 表示不执行远程命令,只做转发。跑起来后,你在任何地方 ssh -p 2222 user@vps_ip 就能连回内网那台机器。

但这里有个坑:默认情况下,VPS 上的 sshd 只监听 127.0.0.1 的 2222,外部连不上。得改 /etc/ssh/sshd_config,加上 GatewayPorts yes,然后重启 sshd。不然你只能从 VPS 本机自己连自己,白折腾。

另一个坑是连接不稳定。SSH 隧道断了不会自动重连。我的做法是写个 systemd service,配合 autossh。autossh 就是专门干这个的,它定期发心跳包,断了就重连。安装很简单,Debian/Ubuntu 下 apt install autossh,然后:

autossh -M 0 -N -R 2222:localhost:22 user@vps_ip

-M 0 表示不用它自带的监控端口,靠 SSH 自己的 ServerAliveInterval 来保活。再配上 -o ServerAliveInterval=30 -o ServerAliveCountMax=3,基本能稳定跑几个月。

SSH 隧道适合临时用、机器少的情况。如果你有十几台内网机器要映射,或者需要 HTTP 穿透、多协议支持,那还是得上 frp。

frp 的架构分 frps(服务端,跑在 VPS)和 frpc(客户端,跑在内网)。配置文件比 SSH 命令直观得多。frps.ini 里写个 bind_port = 7000,frpc.ini 里指定 server_addr 和 server_port,然后加一段:

[ssh] type = tcp local_ip = 127.0.0.1 local_port = 22 remote_port = 2222

跑起来后效果和 SSH 隧道一样,但 frp 支持断线重连、多路复用、加密压缩,还能在 dashboard 里看连接状态。VPS 上开个 dashboard_port = 7500,浏览器里就能看到哪些隧道在线。

frp 的坑主要在版本兼容。frps 和 frpc 版本号必须一致,差一个小版本都可能连不上。我有次 VPS 上装了 0.52,内网机器上还是 0.44,日志里报 protocol error,查了半天才发现是版本问题。所以部署时最好固定版本,别用 latest。

还有个小众但好用的工具叫 rathole,Rust 写的,配置比 frp 更简洁,资源占用也低。不过生态没 frp 成熟,文档少,遇到问题得自己翻 issue。如果你追求轻量、不介意折腾,可以试试。

再说一个实际观察:很多人内网穿透只做 TCP,忘了 UDP。比如 WireGuard 走 UDP,SSH 隧道和 frp 默认都不支持 UDP 转发。frp 从 0.52 开始支持 type = udp,但需要服务端和客户端都开 udp_packet_size。SSH 隧道干脆就不支持 UDP,所以别拿它来穿 WireGuard。

最后提一句安全。不管用哪种工具,别把内网 SSH 直接暴露到公网端口上还开着密码登录。我的做法是:VPS 上只开密钥登录,frp 的 remote_port 用高位随机端口,再配合 allow_ports 限制范围。SSH 隧道那边,GatewayPorts 设成 clientspecified 而不是 yes,这样只有客户端明确指定绑定地址时才对外监听。

工具选哪个,取决于你要穿几台机器、跑什么协议、能接受多少配置复杂度。一台机器临时用,autossh 足够;多台机器长期跑,frp 更省心。别为了“先进”去选 rathole,除非你确实需要它的轻量特性。