使用SSH进行端口转发

发布于 2024-01-21  443 次阅读


经常需要在自己的电脑访问服务器的某些服务,又懒得调整服务器的防火墙,害怕出现安全隐患。最佳的解决方案就是端口转发。端口转发也有很多现成方案比如frp,nps。但是每台服务器都安装太过于麻烦,其实OpenSSH就自带端口转发功能。对比其他方案,无需安装其他额外软件即可转发流量,还能让转发的流量享受SSH隧道的高强度加密,是一个比较好的方案。

角色定义

为了防止我自己混淆定义,我就不说什么host,remote了,怕自己搞混。预先定义如下两个角色:

本机:运行这个ssh指令的机器。

服务器:ssh要连接到的那台机器。

正向代理

描述

参数内容
-L本机地址1:本机端口:服务器地址:服务器端口

在本机监听端口,将服务器的某个端口上的服务映射到本机的某个端口,直接访问本机的某个端口就像直接访问服务器的某个服务一样。

例子

ssh -L 127.0.0.1:1234:127.0.0.1:4567

访问本机的1234端口即可访问服务器的4567端口上的服务,但是只在本机的127.0.0.1地址上监听端口,其他用户无法通过本机访问服务器的端口。

ssh -L 0.0.0.0:1234:127.0.0.1:4567

任何用户都可以通过本机的1234端口访问服务器的4567端口上的服务。

ssh -L 127.0.0.1:1234:192.168.7.21:4567

访问本机1234端口,服务器将代理访问位于192.168.7.21:4567上的服务。

反向代理

描述

参数内容
-R本机地址2:本机端口:服务器地址:服务器端口

在服务器上监听端口,访问服务器的某个端口就如同访问本机的某个端口上的服务一样。

例子

ssh -R 127.0.0.1:1234:127.0.0.1:4567

服务器访问自己的4567端口可以访问本机的1234端口上的服务,但是只在服务端的127.0.0.1地址上监听端口,其他用户无法通过服务器访问本机端口。

ssh -R 127.0.0.1:1234:0.0.0.0:4567

任何用户都可以通过服务器的4567端口访问本机的1234端口上的服务。

ssh -R 192.168.7.21:1234:0.0.0.0:4567

访问服务器的4567端口,本机将代理访问位于192.168.7.21:1234上的服务。

可能有用的一些额外参数

参数说明
-4强制使用IPV4连接
-6强制使用IPV6连接
-C请求压缩传输3
-f在后台运行
-N不运行任何远程命令
-n禁用标准输入
-p自定义SSH服务端口号
-q安静模式,减少显示提示信息
-T请求SSH服务器不分配tty控制台

断线重联?

ssh并不原生支持断线重联功能,但是你可以把指令丢进死循环里,一旦断线立刻重新连接:

while true
 do
   ssh -L 127.0.0.1:1234:127.0.0.1:4567
done
注意:请提前做好免密码登录,可以使用ssh-copy-id命令拷贝本机的公钥到服务器上,实现免密码登录。

参考如下内容

ssh(1) - Linux manual page (man7.org)

  1. 可选参数,不填写则默认监听0.0.0.0,请注意潜在的安全风险。 ↩︎
  2. 可选参数,不填写则默认监听0.0.0.0。 ↩︎
  3. 如果追求速度就没必要使用这个选项,因为压缩会带来额发的开销,可能会拖慢速度。 ↩︎