反向SSH隧道如何工作?


350

据我了解,防火墙(假定默认设置)会拒绝所有先前没有对应的传出流量的传入流量。

基于“ 反向ssh连接”和“ SSH隧道轻松”,反向SSH隧道可用于解决讨厌的防火墙限制。

我想在远程计算机上执行shell命令。远程计算机具有自己的防火墙,并且位于其他防火墙(路由器)之后。它的IP地址为192.168.1.126(或类似名称)。我不在防火墙后面,而且我知道从Internet看到的远程计算机的IP地址(而不是192.168.1.126地址)。另外,我可以先要求某人以ssh (something)root用户身份在远程计算机上执行。

谁能一步一步地向我解释反向SSH隧道如何绕过防火墙(本地和远程计算机的防火墙以及它们之间的附加防火墙)?

什么是开关(的角色-R-f-L-N)?


Answers:


402

我喜欢通过可视化来解释这种事情。:-)

将您的SSH连接视为管道。大管子。通常,您将通过这些管道来在远程计算机上运行外壳程序。该外壳程序在虚拟终端(tty)中运行。但是您已经知道这部分了。

可以将您的隧道视为管道中的管道。您仍然拥有较大的SSH连接,但是-L或-R选项可让您在其中建立较小的管道。

每个管都有起点和终点。最大的管道,即SSH连接,始于SSH客户端,最后到达您连接的SSH服务器。所有较小的管都有相同的端点,除了“开始”或“结束”的作用是由您使用-L还是-R(分别)创建它们来确定的。

(您没有说,但是我将假设您提到的“远程”计算机(位于防火墙后面的一台计算机)可以使用网络地址转换(NAT)访问Internet。这很重要,因此如果错误,请更正此假设。)

创建隧道时,可以指定将在其上应答的地址和端口,以及将其传送到的地址和端口。该-L选项告诉隧道在隧道的本地端(运行客户端的主机)进行应答。该-R选项告诉隧道在远程端(SSH服务器)进行应答。

SSH隧道方向

因此...为了能够从Internet SSH到防火墙后面的计算机中,您需要有问题的计算机打开与外界的SSH连接,并包括一个-R隧道,其“入口”点是防火墙的“远程”端。他的联系。

在上面显示的两个模型中,您想要一个在右边。

从防火墙主机:

ssh -f -N -T -R22222:localhost:22 yourpublichost.example.com

这告诉您的客户建立一个带有-R表情入口的隧道。连接到隧道远端的端口22222的所有内容实际上都会到达“本地主机端口22”,其中“本地主机”是从隧道出口点(即ssh客户端)的角度来看的。

其他选项是:

  • -f 告诉ssh进行身份验证后使其本身成为后台,因此您不必坐在远程服务器上运行某些东西即可使隧道保持活动状态。
  • -N说您要建立SSH连接,但实际上并不想运行任何远程命令。如果您创建的只是一个隧道,那么包含此选项将节省资源。
  • -T 禁用伪tty分配,这是适当的,因为您没有尝试创建交互式shell。

除非您为无密码登录设置了DSA或RSA密钥,否则会有密码挑战。

请注意,强烈建议您使用仅为此隧道/客户/服务器设置的一次性帐户(而不是您自己的登录名)。

现在,从您的publichost上的shell中,通过隧道与防火墙主机建立连接:

ssh -p 22222 username@localhost

您将遇到一个主机密钥挑战,因为您可能从未遇到过该主机。然后,您将获得该username帐户的密码挑战(除非您设置了用于无密码登录的密钥)。

如果您要定期访问此主机,还可以通过在~/.ssh/config文件中添加几行来简化访问:

host remotehostname
    User remoteusername
    Hostname localhost
    Port 22222

调整remotehostnameremoteusername适合。该remoteusername字段必须与您在远程服务器上的用户名匹配,但是remotehostname可以是适合您的任何主机名,它不必与任何可解析的匹配。

(要在非本地主机 IP 上公开反向端点,请查看此文章


2
ssh -D呢?请使用相同的方法进行说明。
BigSack 2014年

6
SOCKS代理与隧道不同。如果您对如何使用它们有疑问,请询问
ghoti

12
由于术语的松散使用,我很难理解这个解释:服务器,客户端,本地计算机,远程计算机,主机,yourpublichost,localhost,remotehostname。使用所有这些宽松且不确定的术语,可以假设某人需要多达8台计算机来进行设置。我说这是因为在所有其他方面,这似乎是一个很好的解释。请减少和定义术语。
Rucent88

4
@ Rucent88,我不确定会减少什么。客户端建立与服务器的连接。这是网络世界中的通用术语。本地和远程计算机似乎很明显。如果您在阅读文档后对SSH或通用的unix术语感到困惑,我相信您会在这里找到愿意回答您任何问题的人,不会遇到麻烦。
ghoti 2015年

9
@ghoti这确实令人困惑,因为本地和远程计算机是相对的。当我坐在工作场所时,我的家用计算机是远程计算机,当我坐在家里时,工作场所中的计算机是远程计算机。当谈到隧道时,服务器和客户端也会造成混乱。例如,如果我通过使用ssh -R连接到家。我通过连接本地主机从家用计算机连接到我的工作。因此,从套接字的角度来看,服务器本身就是家用计算机。但从逻辑上讲,我已连接到工作计算机。令人困惑。
Calmarius

357

我画了一些草图

键入ssh tunnel命令的机器称为»您的主机«

从本地开始的ssh隧道


从远程开始的ssh隧道

介绍

  1. 本地: -L Specifies that the given port on the local (client) host is to be forwarded to the given host and port on the remote side.

    ssh -L sourcePort:forwardToHost:onPort connectToHost意思是:用ssh连接到connectToHost,并将所有连接尝试转发到本地 sourcePortonPort机器上称为的端口forwardToHost,可以从connectToHost机器上访问该端口。

  2. 远程: -R Specifies that the given port on the remote (server) host is to be forwarded to the given host and port on the local side.

    ssh -R sourcePort:forwardToHost:onPort connectToHost意思是:使用ssh连接到connectToHost,并将所有连接尝试转发到远程 sourcePortonPort名为的计算机上的端口forwardToHost,可以从本地计算机访问该端口。

附加选项

  • -f 告诉ssh进行身份验证后使其本身成为后台,因此您不必坐在远程服务器上运行某些东西即可使隧道保持活动状态。
  • -N说您要建立SSH连接,但实际上并不想运行任何远程命令。如果您创建的只是一个隧道,那么包含此选项将节省资源。
  • -T 禁用伪tty分配,这是适当的,因为您没有尝试创建交互式shell。

你的例子

第三个图像代表该隧道。但是称为“您的主机”的蓝色计算机代表有人启动ssh隧道的计算机,在本例中为防火墙计算机。

因此,请某人启动与您的计算机的ssh隧道连接。该命令基本上应该看起来像

ssh -R 12345:localhost:22 YOURIP

现在隧道打开了。现在,您可以使用以下命令通过ssh通过隧道连接到受防火墙保护的计算机

ssh -p 12345 localhost

它将localhost在port上连接到您自己的计算机(您的计算机)12345,但是端口12345通过隧道转发到防火墙计算机的本地主机(即防火墙计算机本身)的端口22。


9
好答案!将在演示文稿中使用它。
以赛亚·特纳2014年

4
谢谢。别客气。如果您想要矢量图像(svg或pdf),请给我留言。
erik

1
@erik,您是如何绘制这些图像的?
Pacerier

31
哦,我希望手册页能有这样的解释!谢谢!
卢卡斯·波特斯基2015年

30
你知道吗 ?我什至无需阅读文字说明。做得好 !
deppfx

21

ssh隧道通过使用已经建立的ssh连接来发送其他流量来工作。

当连接到远程服务器时,通常只有1个通道用于正常用户交互(如果考虑将STDIN / STDOUT / STDERR分开,则只有3个通道)。本地或远程ssh进程可以随时在现有连接上打开其他通道。然后,这些通道发送/接收隧道流量。当发送或接收任何流量时,ssh进程只说“此流量用于通道foobar”。

本质上是这样的:

  1. 您告诉ssh开始在端口XXXX上侦听,接收到的所有流量都应通过隧道传输,然后在端口ZZZZ上设置为YYYY。
  2. 本地ssh开始在端口XXXX上侦听(通常在上127.0.0.1,但可以更改)。
  3. 某些应用程序打开到本地计算机上端口XXXX的连接。
  4. 本地ssh打开到远程ssh的通道,并说“此通道上的所有流量都流向YYYY:ZZZZ
  5. 远程ssh连接到YYYY:ZZZZ并发送回“ OK,通道已打开”
  6. 现在,通过连接发送到本地计算机上的端口XXXX的所有流量都由ssh代理到YYYY:ZZZZ。

对于正向和反向隧道,此过程完全相同(只需在上述过程中交换单词“ local”和“ remote”)。任何一方都可以启动隧道。初次启动ssh甚至不必。您可以在ssh已经运行时打开隧道(ESCAPE CHARACTERS具体请参见~C)。

对于角色-R-f-L,和-N,你真的应该只是参考手册页,它给你最好的可能的解释。但我会提到-R-L
-R告诉远程ssh侦听连接,并且本地ssh应该连接到实际目的地。-L告诉本地ssh侦听连接,并且远程ssh应该连接到实际目的地。

请注意,这是一个非常粗糙的描述,但它应该为您提供足够的信息以了解发生了什么情况


16

SSH手册对此进行了说明,尤其是-L(本地)和-R(远程)之间的区别。


-L

-L [bind_address:]port:host:hostport

指定将本地(客户端)主机上给定端口转发到远程侧上的给定主机和端口

这通过分配一个套接字来侦听本地端的端口(可选地绑定到指定的bind_address)而起作用。

每当与此端口建立连接时该连接就会通过安全通道转发,并且会从远程计算机建立host端口hostport的连接。

以下示例使用端口1234将IRC会话从客户端计算机127.0.0.1localhost)传输到远程服务器server.example.com

$ ssh -f -L 1234:localhost:6667 server.example.com sleep 10

注意:-f选项background ssh和remote命令sleep 10被指定为允许一定时间来启动要通过隧道传输的服务。

例:

ssh `-N` -L 22000:localhost:11000 remote.server.com
  • -N 连接后,只需挂在那里(您将不会得到shell提示)

    不要执行远程命令。

  • -L 22000连接发出你的个人,端口22000 大号 OCAL机

  • localhost:11000- remote.server.com确保隧道的另一端是localhost,端口11000

ssh -N -L 22000:192.168.1.2:11000 remote.server.com

资料来源:有关ssh隧道的插图指南,教程


-R

-R [bind_address:]port:host:hostport

指定将远程(服务器)主机上给定端口转发到本地方的给定主机和端口

这是通过分配一个套接字来监听port远程端的,并且每当对此端口建立连接时该连接就会通过安全通道转发,并且会从本地计算机建立host端口hostport的连接。

例:

ssh -N -R 22000:localhost:11000 remote.server.com
  • -N 连接后,只需挂在那里(您将不会得到shell提示)

    不要执行远程命令。

  • -R22000连接将始于R emote计算机的端口22000 (在本例中为remote.server.com)

  • localhost:11000您的个人本地计算机将确保隧道的另一端是localhost,端口11000

ssh -N -R 22000:localhost:11000 remote.server.com

资料来源:有关ssh隧道的插图指南,教程


6
耳朵和嘴巴让您清楚地知道谁在说话和谁在听!
Thufir

1
我爱你的插图!
mcantsin
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.