SSH端口转发总结

前言

在前阵子的一次项目部署中,我发现运维小哥哥直接输入了另外一个内网的地址就能直接访问到系统,这令我十分诧异,在运维小哥哥的解释下,我才知道了这是通过 SSH隧道 + chrome插件 SwitchyOmega 实现的。而 SSH隧道 也可以叫做 SSH的端口转发

SSH端口转发

SSH端口转发分为三种情况,分别为:本地转发、远程转发和动态转发。

本地转发

本地转发是将SSH客户端的一个端口(未使用的)映射到SSH服务器能访问到的一个端口(提供服务的)上,实现访问SSH客户端端口间接访问SSH服务器能访问到的服务。

使用场景例子

本地转发例子

在开发者电脑上没有装 MySql 服务,而远程服务器存在一个 MySql 服务器,开发者电脑无法和远程服务器直接通信,但是他们都可以和跳板机通信,此时可以通过SSH端口转发实现开发者电脑电脑访问到内网的 MySql 服务器。

在开发者电脑中执行以下命令:

1
ssh -L 3306:192.168.0.2:3306 root@123.0.0.1

这样,开发者电脑就可以通过 MySql 客户端使用 localhost:3306 远程 MySql 服务器了。而且在开发者电脑和内网跳板机之间传输的数据是经过SSH隧道加密的。

本地端口转发命令

1
ssh [-C] [-g] [-f -N] -L [client_ip:]client_port:app_ip:app_port server_user@server_ip

client_ip :SSH客户端ip,可以省略,省略时只监听回环地址 127.0.0.1 的端口,其他主机不能通过访问SSH客户端主机IP进行隧道服务。

client_port :SSH客户端的端口,一般为本机端口。

app_ip :SSH服务器能访问到的主机ip。

app_port :SSH服务器能访问到的主机端口。

server_user :SSH服务器的账号。

server_ip : SSH服务器的ip。

-f :后台运行,和 -N 一起使用。

-N :不打开远程shell主机,可以单独使用,单独使用时,关闭SSH会话也会关闭隧道;只有和 -f 一起使用时才可实现关闭SSH会话继续使用隧道。

-g : 将本机所有的ip都被监听。

-C : 压缩数据传输。

远程转发

远程转发是将SSH服务器的一个端口上(未使用的)端口映射到SSH客户端能访问到的主机(提供服务的)端口上,实现访问服务SSH服务器的端口实现访问SSH客户端上能访问到的服务。

使用场景例子

远程转发例子

在内网中,主机2(192.168.0.2)在内网中在80端口提供http服务,内网主机可以访问到公网主机,但是公网主机无法访问到内网中,我们可以通过内网的一台主机(192.128.0.1)SSH登陆公网主机(123.0.0.1),构建一条远程端口转发隧道,实现公网主机访问到内网的http服务。

在内网主机(192.128.0.1)上执行以下命令:

1
ssh -R 80:192.168.0.2:80 root@123.0.0.1

这样,公网主机(123.0.0.1)就可以直接通过 http://127.0.0.1:80 访问内网主机(192.128.0.2)上的http服务了。

远程端口转发命令

1
ssh [-C] [-f -N] -R server_port:app_ip:app_port server_user@server_ip

server_port :SSH服务器端口(没有被使用的)。

app_ip :SSH客户端能访问到的主机ip。

app_port :SSH客户端能访问到的主机端口。

server_user :SSH服务器的账号。

server_ip : SSH服务器的ip。

-f :后台运行,和 -N 一起使用。

-N :不打开远程shell主机,可以单独使用,单独使用时,关闭SSH会话也会关闭隧道;只有和 -f 一起使用时才可实现关闭SSH会话继续使用隧道。

-C : 压缩数据传输。

补充

远程端口转发使用 -g 参数也是没有效果的,只有SSH服务器通过 127.0.0.1+端口 能访问内网服务。除非修改 /etc/ssh/sshd_config 文件内容:

1
GatewayPorts yes

这个参数的意思是,SSH 隧道监听的服务的 IP 是对外开放的 0.0.0.0,而不是只对本机的 127.0.0.1。

修改好配置文件后,你还需要重启 sshd 服务来加载新的配置,命令如下:

1
service sshd restart

动态转发

动态转发可以理解为将SSH服务器变成一个代理服务器。动态转发可以解决内网多个服务,需要为每个端口分别创建本地端口转发的问题。

使用场景例子

本地转发例子

这个例子就是模拟运维小哥哥直接输入了另外一个内网的地址就能直接访问到系统,这个网络环境其实是一开是本地转发的环境,假设在内网服务器(192.68.0.2)的主机上80端口提供 HTTP 服务。

在开发者电脑中执行以下命令:

1
ssh -D 1080 root@123.0.0.1

这样,开发者电脑就开启了一个代理。配置chrome的 SwitchyOmega 插件如下:

SwitchyOmega配置

选中该代理,即可通过 http://192.168.0.2:80 服务远程内网服务了。

动态转发命令

1
ssh -C -f -N -g -D local_port server_user@server_ip

local_port :本地端口。

server_user :SSH服务器的账号。

server_ip : SSH服务器的ip。

-f :后台运行,和 -N 一起使用。

-N :不打开远程shell主机,可以单独使用,单独使用时,关闭SSH会话也会关闭隧道;只有和 -f 一起使用时才可实现关闭SSH会话继续使用隧道。

-g : 将本机所有的ip都被监听。

-C : 压缩数据传输。

参考文章

  1. 玩转SSH端口转发
  2. ssh端口转发:ssh隧道
  3. SSH隧道与端口转发及内网穿透
  4. 调试利器-SSH隧道
如果喜欢, 请给我加个🍗~
0%