基于反向ssh连接和SSH隧道变得容易,反向SSH隧道可用于避开讨厌的防火墙限制。
我想在远程计算机上执行shell命令。远程计算机具有自己的防火墙,并且位于其他防火墙(路由器)之后。它具有IP地址,例如192.168.1.126(或类似名称)。我不在防火墙后面,而且我知道从Internet看到的远程计算机的IP地址(而不是192.168.1.126地址)。此外,我可以先请某人以root身份在远程计算机上执行
ssh (something)
。有人可以一步一步地向我解释反向SSH隧道如何绕过防火墙(本地和远程计算机)。防火墙以及它们之间的附加防火墙)?
交换机(
-R
,-f
,-L
,-N
)的作用是什么?#1 楼
我喜欢通过可视化来解释这种事情。 :-)将您的SSH连接视为管道。大管子。通常,您将通过这些管道来在远程计算机上运行外壳程序。该外壳程序在虚拟终端(tty)中运行。但是您已经知道这部分了。
将您的隧道看作是管道中的管道。您仍然拥有较大的SSH连接,但是-L或-R选项可让您在其中建立一个较小的管道。
每个管道都有起点和终点。最大的管道,即SSH连接,始于SSH客户端,最后到达您连接的SSH服务器。所有较小的试管都有相同的端点,除了“开始”或“结束”的作用是由您分别使用
-L
还是-R
来创建它们来确定的。(您尚未,但我将假设您提到的“远程”计算机(位于防火墙后面的计算机)可以使用网络地址转换(NAT)访问Internet。这很重要,因此,如果出现这种情况,请更正此假设这是错误的。)
创建隧道时,请指定将在其上应答的地址和端口,以及将其传送到的地址和端口。
-L
选项告诉隧道在隧道的本地端(运行客户端的主机)进行应答。 -R
选项告诉隧道在远程端(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上的外壳通过隧道建立与防火墙主机的连接:
ssh -p 22222 username@localhost
您可能会遇到主机密钥挑战,因为您可能从未遇到过该主机。然后,您将获得
username
帐户的密码挑战(除非您设置了用于无密码登录的密钥)。如果您要定期访问此主机,则可以还可以通过在
~/.ssh/config
文件中添加几行来简化访问:host remotehostname
User remoteusername
Hostname localhost
Port 22222
调整
remotehostname
和remoteusername
以适合。 remoteusername
字段必须与您在远程服务器上的用户名匹配,但是remotehostname
可以是适合您的任何主机名,不必与任何可解析的匹配。另请参见:
将反向端点暴露在非本地IP上
使用
ControlMaster
维护隧道的提示评论
ssh -D呢?请使用相同的方法进行说明。
–BigSack
2014年1月29日,12:38
SOCKS代理与隧道不同。如果您对如何使用它们有疑问,请提出。
–ghoti
2014年1月29日在16:45
由于术语的松散使用,我很难理解这个解释:服务器,客户端,本地计算机,远程计算机,主机,yourpublichost,localhost,remotehostname。有了所有这些宽松且不确定的术语,可以假设某人需要多达8台计算机来进行设置。我指出这一点是因为在所有其他方面,这似乎是一个很好的解释。请减少和定义术语。
– Rucent88
2015年9月18日在16:21
@ Rucent88,我不确定会减少什么。客户端建立与服务器的连接。这是网络世界中的通用术语。本地和远程计算机似乎很明显。如果您在阅读文档后对SSH或通用的unix术语感到困惑,我相信您会在这里找到愿意回答您任何问题的人,不会遇到麻烦。
–ghoti
2015年9月18日在16:44
@ghoti确实令人困惑,因为本地和远程计算机是相对的。当我坐在工作场所时,我的家用计算机是远程计算机,当我坐在家里时,工作场所中的计算机是远程计算机。当谈到隧道时,服务器和客户端也会造成混乱。例如,如果我通过使用ssh -R连接到家。我通过连接本地主机从家用计算机连接到我的工作。因此,从套接字的角度来看,服务器本身就是家用计算机。但从逻辑上讲,我已连接到工作计算机。令人困惑。
–卡尔马留斯
16年11月12日15:12
#2 楼
我已经绘制了一些草图在其中键入ssh tunnel命令的机器称为»您的主机«。
本地:
-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
,并将所有连接尝试转发到本地sourcePort
到名为onPort
的计算机上的端口forwardToHost
,可以从connectToHost
机器上访问它。 远程:
-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
,并将所有连接尝试转发到远程sourcePort
到名为onPort
的机器上的端口forwardToHost
。在您的本地计算机上。其他选项
-f
验证身份验证后告诉ssh后台运行,因此您不必坐在身边在远程服务器上运行某些命令以使隧道保持活动状态。-N
表示您需要SSH连接,但实际上并不想运行任何远程命令。如果创建的只是一个隧道,那么包含此选项将节省资源。-T
禁用伪tty分配,这是适当的,因为您没有尝试创建交互式shell。 > 您的示例
第三张图片代表此隧道。但是称为“您的主机”的蓝色计算机代表某人在其中启动ssh隧道的计算机,在本例中为受防火墙保护的计算机。
因此,请某人开始与您的计算机的ssh隧道连接。该命令基本上应该看起来像
ssh -R 12345:localhost:22 YOURIP
现在打开隧道。现在,您可以使用命令
ssh -p 12345 localhost
,通过ssh通过隧道连接到受防火墙保护的计算机,该命令将在端口
localhost
上连接到您自己的12345
(您的计算机),但是端口12345
通过隧道转发到端口防火墙计算机的本地主机的22(即防火墙计算机本身)。评论
@erik,您是如何绘制这些图像的?
–起搏器
15年1月16日在7:41
我使用了名为Inkscape的开源矢量绘图工具和鼠标(嗯,实际上是一个轨迹球:Logitech的Marble FX)。
–erik
2015年1月19日,0:19
@ghoti:默认情况下,服务器上的侦听套接字(在我的-R映像中为黄色remotehost)将仅绑定到回送接口。可以通过指定bind_address来覆盖它。空的bind_address或地址“ *”表示远程套接字应该在所有接口上侦听。 —因此,只需尝试一下:在蓝色计算机上,启动ssh -R 1234:localhost:8000 yellowcomputer。同样在蓝色计算机上,启动python -m SimpleHTTPServer(端口8000上的简单网络服务器)。然后,在黄色计算机上的Web浏览器中,打开URL http:// localhost:1234,您将看到它起作用。
–erik
2015年5月6日7:45
@erik,啊,令人困惑的部分是因为我的眼睛不好-我没看到命令中remotehost之前的空格。经过仔细检查,我发现您的图实际上根本没有解决可选的bind_address。对困惑感到抱歉。
–ghoti
15年5月29日在18:53
@briankip是的,当然。至少要与防火墙后的计算机建立ssh连接(通过隧道或直接连接(如果防火墙允许))。即:您在受防火墙保护的计算机上编写的ssh命令只能打开一条隧道,而不能启动或作为ssh守护程序/服务器工作。您的下一个问题应该是,如何在没有root特权的情况下启动sshd(如果这是您的问题)。 :-)
–erik
16-3-18在15:17
#3 楼
ssh隧道通过使用已经建立的ssh连接来发送其他流量来工作。连接到远程服务器时,通常只有1个通道用于普通用户交互(如果考虑使用STDIN,则通常只有3个通道) / STDOUT / STDERR分开)。本地或远程ssh进程可以随时在现有连接上打开其他通道。然后,这些通道发送/接收隧道流量。在发送或接收任何流量时,ssh进程仅会说“此流量用于通道foobar”。
它基本上是这样的:
您告诉ssh开始在端口XXXX上侦听,并且应该将收到的所有流量都通过隧道传输,然后在端口ZZZZ上设置为YYYY。
本地ssh开始在端口XXXX上侦听(通常在
127.0.0.1
上,但是可以更改)。某些应用程序打开到本地计算机上端口XXXX的连接。
本地ssh打开到远程ssh的通道,并说“该通道上的所有流量都流向YYYY:ZZZZ
,远程ssh连接到YYYY:ZZZZ并发回“确定,通道已打开”
现在,通过连接到本地计算机上的端口XXXX的连接发送的所有流量都由ssh代理到YYYY:ZZZZ。
此正向和反向隧道的处理过程完全相同(只需在上述过程中交换单词“ local”和“ remote”即可),任何一方都可以启动隧道,甚至不必在y时您首先启动ssh。您可以在ssh已经运行时打开隧道(请参阅
ESCAPE CHARACTERS
,特别是~C
)。对于
-R
,-f
,-L
和-N
的作用,您确实应该查阅手册页,它为您提供了最佳的解释。但我会提到-R
和-L
。 -R
告诉远程ssh侦听连接,并且本地ssh应该连接到实际目标。 -L
告诉本地ssh侦听连接,并且远程ssh应该连接到实际目的地。请注意,这是一个非常粗糙的描述,但是它应该为您提供足够的信息以了解正在发生的情况#4 楼
这在SSH手册中进行了说明,尤其是-L
(本地)和-R
(远程)之间的区别。-L
-L [bind_address:]port:host:hostport
指定给定端口上的本地(客户端)主机将被转发到远程侧上的给定主机和端口。
这通过分配一个套接字来侦听本地侧上的端口(可选地绑定到指定的bind_address)而起作用。
每当与此端口建立连接时,该连接都会通过安全通道转发,并从远程计算机建立到
host
端口hostport
的连接。以下示例从客户端计算机建立IRC会话的隧道使用端口1234到远程服务器的
127.0.0.1
(localhost
)到远程服务器server.example.com
:$ ssh -f -L 1234:localhost:6667 server.example.com sleep 10
注意:
-f
选项背景为ssh,并且指定了远程命令sleep 10
以便有一定的时间启动要通过隧道传输的服务。示例:
ssh `-N` -L 22000:localhost:11000 remote.server.com
-N
y之后ou connect仅仅挂在那儿(您将不会得到shell提示)不要执行远程命令。
-L 22000
连接将源于您的个人本地计算机的端口22000 localhost:11000
-remote.server.com
将确保隧道的另一端是localhost
,端口11000
源:关于ssh隧道的图解指南,教程和方法。
-R
-R [bind_address:]port:host:hostport
指定给定的端口要在远程(服务器)主机上将其转发到本地的给定主机和端口。
这可以通过分配套接字来侦听远程侧上的
port
以及每当与此端口建立连接时起作用,该连接将通过安全通道转发,并从本地计算机连接到host
端口hostport
。示例:
ssh -N -R 22000:localhost:11000 remote.server.com
-N
连接后仅挂在那儿(不会出现shell提示)不要执行远程命令。
-R
22000连接将始于远程计算机的端口22000(在本例中为remote.server.com)。您的个人本地计算机将确保隧道的另一端是localhost:11000
,端口localhost
来源:ssh隧道上的插图指南,操作方法。
评论
耳朵和嘴巴让您清楚地知道谁在说话和谁在听!
– Thufir
18年2月10日在7:17
我爱你的插图!
– mcantsin
18年6月4日在15:23
评论
相关(操作方法):如何配置到连接计算机的反向SSH连接?