基于SSH的端口转发

背景

端口转发满足了局域网设备没有公网IP却需要在外网访问局域网内设备的需求
端口转发可以通过ssh完成,有其他更好且复杂的方法,但是ssh简单可行。

可使用autossh以获得更稳定的连接。

由于ssh支持tcp连接,故可以转发ssh终端信息,也可以转发基于tcp连接的http等网页内容(所以基于网页的远程监控可以使用ssh做端口转发(当然这只是一个简单的方法而不一定是个好方法))

要用到的ssh的参数设置:

-f 后台执行ssh指令
-C 允许压缩数据
-N 不执行远程指令
-R 将远程主机(服务器)的某个端口转发到本地主机指定的端口
-L 将本地机(客户机)的某个端口转发到远端指定机器的指定端口
-o 指定配置选项
-p 指定远程主机的端口

材料准备

  • 需要被外网访问的设备(如局域网内的树莓派)
  • 具有公网IP的云服务器

设置反向代理

在本地机器上操作:

ssh -fCNR [云服务器公网IP或省略]:[云服务器端口]:[树莓派IP]:[树莓派端口] [登录云服务器的用户名@云服务器IP] -p [云服务器的sshd端口]
#例如:
ssh -fCNR 6667:localhost:8081 -o ServerAliveInterval=60 root@177.177.177.177 -p 22
#然后输入云服务器密码

可以登录到云服务器查看是否连接成功

netstat -tnlp | grep 6667

在给出文件列表或标准输入后,grep会对匹配一个或多个正则表达式的文本进行搜索,并只输出匹配的行或文本。

设置正向代理

实际上是一个本地转发,将公网接入端口的信息转发到本地的服务端口。

在具有公网IP的云服务器上操作:

ssh -fCNL [*或省略]:[云服务器端口]:localhost:[云服务器被转发端口] [云服务器的用户名@localhost] -p [云服务器的sshd端口]
#例如:
ssh -fCNL *:6666:localhost:6667 -o ServerAliveInterval=60 root@localhost -p 22
#输入云服务器密码

可以检查是否连接成功

netstat -tnlp | grep 6666

务必检查云服务器的防火墙或安全组设置,确保设置的对公网端口(如例子中的端口6666)允许入站。

最后

ssh 本地服务器用户名@[云服务器IP] -p 6666 连接本地服务器ssh

在浏览器输入 [云服务器IP]:6666 访问本地服务器内容