yan's blog

SSH 端口转发

SSH 不仅仅是远程登录服务器的工具,它还有很多强大的功能,端口转发就是其中之一。

温馨提示:如果你需要长期稳定地进行端口转发,还是推荐使用 frp、ngrok 这类更专业的工具。

场景一:将内网服务暴露到公网

假设你在家里的电脑 A(没有公网 IP)上搭了个网站或者服务,想让朋友们也能访问。

前提:

你需要一台有公网 IP 的服务器 B,比如 IP 地址是 123.123.123.123。为了方便和安全,强烈建议你在这台服务器上配置好 SSH 密钥登录,这样就不用每次都输密码了。

操作方法

在你的电脑 A 上执行这条命令:

ssh -R 8888:localhost:9999 [email protected]

这条命令的意思是:把对 B 服务器的 8888 端口的请求通过SSH通道转发到 A 电脑的 9999 端口,这样我们就可以通过公网的服务器B来访问内网的服务了。

注意事项

  1. 确保 B 服务器的 8888 端口在防火墙中是开放的。
  2. 由于以上命令只会让 B 服务器监听 127.0.0.1:8888,所以外部无法直接访问 B 服务器的 8888 端口。如果想让外部也能访问,需要修改 B 服务器的 /etc/ssh/sshd_config 文件,将 GatewayPorts no 改为 GatewayPorts yes
  3. 如果你想让这个连接在后台持续运行,可以加上 -fN 参数,通常加上 -N 就可以了。

场景二:通过中转服务器访问内网服务

假设公司内网的某台服务器 C(IP:192.168.1.3)上有个服务只对本机开放,导致我们无法直接访问。此时,我们可以借助中间的服务器 B 来实现访问。

前提:

  • 你有权限 SSH 登录服务器 B。
  • 服务器 B 可以访问服务器 C。

操作方法

服务器 B 上执行以下命令:

ssh -L 8888:localhost:9999 [email protected]

执行完毕后,你就可以通过访问 B 服务器的 8888 端口来间接访问 C 服务器的 9999 端口了。

注意事项

  1. 确保 B 服务器的 8888 端口没有被防火墙阻塞。
  2. 如果希望在后台运行此命令,可以使用 -fN 参数。
  3. 这个时候不只是 B 主机局域网内的其他机器可以访问 C 主机的 9999 端口,B 主机也可以通过访问 127.0.0.1:8888 来访问 C 主机的 9999 端口。