SSH隧道应用, 突破网络限制
文/怡文圣美
这篇文章可以帮你解决下面三个问题:
- 不能直连服务器, 要先登陆跳板机, 造成客户端工具无法连接服务器.
- 服务器没有公网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代理方式比较轻量级, 无需在服务器上安装什么, 打开关闭很容易, 不相关人也无法使用, 简单又安全.
完.
SSH隧道应用, 突破网络限制的更多相关文章
- ssh隧道
最近有需求使用ssh隧道,顺便研究了下,以下记录一下大概说明 ssh隧道顾名思义在可以通过ssh连接的server之间建立加密隧道,常用于突破网络限制 常用三种端口转发模式:本地端口转发,远程端口转发 ...
- 流量操控之SSH隧道与端口转发
目 录 第1章 概述... 3 1.1. 实现命令... 3 1.2. SSH隧道类型... 3 第2章 SSH隧道... ...
- 理解下所谓的ssh隧道
目录 一.含义 二.功能 三.Linux下应用的案例 参考文章 一.含义 client为了访问到server的服务,但是由于防火墙的阻拦,client没有办法通过正常访问来进行,这就用到了ssh隧道. ...
- ssh隧道使用
在内网中几乎所有的linux服务器和网络设备都支持ssh协议.一般情况下,ssh协议是允许通过防火墙和边界设备的,所以经常被攻击者利用.同时ssh协议的传输过程是加密的,所以我们很难区分合法的ssh会 ...
- 利用SSH隧道加密技术隐蔽C&C通信流量
在网络攻防博弈中,网络流量特征分析类安全防御措施得到了广泛应用.众多厂商和企业对网络流量进行恶意流量分析检测,从而针对性的采取防御措施,如各级ISP在骨干网络设备上大多采用网络流量分析检测的防御方案. ...
- 通过 SSH 隧道方式图形化连接 AIX 服务器
跳转到主要内容 登录 (或注册) 中文 [userid] IBM ID: 密码: 保持登录. 单击提交则表示您同意developerWorks 的条款和条件. 查看条款和条件. 需要一个 IBM ID ...
- ssh隧道技术
大家都知道SSH是一种安全的传输协议,用在连接服务器上比较多.不过其实除了这个功能,它的隧道转发功能更是吸引人.下面是个人根据自己的需求以及在网上查找的资料配合自己的实际操作所得到的一些心得. SSH ...
- 【转】三种不同类型的ssh隧道
转自:http://blog.creke.net/722.html 大家都知道SSH是一种安全的传输协议,用在连接服务器上比较多.不过其实除了这个功能,它的隧道转发功能更是吸引人.下面是个人根据自己的 ...
- SSH隧道技术----端口转发,socket代理
原文的原始出处不详,本文也是在复制引用了某篇转载,并做了必要的整理与编辑. 本文的受众 如果你遇到了以下问题,那么你应该阅读这篇文章 我听说过这种技术,我对它很感兴趣 我想在家里访问我在公司的机器(写 ...
随机推荐
- Markdown 图片助手-MarkdownPicPicker
title: Markdown 图片助手 v0.1 toc: true comments: true date: 2016-06-04 16:40:06 tags: [Python, Markdown ...
- Angular企业级开发(5)-项目框架搭建
1.AngularJS Seed项目目录结构 AngularJS官方网站提供了一个angular-phonecat项目,另外一个就是Angular-Seed项目.所以大多数团队会基于Angular-S ...
- java中的锁
java中有哪些锁 这个问题在我看了一遍<java并发编程>后尽然无法回答,说明自己对于锁的概念了解的不够.于是再次翻看了一下书里的内容,突然有点打开脑门的感觉.看来确实是要学习的最好方式 ...
- 【SQLServer】【恢复挂起的解决方案】附加文件时候的提示“无法重新生成日志,原因是数据库关闭时存在打开的事务/用户,该数据库没有检查点或者该数据库是只读的。 ”【数据库恢复】
汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 先贴错误: 吐槽一下: 进入正题: 新建一个同名数据库 停止MSSQL服务 替换数据库文 ...
- nodejs进阶(2)—函数模块调用
函数调用 1. 文件内普通函数调用 创建一个js文件命名为2_callFunction.js,其中定义一个函数fun1,向返回对象输出了一段字符串“你好,我是fun1”. //------------ ...
- C#多线程之线程同步篇2
在上一篇C#多线程之线程同步篇1中,我们主要学习了执行基本的原子操作.使用Mutex构造以及SemaphoreSlim构造,在这一篇中我们主要学习如何使用AutoResetEvent构造.Manual ...
- UWP开发之Mvvmlight实践七:如何查找设备(Mobile模拟器、实体手机、PC)中应用的Log等文件
在开发中或者后期测试乃至最后交付使用的时候,如果应用出问题了我们一般的做法就是查看Log文件.上章也提到了查看Log文件,这章重点讲解下如何查看Log文件?如何找到我们需要的Packages安装包目录 ...
- php注册审核
通过注册审核,判断刚创建的账户是否可以使用. 后台管理员审核通过后,账号可以使用. 通过session 设置只能通过登录入口进入网页. 原理:通过数据库设置账号的一个字段状态,例: isok:1, i ...
- 多线程 异步 beginInvoke EndInvoke 使用
有许多耗时操作时,还要响应用户操作.这时候就需要用其他线程或者异步来搞.本来是改造公司的日志组件.因为多上了个国外大区的业务到来本系统来.这个系统其他地方都好就是日志,动不动就要死给我们看.有时候寻找 ...
- linux下安装Redis以及phpredis模块
一:redis的安装 1. 首先上官网下载Redis 压缩包,地址:http://redis.io/download 下载 2. 通过远程管理工具,将压缩包拷贝到Linux服务器中,执行解压操作 3. ...