使用SSH隧道建立与堡垒机内部机器的连接

在实际项目运维过程中,一般的服务器为了保证安全,都需要通过前置机或者堡垒机的方式才能访问到堡垒机后面的机器,而这给我们的开发部署工作带来很多不便,使用ssh隧道可以帮我们减少很多麻烦。

SSH/plink命令的基本资料:

首先,认识下这三个非常强大的命令:

1
2
3
1、ssh -C -f -N -g -L listen_port:DST_Host:DST_port user@Tunnel_Host
2、ssh -C -f -N -g -R listen_port:DST_Host:DST_port user@Tunnel_Host
3、ssh -C -f -N -g -D listen_port user@Tunnel_Host

相关参数的解释:
-f Fork into background after authentication.
后台认证用户/密码,通常和-N连用,不用登录到远程主机。

-L port:host:hostport
将本地机(客户机)的某个端口转发到远端指定机器的指定端口. 工作原理是这样的, 本地机器上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 该连接就经过安全通道转发出去, 同时远程主机和 host 的 hostport 端口建立连接. 可以在配置文件中指定端口的转发. 只有 root 才能转发特权端口. IPv6 地址用另一种格式说明: port/host/hostport

-R port:host:hostport
将远程主机(服务器)的某个端口转发到本地端指定机器的指定端口. 工作原理是这样的, 远程主机上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 该连接就经过安全通道转向出去, 同时本地主机和 host 的 hostport 端口建立连接. 可以在配置文件中指定端口的转发. 只有用 root 登录远程主机才能转发特权端口. IPv6 地址用另一种格式说明: port/host/hostport

-D port
指定一个本地机器 “动态的’’ 应用程序端口转发. 工作原理是这样的, 本地机器上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 该连接就经过安全通道转发出去, 根据应用程序的协议可以判断出远程主机将和哪里连接. 目前支持 SOCKS4 协议, 将充当 SOCKS4 服务器. 只有 root 才能转发特权端口. 可以在配置文件中指定动态端口的转发.

-C Enable compression.
压缩数据传输。

-N Do not execute a shell or command.
不执行脚本或命令,通常与-f连用。

-g Allow remote hosts to connect to forwarded ports.
在-L/-R/-D参数中,允许远程主机连接到建立的转发的端口,如果不加这个参数,只允许本地主机建立连接。注:这个参数我在实践中似乎始终不起作用。

以上摘录自:http://chenweiguang.blogspot.com/2009/03/ssh.html

使用场景-建立本地SSH隧道例子

这里我们主要使用的是第一个场景。
在我们计划建立一个本地SSH隧道之前,我们必须清楚下面这些数据:

1
2
3
中间服务器d的IP地址(220.122.122.122)
要访问服务器c的IP地址 (内网服务地址10.1.8.1)
要访问服务器c的端口 (ssh服务对应端口 22)

以前我们要访问10.1.8.1,必须先通过ssh 连接到220.122.122.122,通过220.122.122.122这台服务器 使用ssh去连接10.1.8.1这台服务器。
现在,有了隧道我们可以直接通过ssh 连接10.1.8.1这台服务器。

1
2
3
1.ssh -C -f -N -g -L  10016:10.1.8.1:22 root@220.122.122.122 -p 21000

2.ssh root@localhost -p 10016 # 现在通过ssh访问本地10016端口,就能连接10.1.8.1的22端口了

1中 10016是本地监听端口,10.1.8.1是目标服务器,22是目标服务器对应的ssh端口,root@220.122.122.122 -p 21000是中间服务器对应的用户和访问端口。

这里我们用到了SSH客户端的三个参数,下面我们一一做出解释:

-N 告诉SSH客户端,这个连接不需要执行任何命令。仅仅做端口转发
-f 告诉SSH客户端在后台运行
-L 做本地映射端口,被冒号分割的三个部分含义分别是
需要使用的本地端口号
需要访问的目标机器IP地址(IP: 10.1.8.1)
需要访问的目标机器端口(端口: 22)
最后一个参数是我们用来建立隧道的中间机器的IP地址以及访问用户和端口(IP: 123.123.123.123)
我们再重复一下-L参数的行为。-L X:Y:Z的含义是,将IP为Y的机器的Z端口通过中间服务器映射到本地机器的X端口。

参考资料
分享到