前言
在前阵子的一次项目部署中,我发现运维小哥哥直接输入了另外一个内网的地址就能直接访问到系统,这令我十分诧异,在运维小哥哥的解释下,我才知道了这是通过 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 插件如下:
选中该代理,即可通过 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
: 压缩数据传输。