据我了解,防火墙(假设默认设置)拒绝所有先前没有相应传出流量的传入流量。
基于反转 ssh 连接和SSH 隧道变得简单,反向 SSH 隧道可用于绕过烦人的防火墙限制。
我想在远程计算机上执行 shell 命令。远程计算机有自己的防火墙,并且位于附加防火墙(路由器)后面。它的 IP 地址类似于 192.168.1.126(或类似的地址)。我不在防火墙后面,并且我知道从 Internet 上看到的远程计算机的 IP 地址(不是 192.168.1.126 地址)。此外,我可以要求某人ssh (something)
首先在远程计算机上以 root身份执行。
谁能一步一步向我解释反向 SSH 隧道如何绕过防火墙(本地和远程计算机的防火墙以及它们之间的附加防火墙)?
开关(-R
、-f
、-L
、-N
)的作用是什么?
答案1
我喜欢通过可视化来解释这种事情。 :-)
将您的 SSH 连接视为管道。大管子。通常,您将通过这些管道在远程计算机上运行 shell。 shell 通过该管道在虚拟终端 (tty) 中运行。但你已经知道这部分了。
将您的隧道视为管中的另一管。您仍然拥有较大的 SSH 连接,但 -L 或 -R 选项可让您在其中设置较小的管道。
您的 ssh 远程 shell 实际上使用连接到 stdio 的这些较小的嵌入式管之一与您进行通信。
每个管子都有一个起点和一个终点。大管子,你的 SSH 连接,从你的 SSH 客户端开始,到你连接的 SSH 服务器结束。所有较小的管都有相同的端点,除了“开始”或“结束”的角色取决于您是否使用-L
或-R
(分别)创建它们。
(你还没有说,但我假设你提到的“远程”机器,即防火墙后面的机器,可以使用网络地址转换(NAT)访问互联网。这很重要,所以如果这个假设是错误的,请纠正。)
创建隧道时,您指定它将应答(或“绑定”)的地址和端口,以及它将传送到的地址和端口。该-L
选项告诉隧道绑定到隧道的本地端(运行客户端的主机)。该-R
选项告诉隧道在远程端(SSH 服务器)进行绑定。
所以...为了能够从互联网通过 SSH 连接到防火墙后面的主机,您需要目标主机打开到外部主机的 SSH 连接,并包含一个-R
“入口”点为“远程”端的隧道其连接。
在上面显示的两个模型中,您需要右侧的模型。
来自有防火墙的主持人:
ssh -f -N -T -R22222:localhost:22 yourpublichost.example.com
这告诉目标主机上的客户端建立带有-R
表情入口点的隧道。连接到隧道远端端口 22222 的任何内容实际上都会到达“localhost port 22”,其中“localhost”是从隧道出口点的角度来看的(即本例中的 ssh 客户端,位于目标主机上) )。
其他选项是:
-f
告诉 ssh 在进行身份验证后自行后台运行,因此您不必坐在sleep
远程服务器上运行类似的东西来使隧道保持活动状态。-N
表示您想要 SSH 连接,但实际上不想运行任何远程命令。如果您创建的只是一条隧道,那么包含此选项可以节省资源。-T
禁用伪 tty 分配,这是合适的,因为您不尝试创建交互式 shell。
除非您设置了无密码登录的密钥,否则将会出现密码挑战。
(请注意,如果您打算长期保持连接处于无人值守的状态,可能会在连接断开时自动刷新连接(通过解析ssh -O check <remotehost>
),我建议您为此设置一个单独的、唯一的 SSH 密钥隧道/客户/服务器,尤其是当您使用 RemoteForward 时,不要相信任何人。)
现在 -R 服务隧道已激活,您可以从您的公共主机,通过隧道建立与防火墙主机的连接:
ssh -p 22222 username@localhost
您将收到主机密钥挑战,因为您以前可能从未访问过该主机。然后,您将收到该帐户的密码挑战username
(除非您已设置无密码登录密钥)。
如果您要定期访问该主机,您还可以通过在以下~/.ssh/config
文件中添加几行来简化访问yourpublichost
:
host firewalledhost
User firewalleduser
Hostname localhost
Port 22222
调整firewalledhost
并firewalleduser
适应。该firewalleduser
字段必须与您在远程服务器上的用户名匹配,但firewalledhost
可以是任何适合您的名称,该名称不必与任何可解析的名称匹配,因为您的连接受 和Hostname
控制Port
。
或者,如果您想从 Internet 上的其他地方访问此内容,您可以将以下内容添加到您的~/.ssh/config
:
host firewalledhost
ProxyCommand ssh -fWlocalhost:22222 yourpublichost
该-W
选项用于打开与远程主机的连接以继续 SSH 对话。它意味着-N
和-T
。
也可以看看:
答案2
我画了一些草图
键入 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
现在隧道已开通。您现在可以使用以下命令通过隧道通过 ssh 连接到受防火墙保护的计算机
ssh -p 12345 localhost
它将连接到您自己localhost
(您的计算机)的端口12345
,但端口12345
通过隧道转发到受防火墙计算机(即受防火墙计算机本身)的本地主机的端口 22。
答案3
ssh 隧道通过使用已建立的 ssh 连接来发送额外流量来工作。
当您连接到远程服务器时,通常只有 1 个通道用于正常用户交互(如果您认为 STDIN/STDOUT/STDERR 是独立的,则为 3 个通道)。本地或远程 ssh 进程可以随时在现有连接上打开其他通道。然后这些通道发送/接收隧道流量。当发送或接收任何流量时,ssh 进程只是简单地说“此流量用于通道 foobar”。
它本质上是这样工作的:
- 您告诉 ssh 开始侦听端口 XXXX,并且接收到的任何流量都应该通过隧道传输,然后发送到端口 ZZZZ 上的 YYYY。
- 本地 ssh 开始侦听端口 XXXX(通常在 上
127.0.0.1
,但可以更改)。 - 某些应用程序打开到本地计算机上端口 XXXX 的连接。
- 本地 ssh 打开一个到远程 ssh 的通道,并显示“此通道上的任何流量都会发送到 YYYY:ZZZZ”
- 远程 ssh 连接到 YYYY:ZZZZ 并发回“OK,通道已打开”
- 现在,连接到本地计算机上端口 XXXX 的任何流量都将通过 ssh 使用其创建的通道代理到 YYYY:ZZZZ。
对于前向和反向隧道,此过程完全相同(只需交换上述过程中的“本地”和“远程”一词)。任何一方都可以启动隧道。甚至不必是在您第一次启动 ssh 时。您可以在 ssh 运行时打开隧道(具体请参见man ssh
部分)。ESCAPE CHARACTERS
~C
-R
对于、-f
、-L
和的作用-N
,您确实应该查阅手册页,它为您提供了最好的解释。但我会提到-R
和-L
。
-R
告诉远程 ssh 侦听连接,并且本地 ssh 应连接到真正的目标。-L
告诉本地 ssh 侦听连接,并且远程 ssh 应连接到真正的目标。
请注意,这是一个非常粗略的描述,但它应该为您提供足够的信息来了解发生了什么
答案4
KISS - 您的计算机 = your_computer_ip / your_user_name_at_your_computer 远程服务器 = REMOTE_ip / remote_user_name
ON - /etc/ssh/sshd_config 文件中受 VPN 保护的计算机(远程服务器):
AllowTcpForwarding all
PermitTunnel yes
然后重新启动ssh:
sudo service ssh restart
(我们将端口 2222 配置为传入ssh 传输)(您需要持久性,您可以使用 tmux 或 -f 标志 -> ssh -f -R)** 仍受 VPN 保护 **
ssh -R 2222:localhost:22 your_user_name_at_your_computer@you_computer_ip
- ** 2222 不是随机端口!!**
- ** 只有 root 用户可以打开 1024 以下的端口 !!!**
您现在可以断开 VPN 或任何其他使用过的东西
在计算机上打开一个终端
您计算机上的 2222 端口现已映射到远程主机!
ssh localhost -p 2222 -l remote_user_name