文/怡文圣美

这篇文章可以帮你解决下面三个问题:

  1. 不能直连服务器, 要先登陆跳板机, 造成客户端工具无法连接服务器.
  2. 服务器没有公网IP, 且只允许公司IP访问, 要在家里操作要先远程桌面到工作机再登陆服务器, 速度很慢又不稳定. 你有一台公网服务器, 希望能借它牵线搭桥.
  3. 用最简单的办法为服务器增加代理功能.

一. SSH隧道技术

要解决本文开头的三个问题, 最佳方案肯定是ssh隧道. 什么是ssh隧道呢? 请参考阮一峰老师写的SSH原理与运用(二):远程操作与端口转发.

阮一峰老师说到, ssh隧道有三种类型, 正好可以用来解决文章开头提到的三个问题. 这三个类型是:

  1. 本地端口转发.
  2. 远程端口转发.
  3. 绑定本地端口.

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), 源主机一栏填写你想映射到哪里, 侦听端口填写映射后的端口, 这里填写localhost3306, 代表映射到本的3306端口. 目标主机为服务器A的IP, 目标端口为3306, 意思是把服务器A的3306端口映射到本地. 确定后就添加了一条映射规则, 以后只要打开这个连接, 这条映射规则就会生效.

查看菜单里的"隧道窗格"可以显示当前会话所建立的隧道(转义规则标签)以及当前有哪些隧道正在通信(渠道标签).

有些客户端工具也自带隧道功能, 比较常见的就是各种数据库连接工具, 如HeidiSQL, MySQL Workbench, Navicat等等

总结: 有了ssh隧道后, 任意被跳板机"挡住"的服务器端口都可以映射到本地或者你能直连的服务器上.

三. 使用反向隧道绕过防火墙

这里的反向隧道应用于这样一种场景: 公司服务器A位于内网, 没有公网IP, 只能被公司IP的电脑登陆. 你有一台公网服务器C, 可以被家中电脑和服务器A主动连接.

利用反向隧道可以让服务器C成为连通家中电脑和公司服务器A的桥梁. 使用反向隧道的大致步骤为:

  1. 在公司登陆服务器A, 和服务器C之间建立反向隧道,
  2. 在家里登录服务器C,
  3. 连接反向隧道从而登陆服务器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隧道应用, 突破网络限制的更多相关文章

  1. ssh隧道

    最近有需求使用ssh隧道,顺便研究了下,以下记录一下大概说明 ssh隧道顾名思义在可以通过ssh连接的server之间建立加密隧道,常用于突破网络限制 常用三种端口转发模式:本地端口转发,远程端口转发 ...

  2. 流量操控之SSH隧道与端口转发

    目  录 第1章            概述... 3 1.1.         实现命令... 3 1.2.         SSH隧道类型... 3 第2章            SSH隧道... ...

  3. 理解下所谓的ssh隧道

    目录 一.含义 二.功能 三.Linux下应用的案例 参考文章 一.含义 client为了访问到server的服务,但是由于防火墙的阻拦,client没有办法通过正常访问来进行,这就用到了ssh隧道. ...

  4. ssh隧道使用

    在内网中几乎所有的linux服务器和网络设备都支持ssh协议.一般情况下,ssh协议是允许通过防火墙和边界设备的,所以经常被攻击者利用.同时ssh协议的传输过程是加密的,所以我们很难区分合法的ssh会 ...

  5. 利用SSH隧道加密技术隐蔽C&C通信流量

    在网络攻防博弈中,网络流量特征分析类安全防御措施得到了广泛应用.众多厂商和企业对网络流量进行恶意流量分析检测,从而针对性的采取防御措施,如各级ISP在骨干网络设备上大多采用网络流量分析检测的防御方案. ...

  6. 通过 SSH 隧道方式图形化连接 AIX 服务器

    跳转到主要内容 登录 (或注册) 中文 [userid] IBM ID: 密码: 保持登录. 单击提交则表示您同意developerWorks 的条款和条件. 查看条款和条件. 需要一个 IBM ID ...

  7. ssh隧道技术

    大家都知道SSH是一种安全的传输协议,用在连接服务器上比较多.不过其实除了这个功能,它的隧道转发功能更是吸引人.下面是个人根据自己的需求以及在网上查找的资料配合自己的实际操作所得到的一些心得. SSH ...

  8. 【转】三种不同类型的ssh隧道

    转自:http://blog.creke.net/722.html 大家都知道SSH是一种安全的传输协议,用在连接服务器上比较多.不过其实除了这个功能,它的隧道转发功能更是吸引人.下面是个人根据自己的 ...

  9. SSH隧道技术----端口转发,socket代理

    原文的原始出处不详,本文也是在复制引用了某篇转载,并做了必要的整理与编辑. 本文的受众 如果你遇到了以下问题,那么你应该阅读这篇文章 我听说过这种技术,我对它很感兴趣 我想在家里访问我在公司的机器(写 ...

随机推荐

  1. 使用Visual Studio 2015 开发ASP.NET MVC 5 项目部署到Mono/Jexus

    最新的Mono 4.4已经支持运行asp.net mvc5项目,有的同学听了这句话就兴高采烈的拿起Visual Studio 2015创建了一个mvc 5的项目,然后部署到Mono上,浏览下发现一堆错 ...

  2. 通过重建Hosting系统理解HTTP请求在ASP.NET Core管道中的处理流程[下]:管道是如何构建起来的?

    在<中篇>中,我们对管道的构成以及它对请求的处理流程进行了详细介绍,接下来我们需要了解的是这样一个管道是如何被构建起来的.总的来说,管道由一个服务器和一个HttpApplication构成 ...

  3. Linux上如何查看物理CPU个数,核数,线程数

    首先,看看什么是超线程概念 超线程技术就是利用特殊的硬件指令,把两个逻辑内核模拟成两个物理芯片,让单个处理器都能使用线程级并行计算,进而兼容多线程操作系统和软件,减少了CPU的闲置时间,提高的CPU的 ...

  4. php注册审核

    通过注册审核,判断刚创建的账户是否可以使用. 后台管理员审核通过后,账号可以使用. 通过session 设置只能通过登录入口进入网页. 原理:通过数据库设置账号的一个字段状态,例: isok:1, i ...

  5. 解构C#游戏框架uFrame兼谈游戏架构设计

    1.概览 uFrame是提供给Unity3D开发者使用的一个框架插件,它本身模仿了MVVM这种架构模式(事实上并不包含Model部分,且多出了Controller部分).因为用于Unity3D,所以它 ...

  6. [转载]强制不使用“兼容性视图”的HTML代码

    在IE8浏览器以后版本,都有一个"兼容性视图",让不少新技术无法使用.那么如何禁止浏览器自动选择"兼容性视图",强制IE以最高级别的可用模式显示内容呢?下面就介 ...

  7. arcgis api for js入门开发系列六地图分屏对比(含源代码)

    上一篇实现了demo的地图标绘模块,本篇新增地图地图分屏对比模块,截图如下(源代码见文章底部): 对效果图的简单介绍一下,在demo只采用了两分屏对比,感兴趣的话,可以在两分屏的基础上拓展,修改css ...

  8. Android—简单的仿QQ聊天界面

    最近仿照QQ聊天做了一个类似界面,先看下界面组成(画面不太美凑合凑合呗,,,,):

  9. 【Java并发编程实战】----- AQS(一):简介

    在前面博客中,LZ讲到了ReentrantLock.ReentrantReadWriteLock.Semaphore.CountDownLatch,他们都有各自获取锁的方法,同时相对于Java的内置锁 ...

  10. 《Entity Framework 6 Recipes》中文翻译系列 目录篇 -持续更新

    为了方便大家的阅读和学习,也是响应网友的建议,在这里为这个系列做一个目录.在目录开始这前,我先来回答之前遇到的几个问题. 1.为什么要学习EF? 这个问题很简单,项目需要.这不像学校,没人强迫你学习! ...