之前我介绍过 otunnel,它可以建立一个 TCP 隧道,穿透 NAT 将本机的端口映射到远程主机上。这样一来,就可以通过有公网 IP 的主机(或 VPS)来访问 NAT 下主机上的服务。今天,这里再介绍一种方法,只需要利用服务器上自带的 SSH 即可。
适用情景
本机没有公网 IP,但你拥有一台有公网 IP 的主机或 VPS。你可以把本地服务的端口映射到 VPS 上的指定端口,这样访问 VPS 的指定端口,相当于访问了本机上的端口。
本文的封面图直观地说明了这一情景:

“连接 远程 端口 80 = 本地端口 80”
服务器端 SSH 的配置
在服务器上执行:
echo "GatewayPorts yes" >> /etc/ssh/sshd_config
echo "AllowTcpForwarding yes" >> /etc/ssh/sshd_config
systemctl restart sshd
第一行代码,可以让 sshd 把端口转发至远程主机的 0.0.0.0 上。如果不加这一行,sshd 只会把端口转发至远程主机的 127.0.0.1 上,公网无法访问转发后的端口。
第二行代码,会启用 sshd 的 TCP 转发。
第三行代码用来重启 sshd。
客户端连接
Linux / macOS 执行:
ssh -fNTRC rport:127.0.0.1:lport user@hostname -p ssh_port
其中:
- rport:要转发到的远程端口
- lport:被转发的本机端口
- user:SSH 用户名
- hostname:远程主机名 / IP
- ssh_port:SSH 端口
Windows 用户需要先下载 PuTTY 套件中的 plink.exe。(putty.exe 或许有图形化的操作,不过我没有了解) 然后执行:
plink.exe -ssh -R rport:127.0.0.1:loprt -C -T -N user@hostname -P ssh_port
其中:
- rport:要转发到的远程端口
- lport:被转发的本机端口
- user:SSH 用户名
- hostname:远程主机名 / IP
- ssh_port:SSH 端口
至此,端口转发已完成。
“端口转发 + 内网穿透?用 SSH 就够了!”上的4条回复
此文帮助了解了GatewayPorts的用处 谢谢
看上去不错,恰好我也有这个需求
最近事情多。要是不忙了,我可以写一个小工具来自动化端口映射。
有写到嘛?能分享一下吗?