SSH端口转发小记

本地端口转发#

对服务器A的请求转发给跳板机B,交由B对有着真实服务的C发起访问,最终建立A与C的隧道

ssh -L [listen_host:]port_A:host_C:port_C user_B@host_B

该命令在A上执行,其中listen_host默认值为0.0.0.0,表示任何客户端包括主机本身都生效,接受来自任何地址的应用访问请求并进行转发。比如配置127.0.0.1,即可实现只有来自主机A本机的应用请求才被SSH隧道转发的效果

场景1#

场景:主机B与主机C处于同一内网中,主机B能够与外界联系而主机C不能。这时不处于内网中的主机A如果想要访问主机C,就可以通过SSH连接主机B+端口转发来进行。

在主机A上配置ssh:

ssh -L port_A:host_C:port_C user_B@host_B

实例:客户端连接主机A

ssh -p port_A user_C@host_A

此时主机A转而向主机B请求,相当于在主机B上执行如下命令,并将结果返回给主机A

ssh -p port_C user_C@host_C

场景2#

防火墙阻止了主机A对主机B一些端口的连接,但主机B仍有部分端口是对主机A开放的。这时主机A如果需要访问主机B上被防火墙阻挡的端口,就可以通过SSH连接主机B+端口转发来进行。需注意,这时所谓的主机C就是主机B。

在主机A上配置ssh:

ssh -L port_A:localhost:port_B user_B@host_B

实例:客户端连接主机A

ssh -p port_A user_B@host_A

此时主机A转而向主机B请求,相当于在主机B上执行如下命令(伪命令),并将结果返回给主机A

ssh -p port_B user_B@localhost

远程端口转发#

跳板机A和服务C都处于内网,公网主机B不知道A和C的存在,此时可以通过在跳板机A上执行如下命令,使得访问B的指定端口时,会将请求转发给A,由A再转发给C,最终建立起B与C的隧道连接

ssh -R port_B:host_C:port_C user_b@host_b

场景3#

内网某台服务器localhost在 80 端口开了一个服务,可以通过远程转发将这个 80 端口,映射到具有公网 IP 地址的my.public.server服务器的 8080 端口,使得访问my.public.server:8080这个地址,就可以访问到那台内网服务器的 80 端口。

在内网服务器上执行如下命令

ssh -R 8080:localhost:80 my.public.server

注意,此时跳板机和真实服务都是localhost自身

如果设置了另一台服务器作为跳板机,那么就得在跳板机上执行如下命令(假设上述的内网提供服务的服务器为my.private.server)

ssh -R 8080:my.private.server:80 my.public.server

动态端口转发#

动态转发指的是,本机与 SSH 服务器之间创建了一个加密连接,然后本机内部针对某个端口的通信,都通过这个加密连接转发。它的一个使用场景就是,访问所有外部网站,都由SSH服务器代理访问。

在本机上执行如下命令

ssh -D port_A user_B@host_B

之所以是“动态”,是相对于上面的两种转发方式来说的,动态端口转发不指定SSH服务器访问的目标,访问的目标是在在A上动态确定的,比如在浏览器上随便访问一个网站(如google.com)作为目标,该请求从port_A进入隧道,抵达B后由B访问该目标并将其中的目标信息被解析出来,再将结果通过隧道返回给A,这个过程中相当于是B作为中介在访问google.com

举例来说,如果本地端口是2121,那么动态转发的命令就是下面这样:

ssh -D 2121 tunnel-host -N

注意,这种转发采用了 SOCKS5 协议。访问外部网站时,需要把 HTTP 请求转成 SOCKS5 协议,才能把本地端口的请求转发出去,如

$ curl -x socks5://localhost:2121 http://www.example.com

如果经常使用动态转发,可以将设置写入 SSH 客户端的用户配置文件~/.ssh/config

DynamicForward tunnel-host:local-port

或者是使用浏览器的代理设置或者插件(如omegaswitchy插件),使其只对浏览器生效

拓展#

利用ssh可以自己尝试实现简易VPN、两级跳板等功能

参考链接#

SSH端口转发

彻底搞懂SSH端口转发命令

posted @   NOSAE  阅读(516)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示