1.摘要
在工作中,经常需要对公网云主机上运行的一系列服务进行维护,为了安全起见,通常对外开放的端口只有SSH(22端口)服务,虽然可以在运维的时候临时通过改变安全策略放行其它服务端口,但对于耗时较长的排查操作,长时间暴露敏感端口存在较大的安全风险。而通过SSH隧道技术,不用改变任何安全策略便可以将云主机中的服务端口映射到本地进行操作,不仅能够保证传输数据处于加密状态,而且可以在本地通过工具或浏览器访问目标服务,既方便又安全。
2.SSH隧道原理
SSH隧道技术在本文中的应用场景图如下:
图片
要成功建立SSH隧道,需要满足以下几个前提条件:
- 个人电脑需要安装支持SSH协议的软件,Windows系统可能需要安装类似于Cygwin这样的软件。
- 云主机防火墙安全策略必须放行22端口,也就是SSH协议使用的默认端口。
- 云主机上同样需要安装支持SSH协议的软件包,要能保证能用SSH协议正常登录远程主机。
SSH隧道主要从个人电脑开始建立,根据上图可知,SSH隧道建立过程如下:
- 在个人电脑中开放一个自定义端口,这里选择了5478端口,该端口没有特别要求,可以自己根据实际情况选择,不与其它端口冲突就行。5478端口可以看作是隧道的开端。
- 输入远程主机的SSH登录账号和密码建立隧道远程连接,防火墙的22端口必须放行才能成功建立连接。这里的SSH远程登录可以看作是隧道的延伸,由个人电脑的5478端口出发,延伸到远程云主机的22端口。
- 将远程主机的真实服务端口与本地隧道开端5478端口建立映射。映射关系可以看作是隧道的收尾工程,隧道从云主机的22端口连接后,需要将其与远程主机上的本地服务端口建立连接,假设本地服务有个3306的数据库服务, 这样最终就打通了个人电脑5478端口和3306端口的连接,实现从本地访问防火墙之后的云主机服务。
3. 实践应用
上面建立SSH隧道的过程,在个人电脑里可以使用SSH工具自带的命令完成,完整命令如下:
ssh -CfNg -L 5478:localhost:3306 root@xx.xx.177.122
这条命令参数含义如下:
-C: 表示压缩传输,可以提高传输速率。
-f: 将ssh传输转入后台执行,不会占用当前的shell
-N:建立静默连接,不会看到具体的会话
-g: 允许远程主机连接本地端口转发
-L: 本地端口转发
5478:localhost:3306 这个参数是建立端口映射关系,5478表示本地端口,localhost:3306表示远程主机的3306端口。
注意:这里一定要写localhost,不要写xx.xx.177.122,虽然localhost和xx.xx.177.122代表同一台远程机器。
root@xx.xx.177.122参数就是远程SSH登录的过程,需要输入SSH密码才能最终完成隧道连接。
如果命令执行失败,可以先看看本地有没有出现端口占用的情况,如图:
图片
如果命令执行返回了进程ID,说明本地转发端口5478被该进程占用了,要么kill 进程ID,要么更换其它端口。
成功执行命令后,可以查看ssh的后台进程,发现该进程说明隧道建立成功,如图:
图片
在本地通过数据库软件连接5478端口试试,可以看到已成功连接远程数据库,如图:
图片