文/怡文圣美
这篇文章可以帮你解决下面三个问题:
- 不能直连服务器, 要先登陆跳板机, 造成客户端工具无法连接服务器.
- 服务器没有公网IP, 且只允许公司IP访问, 要在家里操作要先远程桌面到工作机再登陆服务器, 速度很慢又不稳定. 你有一台公网服务器, 希望能借它牵线搭桥.
- 用最简单的办法为服务器增加代理功能.
一. SSH隧道技术
要解决本文开头的三个问题, 最佳方案肯定是ssh隧道. 什么是ssh隧道呢? 请参考阮一峰老师写的SSH原理与运用(二):远程操作与端口转发.
阮一峰老师说到, ssh隧道有三种类型, 正好可以用来解决文章开头提到的三个问题. 这三个类型是:
- 本地端口转发.
- 远程端口转发.
- 绑定本地端口.
ssh隧道使用命令就可以创建, 工作中我们有先进的工具辅助, 可以为你省去不少麻烦, 比如你手头肯定会有的SecureCRT, 或者XShell.
二. 使用隧道绕过跳板机
用通俗的话讲, 这里的隧道在做这么一件事: 服务器A上有个程序, 监听3306端口, 存在一台服务器B分别和你的工作机以及服务器A的网络相通, 你在服务器A和服务器B上都有登陆权限, 隧道可以帮你把服务器A的3306端口映射到服务器B或者你的工作机上, 连接映射后的3306端口就等同于连接服务器A的3306端口.
工作中, 公司IT部为保证服务器安全, 工作机和服务器A之间的网络是不通的, 需要借助充当跳板机角色的服务器B. 你需要先ssh到服务器B, 再ssh到服务器A. 这对控制台下的一般管理还算能接受, 但对于不得不借助客户端工具的任务就无法实施了. 所以, 使用隧道, 把服务器A的3306端口映射到本地, 客户端工具中修改地址为localhost:3306
, 客户端工具就能正常连接服务器A了.
使用工具创建隧道前先确保已将服务器B的ssh公钥上传至服务器A, 如果不明白我说的是什么, 请参考阮一峰老师写的SSH原理与运用(一):远程登录的第五节: 公钥登录
这里以XShell为例, SecureCRT类似. 打开服务器B的连接属性, 有一个被"特意"加粗显示的菜单叫隧道, 右边大红框中展示的是已经建立的, 点击"添加"按钮添加新隧道.
类型(方向)选择Local (Outgoing), 源主机一栏填写你想映射到哪里, 侦听端口填写映射后的端口, 这里填写localhost和3306, 代表映射到本的3306端口. 目标主机为服务器A的IP, 目标端口为3306, 意思是把服务器A的3306端口映射到本地. 确定后就添加了一条映射规则, 以后只要打开这个连接, 这条映射规则就会生效.
查看菜单里的"隧道窗格"可以显示当前会话所建立的隧道(转义规则标签)以及当前有哪些隧道正在通信(渠道标签).
有些客户端工具也自带隧道功能, 比较常见的就是各种数据库连接工具, 如HeidiSQL, MySQL Workbench, Navicat等等
总结: 有了ssh隧道后, 任意被跳板机"挡住"的服务器端口都可以映射到本地或者你能直连的服务器上.
三. 使用反向隧道绕过防火墙
这里的反向隧道应用于这样一种场景: 公司服务器A位于内网, 没有公网IP, 只能被公司IP的电脑登陆. 你有一台公网服务器C, 可以被家中电脑和服务器A主动连接.
利用反向隧道可以让服务器C成为连通家中电脑和公司服务器A的桥梁. 使用反向隧道的大致步骤为:
- 在公司登陆服务器A, 和服务器C之间建立反向隧道,
- 在家里登录服务器C,
- 连接反向隧道从而登陆服务器A.
可以发现服务器A是主动连接服务器C的, 这就顺利突破了公司防火墙和没有公网IP的限制. 这就是反向的含义.
具体的步骤是先用公司的工作机登陆服务器A执行命令:
ssh -R 7000:localhost22 root@ServerC_IP
含义是登陆服务器C后, 将本地的22端口映射到服务器C的7000端口上. 这时候不能退出, 不能关电脑, 不能断网络. 待你回到家后用家中电脑登陆服务器C, 执行:
netstat -lpn | grep 7000
会发现一个被打开的7000端口, 这就是隧道了. 该端口等同于服务器A的22端口, 你执行下面命令就可以登陆服务器A了:
ssh user@localhost -p 7000
工作机上如果退出服务器C的登陆, 隧道就会被关闭, 所以这种方案也只能适合工作机可以长时间不关的人.
读者可能会发现XShell的连接属性->隧道->添加->类型(方向)下拉框中有一个选项叫Remote (Incoming), 这种类型对应的也是反向隧道. 但笔者用这种方式建立的隧道无法使用, 既没有报错, 也没有成功映射端口.有知道这个选项到底干嘛用的请一定要告诉我哦 O(∩_∩)O~.
总结: 在知道反向隧道之前, 你登录公司服务器的方法可能是先远程桌面到工作机, 再登陆公司服务器, 这之间可能还要先登录跳板机, 受远程桌面和网络质量的影响, 这样2次跳板后到达服务器的操作感受会很糟糕. 现在只需要跳转1次, 关键是省去了远程桌面, 操作流畅度会大大提高.
四. 使用代理隧道搭建代理服务器
阮一峰老是在SSH原理与运用(二):远程操作与端口转发中说的绑定本地端口类型指的就是代理隧道, 这点可以从XShell的连接属性->隧道->添加->类型(方向)->Dynamic (SOCKS4/5)就可以看出:
这样的隧道建立后, localhost:8080
就是代理服务器地址了, 代理的网络环境就是会话所连接的服务器网络.
这种隧道非常适合用来调试线上系统. 比如采用分布式部署的应用, 从公网访问, 均衡负载会随机分配一台主机响应, 想要调试指定的一台主机怎么办? 你可以在均衡负载机上建立代理隧道, 浏览器中配置均衡负载为代理服务器, 浏览器地址栏输入主机的内网IP就可以访问指定的主机了.
总结: 虽然Linux安装ss5不难, 但在公司的服务器上安装就不妥了. 这种基于ssh的ss5代理方式比较轻量级, 无需在服务器上安装什么, 打开关闭很容易, 不相关人也无法使用, 简单又安全.
完.