最近,我想设置一个从家用PC到笔记本电脑的远程桌面共享会话。
在阅读设置指南时,我遇到了ssh隧道技术。
尽管有很多关于该主题的文章,但我还是花了很多时间进行谷歌搜索,一些实验和几次Wireshark会话以了解幕后情况。
大部分指南在解释概念上都不完整,这使我希望获得一篇有关该主题的好文章,并附带一些解释性插图。
所以我决定自己写。
所以这里...
介绍
SSH隧道包含通过SSH协议连接创建的加密隧道。
SSH隧道可用于通过加密通道在网络上传输未加密的流量。
例如,即使FTP协议本身未加密,我们也可以使用ssh隧道在FTP服务器和客户端之间安全地传输文件。
SSH隧道还提供一种绕过防火墙的方法,该防火墙禁止或过滤某些Internet服务。
例如,组织将使用其代理过滤器阻止某些站点。
但是用户可能不希望组织代理过滤器监视或阻止其网络流量。
如果用户可以连接到外部SSH服务器,则可以创建SSH隧道,以将其本地计算机上的给定端口通过外部SSH服务器转发到远程Web服务器上的端口80。
我将在稍后详细描述这种情况。
要建立SSH隧道,需要将一台计算机的给定端口(我将在稍后讨论)转发到另一台计算机的端口,该端口将是隧道的另一端。
一旦建立了SSH隧道,用户就可以连接到第一台计算机上较早的指定端口以访问网络服务。
转发端口
可以使用不同类型的端口转发机制以多种方式创建SSH隧道。
端口可以通过三种方式转发。
- 本地端口转发
- 远程端口转发
- 动态端口转发
我没有解释什么是端口转发。
我发现Wikipedia的定义更具解释性。
端口转发或端口映射是对以下组合技术的称呼:
- 将数据包的地址和/或端口号转换为新的目的地
- 可能在数据包过滤器(防火墙)中接受此类数据包
- 根据路由表转发报文。
在这里,第一种技术将用于创建SSH隧道。
当客户端应用程序连接到SSH隧道的本地端口(本地端点)并传输数据时,这些数据将通过将主机和端口值转换为通道的远程端的值而转发到远程端。
因此,借助示例,我们来看看如何使用转发端口创建SSH隧道。
使用本地端口转发进行隧道
假设yahoo.com在大学中使用代理过滤器被阻止。
(为了这个例子。
。
无法想到会阻止雅虎的任何正当理由)。
SSH隧道可用于绕过此限制。
让我们将大学里的机器命名为“工作”,将我的家用机器命名为“家庭”。
“家”需要有一个公共IP才能起作用。
而且我正在家用计算机上运行SSH服务器。
下图说明了这种情况。
要创建SSH隧道,请在“工作”机器上执行以下操作。
ssh -L 9001:yahoo.com:80 home
“ L”开关表示需要创建本地端口转发。
开关语法如下。
-L <local-port-to-listen>:<remote-host>:<remote-port>
现在,位于“工作”的SSH客户端将连接到在“家庭”运行的SSH服务器(通常在端口22上运行),并绑定“工作”的端口9001以侦听本地请求,从而在“家庭”和“工作”之间建立SSH隧道。
在“家庭”端,它将在端口80上创建到“ yahoo.com”的连接。因此,“工作”不需要知道如何连接到yahoo.com。
只有“家”才需要担心。
“工作”和“家庭”之间的通道将被加密,而“家庭”和“ yahoo.com”之间的连接将不加密。
现在可以通过在“工作”计算机上的Web浏览器中访问http:// localhost:9001来浏览yahoo.com。
“家用”计算机将充当网关,它将接受来自“工作”计算机的请求并获取数据并将其通过隧道传输回去。
因此,full命令的语法如下。
ssh -L <local-port-to-listen>:<remote-host>:<remote-port> <gateway>
下图描述了该场景。
在此,仅当浏览器发出请求而不是在隧道建立时进行“主机”到“ yahoo.com”的连接。
也可以在“家用”计算机本身中指定端口,而不用连接到外部主机。
如果我要在“工作”和“家”之间建立VNC会话,这将很有用。
然后,命令行如下。
ssh -L 5900:localhost:5900 home (Executed from 'work')
那么这里localhost是指什么?
因为命令行是从“工作”执行的,这是“工作”吗?
事实并非如此。
如前所述,相对于而言,不是相对于启动隧道的机器。
因此,这将连接到VNC客户端将监听的“家用”计算机的端口5900。
创建的隧道可用于传输各种数据,而不仅限于Web浏览会话。
我们也可以从中建立SSH会话。
假设有另外一台计算机(“被禁止”),我们需要从大学内部对其进行SSH,但是SSH访问被阻止。
可以使用本地端口转发将SSH会话隧道传输到该主机。
安装程序将如下所示。
可以看出,现在在“工作”和“禁止”之间传输的数据是端到端加密的。
为此,我们需要如下创建一个本地端口转发。
ssh -L 9001:banned:22 home
现在,我们需要创建一个到本地端口9001的SSH会话,会话将从那里通过“家用”计算机传输到“被禁止”。
ssh -p 9001 localhost
接下来,我们继续进行下一种SSH隧道方法,即反向隧道。
反向隧道与远程端口转发
假设需要从家里连接到内部大学网站。
大学防火墙阻止了所有传入流量。 我们如何从“家庭”连接到内部网络,以便我们可以浏览内部站点? 在这里,VPN设置是不错的选择。 但是,对于此示例,我们假设我们没有此功能。 输入SSH反向隧道。
大学防火墙阻止了所有传入流量。 我们如何从“家庭”连接到内部网络,以便我们可以浏览内部站点? 在这里,VPN设置是不错的选择。 但是,对于此示例,我们假设我们没有此功能。 输入SSH反向隧道。
与前面的情况一样,我们将从防火墙后面的“工作”计算机启动隧道。
这是可能的,因为仅传入流量被阻止而传出流量被允许。
但是,客户端将不再是以前的情况,而是在“家用”计算机上。
现在代替-L选项,我们定义-R,它指定需要创建反向隧道。
ssh -R 9001:intra-site.com:80 home (Executed from 'work')
一旦执行,SSH客户端将在“工作”位置连接到在家运行的SSH服务器,从而创建SSH通道。
然后,服务器将在“家庭”计算机上绑定端口9001以侦听传入的请求,这些请求随后将通过在“家庭”和“工作”之间创建的SSH通道进行路由。
现在可以浏览内部网站
通过在“家庭”网络浏览器中访问http:// localhost:9001。 然后,“工作”将创建到站点内部的连接,并通过创建的SSH通道将响应中继回“家庭”。
很好的是,如果在两种情况下都需要连接到另一个站点,那么所有这些仍然需要创建另一个隧道。
如果可以使用创建的SSH通道将流量代理到任何站点,那会不会很好?
这就是动态端口转发的全部内容。
动态端口转发
动态端口转发允许配置一个本地端口,以将数据隧道传输到所有远程目标。
但是,要利用此功能,连接到本地端口的客户端应用程序应使用SOCKS协议发送其流量。
在隧道的客户端,将创建SOCKS代理,应用程序(例如,浏览器)使用SOCKS协议来指定流量离开ssh隧道另一端时应将流量发送到何处。
ssh -D 9001 home (Executed from 'work')
SSH将在此处创建一个SOCKS代理,以侦听本地端口9001上的连接,并且在收到请求后,将通过在“工作”与“家庭”之间创建的SSH通道路由流量。
为此,需要将浏览器配置为指向本地主机上9001端口的SOCKS代理。
参考:我们的JCG合作伙伴介绍了 SSH隧道 Source Open博客中的Buddhika Chamith。
翻译自: https://www.javacodegeeks.com/2012/03/ssh-tunneling-explained.html