在下面的示例架构中我将如何使用 SSH 隧道?
场景:我已物理登录到 Windows PC Local,并希望使用端口 3389 远程桌面进入 Windows PC Remote。Windows PC Local 和网络 A Linux 服务器之间有防火墙,只允许我从本地 PC 通过 SSH 连接到网络 A 上的 Linux 服务器。是否可以在网络 A Linux 服务器上建立一条通往 Windows PC Remote 的反向隧道?我认为必须建立 3 条或更多隧道并将其链接在一起才能实现此目的,但我不知道如何做或是否可行。
Windows PC Local Linux Server .-,( ),-. can ssh Linux Server Windows PC Remote
__| _ __| _ .-( )-.-----------------> .-,( ),-. __| _ __ _|
[__]|=|-----------[__]|=|---( Network A ) .-( )-. [__]|=|-------[__]|=|
/::/|_| /::/|_| '-( ).-' ( Network B )--/::/|_| /::/|_|
'-.( ).-' <----------------- '-( ).-'
can't ssh '-.( ).-'
答案1
您实际上可以通过两个 Linux 服务器之间的单个 SSH 隧道来实现这一点,更具体地说,从网络 A 上的隧道到网络 B 上的隧道(可以使用 SSH 的方向)。
假设你想通过远程桌面进入远程 Windows 计算机(网络 B 侧的计算机),那么你需要一个直接的SSH 隧道。
(如果您想通过在网络 A 中的 Linux 服务器上发起的 SSH 连接将网络 A 中的机器上的服务公开到网络 B 中的机器,则可以使用反向 SSH 隧道。)
为了理解如何设置,让我们为所涉及的机器和接口分配一些 IP 地址和名称。否则,很难理解哪些确切的地址和名称应该放在哪里。
我们将这些地址用于本地网络:
Windows PC Local Linux Server .-,( ),-.
__| _ __| _ .-( )-.
[__]|=|--------------------------[__]|=|-----------( Network A )
/::/|_| /::/|_| '-( ).-'
192.168.10.7 192.168.10.4 301.2.3.4 '-.( ).-'
workstation7 linrouter4 a.example.com
然后是远程网络的地址:
Linux Server Windows PC Remote
.-,( ),-. __| _ __ _|
.-( )-. [__]|=|--------------------------[__]|=|
( Network B )------------/::/|_| /::/|_|
'-( ).-' 321.9.8.7 172.24.10.99 172.24.10.76
'-.( ).-' b.example.net gateway1.lan remote76.lan
仅可视化两个 Linux 服务器之间的互连:
Linux Server .-,( ),-. can ssh Linux Server
__| _ .-( )-.------------> .-,( ),-. __| _
[__]|=|-----------( Network A ) .-( )-. [__]|=|
/::/|_| '-( ).-' ( Network B )------------/::/|_|
301.2.3.4 '-.( ).-' <------------ '-( ).-' 321.9.8.7
a.example.com can't ssh '-.( ).-' b.example.net
因此,为了创建一个允许您连接到远程 Windows 机器的 SSH 隧道,您需要:
linrouter4$ ssh-L 192.168.10.4:3389:remote76.lan:3389 [电子邮件保护]
建立 SSH 连接后,workstation7
您可以从 Windows 机器上打开到默认端口的 RDP 连接,您将获得到远程主机上linrouter4
Windows 机器的转发连接。remote76.lan
隧道使用-L
标志配置为 SSH,最多可容纳 4 个以冒号分隔的地址或端口。
第一对表示在网络上接收连接的地址和端口当地的主机。IP 地址必须是在当地的当然是主机,否则主机将无法接收该地址的连接...我们linrouter4
在本地网络中使用地址,以便本地网络中的其他机器能够访问该隧道。
下一个项目是本地端口。我们使用默认端口 3389,因此我们的 RDP 客户端可以连接到默认端口。如果您正在配置多个 SSH 隧道或使用该端口在该计算机上运行其他服务,则可能需要选择备用端口,在这种情况下,您必须重新配置 RDP 客户端以连接到非标准端口。对于这个简单的示例,我们通过使用默认端口来绕过该端口。
最后一对地址和端口是当连接到达另一端的隧道时我们的目标主机 ( ) 应该连接的地址和端口。请注意,名称解析将在目标主机上进行,因此即使本地计算机无法解析该名称,gateway1.lan
我们也可以使用名称。remote76.lan
linrouter4
最后,我们有远程端口,它再次是默认值 3389。
然后我们使用常规参数连接到远程主机,使用其外部地址( )并根据需要b.example.net
指定用户名( )。还可以传递身份验证或其他设置所需的任何其他参数。myuser
该-L
标志也可以只采用 3 个项目而不是 4 个,在这种情况下会跳过本地地址。例如,-L 3389:remote76.lan:3389
。但这只会在本地主机 (127.0.0.1) 上公开它,这意味着它linrouter4
本身可以通过隧道打开连接,但不能打开连接到该机器的其他主机。(换句话说,我们需要完整的规范。)
最后,请注意,我们对远程主机使用了主机名,但我们也可以使用 IP。对于本地主机也一样,我们可以使用名称而不是 IP,假设机器会将名称解析为内部 IP。
也可以:
-L 192.168.10.4:3389:172.24.10.76:3389
-L linrouter4:3389:remote76.lan:3389
此外,您可以'*'
在本地端使用让该主机接受连接任何接口:-L '*:3389:remote76.lan:3389'
。(请注意,使用时需要使用引号,*
因为 shell 可以将其解释为元字符。)使用*
并不理想,因为这意味着来自网络 A(互联网?)的访问可能能够使用 SSH 隧道到达远程网络中的受保护主机。使用显式内部专用地址肯定是一种更安全的配置(即使您可能会将该隧道暴露给所有的内部网络,除非您明确设置防火墙以仅允许特定主机。)