Ali*_*Ali 432 networking ssh firewall remote-management ssh-tunneling
据我了解,防火墙(假设默认设置)拒绝所有没有先前对应的传出流量的传入流量。
基于Reversing an ssh connection和SSH Tunneling Made Easy,反向 SSH 隧道可用于绕过烦人的防火墙限制。
我想在远程机器上执行 shell 命令。远程机器有自己的防火墙,并在附加防火墙(路由器)后面。它有一个像 192.168.1.126(或类似的东西)这样的 IP 地址。我不在防火墙后面,我知道从 Internet 上看到的远程机器的 IP 地址(不是 192.168.1.126 地址)。此外,我可以要求某人ssh (something)首先在远程机器上以 root身份执行。
谁能一步一步地向我解释反向 SSH 隧道如何绕过防火墙(本地和远程机器的防火墙以及它们之间的附加防火墙)?
开关 ( -R, -f, -L, -N)的作用是什么?
gho*_*oti 497
我喜欢通过可视化来解释这种事情。:-)
将您的 SSH 连接视为管道。大管子。通常,您将通过这些管道在远程计算机上运行 shell。shell 在虚拟终端 (tty) 中运行。但是你已经知道这部分了。
将您的隧道视为管中的管。您仍然拥有大型 SSH 连接,但 -L 或 -R 选项允许您在其中设置一个较小的管。
每根管子都有起点和终点。大管子,你的 SSH 连接,从你的 SSH 客户端开始,最终在你连接的 SSH 服务器上。所有较小的管都具有相同的端点,除了“开始”或“结束”的角色取决于您是否使用-L或-R(分别)创建它们。
(你没有说,但我假设你提到的“远程”机器,防火墙后面的机器,可以使用网络地址转换(NAT)访问互联网。这很重要,所以如果这个假设是错误的,请更正。)
当您创建隧道时,您指定一个地址和端口,它将在其上应答,以及一个地址和端口,它将被传送到该地址和端口。该-L选项告诉隧道在隧道的本地端(运行客户端的主机)应答。该-R选项告诉隧道在远程端(SSH 服务器)应答。

所以...为了能够从 Internet SSH 到防火墙后面的机器,您需要有问题的机器打开与外部世界的 SSH 连接,并包括一个-R隧道,其“入口”点是“远程”端他的联系。
在上面显示的两个模型中,您需要右侧的一个。
从防火墙主机:
ssh -f -N -T -R22222:localhost:22 yourpublichost.example.com
Run Code Online (Sandbox Code Playgroud)
这会告诉您的客户端建立一个带有-R表情入口点的隧道。任何连接到隧道远端的端口 22222 的东西实际上都会到达“localhost 端口 22”,其中“localhost”是从隧道出口点(即您的 ssh 客户端)的角度来看的。
其他选项是:
-f 告诉 ssh 在它进行身份验证后将其自身作为后台,因此您不必坐在远程服务器上运行某些东西以使隧道保持活动状态。-N表示您需要 SSH 连接,但实际上并不想运行任何远程命令。如果您创建的只是一个隧道,那么包含此选项可以节省资源。-T 禁用伪 tty 分配,这是合适的,因为您没有尝试创建交互式 shell。除非您为无密码登录设置了 DSA 或 RSA 密钥,否则将面临密码挑战。
请注意,强烈建议您使用仅为此隧道/客户/服务器设置的一次性帐户(不是您自己的登录名)。
现在,在yourpublichost上的shell 中,通过隧道建立与防火墙主机的连接:
ssh -p 22222 username@localhost
Run Code Online (Sandbox Code Playgroud)
您将获得主机密钥挑战,因为您之前可能从未遇到过此主机。然后,您将收到该username帐户的密码挑战(除非您已为无密码登录设置了密钥)。
如果您要定期访问此主机,还可以通过在~/.ssh/config文件中添加几行来简化访问:
host remotehostname
    User remoteusername
    Hostname localhost
    Port 22222
Run Code Online (Sandbox Code Playgroud)
调整remotehostname和remoteusername适应。该remoteusername字段必须与您在远程服务器上的用户名匹配,但remotehostname可以是适合您的任何主机名,它不必匹配任何可解析的内容。
也可以看看:
eri*_*rik 473
键入 ssh 隧道命令的机器称为“您的主机”。


当地的: -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
Run Code Online (Sandbox Code Playgroud)
现在隧道打开了。您现在可以使用命令通过 ssh 通过隧道连接到防火墙机器
ssh -p 12345 localhost
Run Code Online (Sandbox Code Playgroud)
它将localhost在端口上连接到您自己的(您的机器)12345,但端口12345通过隧道转发到防火墙计算机(即防火墙计算机本身)的本地主机的端口 22。
phe*_*mer 26
ssh 隧道通过使用已建立的 ssh 连接发送额外流量来工作。
当您连接到远程服务器时,通常只有 1 个通道用于正常的用户交互(如果考虑 STDIN/STDOUT/STDERR 分开,则为 3 个通道)。在任何时候,本地或远程 ssh 进程都可以在现有连接上打开额外的通道。然后这些通道发送/接收隧道流量。在发送或接收任何流量时,ssh 进程只是说“此流量用于通道 foobar”。
它基本上是这样工作的:
127.0.0.1,但可以更改)。这个过程对于前向和反向隧道是完全相同的(只需在上述过程中交换“本地”和“远程”这两个词)。任何一方都可以启动隧道。当您第一次启动 ssh 时甚至不必如此。您可以在 ssh 已经运行时打开隧道(ESCAPE CHARACTERS具体请参见~C)。
对于-R, -f, -L, 和的作用-N,您真的应该查阅手册页,它为您提供了最好的解释。但我会提到-R和-L。
-R告诉远程 ssh 监听连接,并且本地 ssh 应该连接到真正的目的地。-L告诉本地 ssh 侦听连接,并且远程 ssh 应该连接到真正的目的地。
请注意,这是一个非常粗略的描述,但它应该为您提供足够的信息来了解发生了什么
ken*_*orb 21
这在 SSH 手册中有解释,特别是-L(local) 和-R(remote)之间的区别。
-L
-L [bind_address:]port:host:hostport指定将本地(客户端)主机上的给定端口转发到远程端的给定主机和端口。
这通过分配一个套接字来侦听本地端的端口来工作,可选地绑定到指定的 bind_address。
每当与此端口建立连接时,该连接就会通过安全通道转发,并从远程机器建立到
host端口hostport的连接。
以下示例使用端口 1234 将IRC 会话从客户端机器127.0.0.1( localhost)隧道传输到远程服务器server.example.com:
$ ssh -f -L 1234:localhost:6667 server.example.com sleep 10
Run Code Online (Sandbox Code Playgroud)
注意:-f选项 backgrounds ssh 和远程命令sleep 10被指定为允许一定的时间来启动将被隧道传输的服务。
例子:
ssh `-N` -L 22000:localhost:11000 remote.server.com
Run Code Online (Sandbox Code Playgroud)
-N 连接后就挂在那里(你不会得到 shell 提示)
不要执行远程命令。
-L 22000连接发出你的个人,端口22000大号OCAL机
localhost:11000-remote.server.com将确保隧道的另一端是localhost, port11000
-R
-R [bind_address:]port:host:hostport指定远程(服务器)主机上的给定端口将转发到本地端的给定主机和端口。
这是通过分配一个套接字来侦听
port远程端的工作,每当连接到此端口时,该连接就会通过安全通道转发,并从本地机器连接到host端口hostport。
例子:
ssh -N -R 22000:localhost:11000 remote.server.com
Run Code Online (Sandbox Code Playgroud)
-N 连接后就挂在那里(你不会得到 shell 提示)
不要执行远程命令。
-R22000连接将发起对的端口22000 ř表情计算机(在这种情况下,remote.server.com)
localhost:11000您的个人本地计算机将确保隧道的另一端是localhost端口11000