`
frankensteinlin
  • 浏览: 56411 次
  • 性别: Icon_minigender_1
  • 来自: ShangHai
社区版块
存档分类
最新评论
阅读更多

From: http://blog.jianingy.com/content/ssh%E9%9A%A7%E9%81%93%E6%8A%80%E6%9C%AF%E7%AE%80%E4%BB%8B

本文的受众
如果你遇到了以下问题,那么你应该阅读这篇文章

我听说过这种技术,我对它很感兴趣 
我想在家里访问我在公司的机器(写程序,查数据,下电影)。 
公司为了防止我们用XX软件封锁了它的端口或者服务器地址。 
公司不让我们上XX网站,限制了网址甚至IP。 
公司不让我们看关于XX的信息,甚至花血本买了XX设备,能够对内容进行过滤。一看XX内容,链接就中断了。 
我爸是搞电脑的,他在家里的路由器上动了手脚,我不能看XXX了。 
带着这些问题,我们先从什么是ssh隧道开始。

什么是SSH隧道
首先看下面这张图,我们所面临的大部分情况都和它类似。我们的电脑在右上角,通过公司带有防火墙功能的路由器接入互联网(当然可能还有交换机什么的在中间连接着你和路由器,但是在我们的问题中交换机并不起到什么关键性的作用)。左下脚的部分是一个网站的服务器,它是我们公司防火墙策略的一部分,也就是说公司不希望我们访问这个服务器。在左上角还有一台机器,它也是属于我们的。但是这台机器并不在我们公司里面,换句话说他不受到公司防火墙的限制。最后也是最重要的一点是,我们能够在公司通过互联网直接访问这台机器。或者说这台位于公司防火墙外面的机器需要拥有一个独立的互联网IP,同时公司的防火墙规则不会屏蔽这台机器,并且这台机器运行着一个OpenSSH服务器。



现在,我们清楚地知道了自己所处的网络环境。并且不难理解我们在公司无法访问那个服务器的原因是:线路A-B-C上A-B之间的防火墙屏蔽了对那个服务器的访问。与此同时,我们也很快注意到,线路A-B-D之间、D-C之间是不受阻碍的。相信你已经想到了,在A-B之间的防火墙不会屏蔽对机器d的访问。因此我们可以通过机器d建立一个通道A-B-D-C,从而访问到机器c上的数据。

这条通道可以用很多技术来建立,这里我们仅仅介绍如何使用SSH服务器来建立这样一个通道-他被称为SSH隧道。

如何建立本地SSH隧道
在我们计划建立一个本地SSH隧道之前,我们必须清楚下面这些数据:

中间服务器d的IP地址 
要访问服务器c的IP地址 
要访问服务器c的端口 
现在,我们把上面这张图变得具体一些,给这些机器加上IP地址。并且根据下面这张图列出我们的计划:


需要访问234.234.234.234的FTP服务,也就是端口21 
中间服务器是123.123.123.123 
现在我们使用下面这条命令来达成我们的目的

ssh -N -f -L 2121:234.234.234.234:21 123.123.123.123
ftp localhost:2121 # 现在访问本地2121端口,就能连接234.234.234.234的21端口了
这里我们用到了SSH客户端的三个参数,下面我们一一做出解释:

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

在这条命令成功执行之后,我们已经具有绕过公司防火墙的能力,并且成功访问到了我们喜欢的一个FTP服务器了。

如何建立远程SSH隧道
通过建立本地SSH隧道,我们成功地绕过防火墙开始下载FTP上的资源了。那么当我们在家里的时候想要察看下载进度怎么办呢?大多数公司的网络是通过路由器接入互联网的,公司内部的机器不会直接与互联网连接,也就是不能通过互联网直接访问。通过线路D-B-A访问公司里的机器a便是不可能的。也许你已经注意到了,虽然D-B-A这个方向的连接不通,但是A-B-D这个方向的连接是没有问题的。那么,我们能否利用一条已经连接好的A-B-D方向的连接来完成D-B-A方向的访问呢?答案是肯定的,这就是远程SSH隧道的用途。

与本地SSH一样,我们在建立远程SSH隧道之前要清楚下面几个参数:

需要访问内部机器的远程机器的IP地址(这里是123.123.123.123) 
需要让远程机器能访问的内部机器的IP地址(这里因为是想把本机映射出去,因此IP是127.0.0.1) 
需要让远程机器能访问的内部机器的端口号(端口:22) 
在清楚了上面的参数后,我们使用下面的命令来建立一个远程SSH隧道

ssh -N -f -R 2222:127.0.0.1:22 123.123.123.123
现在,在IP是123.123.123.123的机器上我们用下面的命令就可以登陆公司的IP是192.168.0.100的机器了。

ssh -p 2222 localhost
-N,-f 这两个参数我们已经在本地SSH隧道中介绍过了。我们现在重点说说参数-R。该参数的三个部分的含义分别是:

远程机器使用的端口(2222) 
需要映射的内部机器的IP地址(127.0.0.1) 
需要映射的内部机器的端口(22) 
例如:-R X:Y:Z 就是把我们内部的Y机器的Z端口映射到远程机器的X端口上。

建立SSH隧道的几个技巧
自动重连

隧道可能因为某些原因断开,例如:机器重启,长时间没有数据通信而被路由器切断等等。因此我们可以用程序控制隧道的重新连接,例如一个简单的循环或者使用 djb’s daemontools . 不管用哪种方法,重连时都应避免因输入密码而卡死程序。关于如何安全的避免输入密码的方法,请参考我的 如何实现安全的免密码ssh登录 。这里请注意,如果通过其他程序控制隧道连接,应当避免将SSH客户端放到后台执行,也就是去掉-f参数。

保持长时间连接

有些路由器会把长时间没有通信的连接断开。SSH客户端的TCPKeepAlive选项可以避免这个问题的发生,默认情况下它是被开启的。如果它被关闭了,可以在ssh的命令上加上-o TCPKeepAlive=yes来开启。

另一种方法是,去掉-N参数,加入一个定期能产生输出的命令。例如: top或者vmstat。下面给出一个这种方法的例子:

ssh -R 2222:localhost:22 123.123.123.123 "vmstat 30"
检查隧道状态

有些时候隧道会因为一些原因通信不畅而卡死,例如:由于传输数据量太大,被路由器带入stalled状态。这种时候,往往SSH客户端并不退出,而是卡死在那里。一种应对方法是,使用SSH客户端的ServerAliveInterval和ServerAliveCountMax选项。ServerAliveInterval会在隧道无通信后的一段设置好的时间后发送一个请求给服务器要求服务器响应。如果服务器在ServerAliveCountMax次请求后都没能响应,那么SSH客户端就自动断开连接并退出,将控制权交给你的监控程序。这两个选项的设置方法分别是在ssh时加入-o ServerAliveInterval=n和-o ServerAliveCountMax=m。其中n, m可以自行定义。

如何将端口绑定到外部地址上

使用上面的方法,映射的端口只能绑定在127.0.0.1这个接口上。也就是说,只能被本机自己访问到。如何才能让其他机器访问这个端口呢?我们可以把这个映射的端口绑定在0.0.0.0的接口上,方法是加上参数-b 0.0.0.0。同时还需要打开SSH服务器端的一个选项-GatewayPorts。默认情况下它应当是被打开的。如果被关闭的话,可以在/etc/sshd_config中修改GatewayPorts no为GatewayPorts yes来打开它。

如何寻找中间服务器

如果你家里使用ADSL上网,多半你会比较幸运。一般的ADSL(例如 联通 的ADSL)都是有互联网地址的。你只需要在家里的路由器上一台装有OpenSSH server机器的SSH端口映射出去即可。同时一些提供SSH访问的虚拟主机也可以用于这一用途。例如: Hostmonser 或者 Dreamhost .

通过SSH隧道建立SOCKS服务器
如果我们需要借助一台中间服务器访问很多资源,一个个映射显然不是高明的办法(事实上,高明确实没有用这个方法)。幸好,SSH客户端为我们提供了通过SSH隧道建立SOCKS服务器的功能。

通过下面的命令我们可以建立一个通过123.123.123.123的SOCKS服务器。

ssh -N -f -D 1080 123.123.123 # 将端口绑定在127.0.0.1上
ssh -N -f -D 0.0.0.0:1080 123.123.123.123 # 将端口绑定在0.0.0.0上
通过SSH建立的SOCKS服务器使用的是SOCKS5协议,在为应用程序设置SOCKS代理的时候要特别注意。

总结
至此,我们已经对如何利用SSH隧道有一个基本的认识了。现在,文章开始时的那些问题应该迎刃而解了吧。这里要特别说一下,由于SSH隧道也使用了SSH加密协议,因此是不会被防火墙上的内容过滤器监控到的。也就是说一切在隧道中传输的数据都是被加密的。当然,离开隧道后的数据还是会保持自己原有的样子,没有加密的数据还是会被后续的路由设备监控到。

参考文献
OpenSSH网站


分享到:
评论

相关推荐

    ssh隧道

    总的来说,SSH隧道是IT领域中一种重要的安全通信技术,它提供了在不安全网络环境下的安全连接手段,并且可以与各种工具和配置相结合,以满足不同场景的需求。了解并熟练使用SSH隧道,对于系统管理员、开发人员以及...

    SSH隧道管理内部服务器putty,ssh secure shell

    而SSH隧道(SSH Tunneling)则是利用SSH协议提供的加密通道进行数据传输的一种技术,它可以在不安全的网络环境中提供一个加密的安全通道。 SSH隧道主要分为两种类型:**端口转发**和**动态端口转发**。端口转发又...

    SSH隧道下应用协议识别的网络安全研究.pdf

    根据提供的文件内容,本文将讨论SSH隧道下应用协议识别的网络安全研究的关键知识点,内容涵盖应用层信息识别的重要性、SSH协议的分析、流量监控技术、以及加密协议对网络监控的影响等。 1. 应用层信息识别的重要性 ...

    基于云技术和SSH反向隧道技术的视频监控机器人设计.pdf

    本文讲述了基于云技术和SSH反向隧道技术设计的视频监控机器人的系统架构、工作原理及实施过程。首先,文章介绍了监控系统在不同领域的应用背景,指出了传统监控系统存在的局限性,以及云技术和嵌入式技术如何为视频...

    实例讲解SSH技术架构

    5. **会话管理**:SSH建立连接后,会创建一个安全的隧道,所有在隧道内的通信都会被加密。此外,SSH还支持端口转发,可以将本地端口上的流量转发到远程服务器,或者将远程服务器的端口转发到本地,这在穿透防火墙时...

    tunnelme:反向 SSH 和 SSH 隧道

    标题 "tunnelme:反向 SSH 和 SSH 隧道" 涉及到的是一个与网络连接和安全相关的工具或技术,特别是如何利用 SSH(Secure Shell)来创建隧道进行远程访问。SSH 是一种用于安全地远程登录到服务器、执行命令和传输数据...

    SSH.NET-develop.zip_SSH.net_VI1Q_ssh

    5. **端口转发**:通过SSH隧道转发本地或远程端口,实现数据的安全传输。 6. **密钥管理**:支持RSA、DSA等公钥算法,进行密钥对的生成和管理。 SSH.NET库的优势在于它的跨平台性,可以在任何支持.NET的平台上运行...

    SSH2+oracle数据库

    5. 连接数据库:使用支持SSH隧道的数据库管理工具(如SQL*Plus或SQL Developer)通过创建的SSH隧道连接到Oracle数据库。 标签"Oracle SSH2"进一步强调了这是关于如何在Oracle数据库环境中利用SSH2协议进行安全操作...

    Jmeter解决SSH连接数据库

    针对上述情况,为了实现客户端对远程数据库的访问,可以通过SSH隧道的方式进行连接。这种方式不仅能够绕过网络隔离限制,同时还能保证数据传输的安全性。 #### 解决策略 本节将详细介绍如何通过JMeter实现SSH隧道...

    SSH简介及配置使用SSH登陆远程主机讲义

    SSH还有其他高级特性,如端口转发,允许将本地端口的数据流通过SSH隧道转发到远程服务器,增强网络通信的安全性。此外,SSH还可以用于自动化运维脚本,如使用`expect`脚本自动化处理交互式登录过程。 总的来说,SSH...

    sshshell.zip

    它使用公钥加密技术来验证服务器身份,并为通信双方创建一个加密的隧道,确保数据传输的安全性。SSH的主要优势在于其安全性,比传统的FTP(File Transfer Protocol)更安全,因为FTP通常在明文中传输数据,容易受到...

    丰富的SSH整合参考资料

    5. **SSH隧道和端口转发**: - SSH隧道:用于安全地转发本地或远程端口,绕过防火墙限制,如HTTPS代理通过SSH隧道。 - 动态端口转发:可以创建一个SOCKS代理,让所有流量通过SSH加密通道。 6. **SSH性能优化**: ...

    ssh整合例子及其他的实验

    1. **SSH隧道**:建立SSH隧道可以安全地转发本地端口到远程服务器,或者反之,以访问受限的服务。例如,你可以通过SSH隧道访问远程数据库或Web应用。 2. **密钥对认证**:实验可以涵盖如何生成SSH公钥和私钥,以及...

    BlueSky:SSH隧道解决方案,用于从Mac到Mac的远程连接(以前是Mac-MSP产品)

    BlueSky建立并维护由客户端计算机启动到BlueSky服务器的SSH隧道。 隧道允许两个连接从服务器返回到计算机:SSH和VNC。 计算机上的SSH和VNC服务是Sharing.prefpane提供的服务。 您使用管理员应用程序通过SSH连接到...

    ssh实战项目.zip

    7. **隧道技术**:SSH隧道可以将任意TCP连接封装在SSH连接内,例如,将HTTP请求通过SSH隧道发送,实现安全访问内部网络资源。 8. **免密登录**:使用`ssh-copy-id`命令将公钥复制到远程服务器,配置完成后,客户端...

    Windows SSH服务器软件freeSSHd

    SSH可以通过建立反向NET连接来创建安全隧道,这是一种将远程主机连接到本地计算机的技术。例如,当防火墙阻止了直接连接到远程服务器时,可以通过在本地主机上设置一个SSH服务器,然后让远程服务器连接到这个SSH...

    ssh注册登录项目

    7. **SSH隧道**:SSH还支持端口转发功能,可创建安全的隧道,例如本地到远程端口的转发,或者通过中间代理服务器的中继转发。 8. **密钥管理**:对于大型组织,可能需要使用密钥管理系统,如SSO(单点登录)集成,...

    SSH_Test.rar_C ssh_C#ssh_C++ ssh_C++ SSH_libssh2库

    SSH通常用于在服务器之间建立安全的隧道,支持文件传输、远程命令执行等操作。 libssh2是一个开源的C语言实现的SSH2客户端和服务器库。它支持多种身份验证方法,如公钥、密码、键盘交互式和一次性密码。libssh2库...

    SSH完整资源代码

    SSH提供端口转发功能,可以将本地端口上的流量通过SSH隧道转发到远程服务器,实现安全的访问和代理,例如SSH Tunneling。 7. **X11转发** SSH还可以实现X11转发,即通过SSH安全地在远程主机上启动图形应用程序,...

    Ubuntu 20.04.1安装ssh离线资源包

    它支持命令行交互、文件传输,并能通过隧道技术扩展到其他协议。SSH客户端用于发起连接,而SSH服务器则监听并响应客户端请求。 在Ubuntu 20.04.1上离线安装SSH服务,我们首先需要将这些`.deb`包复制到目标机器上。...

Global site tag (gtag.js) - Google Analytics