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、两级跳板等功能
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律