从 LAN(NAT 后面)到另一个 LAN(NAT 后面)的 SSH 动态端口转发 (SOCKS);具有可用公共 IP 地址的中间服务器

从 LAN(NAT 后面)到另一个 LAN(NAT 后面)的 SSH 动态端口转发 (SOCKS);具有可用公共 IP 地址的中间服务器

我需要有关如何建立正确的 ssh 连接的建议。

我的网络:

在此处输入图片描述

我希望能够使用在客户端 A 上配置了 SOCKS 的 FF 查看来自设备 B_1、B_2、B_3 的 Web 服务器内容。请注意,防火墙不允许传入连接,并且这一点无法更改。

我现在可以通过为每台机器(B_1、B_2、B_3)打开单个隧道来实现类似的功能,然后在 FF 中输入 http://localhost:5678 来浏览内容,而无需在客户端 A 上使用 SOCKS

在服务器 B -> B_1

ssh -f -n -T -R5678:192.168.1.2:80 user@serverA

在客户端 A 上

ssh -L 5678:localhost:5678 user@serverA

我认为我需要在服务器 B 上使用ssh -D才能连接到机器 B_1、B_2、B_3,只需在 FF 中输入 IP 地址,并在客户端 A 上设置 SOCKS localhost:5678,但我做错了,因为我无法让它工作。任何帮助都将不胜感激 :)

答案1

请参见如何使用创建 SOCKS 代理ssh. 这是摘录自我的答案在那里

一般情况下没有提供SOCKS代理的情况ssh是这样的:

A -> D

其中A是客户端(例如 Web 浏览器),D是服务器(例如 Web 服务器)。但是使用代理,情况如下:

A -> B -> C -> D

在哪里:

  • A表示使用 SOCKS 地址的单个客户端B:$port_number;可能有许多客户端。
  • B是运行的机器ssh -D $port_number C,也是 TCP$port_number监听来自任何的传入连接的机器A
  • C是连接到;通常从$hostname B到 的通信现在从到达。DADC
  • D是任何服务器,它都可以看到来自的通信C,但可能没有意识到AB参与其中;可能有许多服务器。

在某些特定使用情况下,其中一些字母可能指的是同一台机器。[…]

我想参考链接的答案。不幸的是,它使用大写字母AB命名一些(抽象)机器;而您的问题也使用它们来命名一些(真实)机器。为了减轻“冲突”,我将在链接答案的“命名空间”中使用独立字母;我将在您的问题的“命名空间”中使用更具描述性的术语,例如“服务器 B”。

您希望能够从“客户端 A”访问任何“服务器 B_?”。最终服务器应该看到来自“服务器 B”的连接。这意味着:

  • 你的“客户 A”A
  • 你的“服务器 B”是C
  • 任何“服务器 B_?”都是D

您需要选择B,因此A可以达到B并且B可以达到C。有几种可能的变体:

  1. 您的“服务器 B”可以B(并且仍然是C),只要您允许A通过 SSH 隧道访问它。 在您的例子中,这需要链接两个隧道(或隧道化一个隧道)。 有更简单的替代方案,因此我不会详细说明(暂时)。

  2. 您的“服务器 A”可以B,只要您允许它C通过 SSH 隧道到达 上的 SSH 服务器即可。这要求“服务器 A”上的 SOCKS 代理可从“客户端 A”(即A)访问,因此您需要将其公开可用或使用另一个隧道。这仍然不简单,我就不详细说明了。

  3. 您的“客户端 A”可以B(并且仍然是A),只要您允许它通过 SSH 隧道到达 SSH 服务器C。让我们这样做:

    # on Server B
    ssh -R 5678:localhost:22 userA@serverA
    

    这样,服务器 B 的 SSH 服务器(即C)就可以作为 使用了serverA:5678。假设您可以在服务器 A 上打开此 TCP 端口,那么现在您可以C从访问B

    # on Client A
    ssh -D 1234 -p 5678 userB@serverA
    

    是的,您指定是userB因为您真正连接的是“服务器 B”;使用对“服务器 B”有效的凭据。

    现在客户端 A(即A)上的浏览器应使用localhost:1234SOCKS 代理。要访问“服务器 B_?”,浏览器可能应该使用 URL,就好像浏览器位于“服务器 B”上一样(请参阅如果我使用 SSH 作为 SOCKS 代理,DNS 连接会通过它吗?)。

    注意,“服务器 B”的 SSH 服务器现在公开可用作serverA:5678。我的意思是,如果攻击者想要瞄准“服务器 B”并发现,serverA:5678那么他们的任务将比“服务器 B”完全隐藏在 NAT 后面时更容易。

    有了另一条隧道(总共两条链式隧道;或一条隧道隧道),就可以避免将“服务器 B”的 SSH 服务器暴露给公众。整个设置与 (1) 类似,不同之处在于隧道的内容和哪台机器充当B。为了完整起见,让我们按照下面的变体 4 来执行此操作。

  4. “客户端 A” 作为B(仍为A),由于链式隧道,不会暴露“服务器 B”的 SSH 服务器:

    # on Server B
    ssh -R 5678:localhost:22 userA@serverA
    

    # on Client A
    ssh -L 5678:localhost:5678 userA@serverA
    

    这使得“服务器 B”(即 )的 SSH 服务器在“客户端 A”(即 )上C可用。因此,就像在 (3) 中一样,您可以从访问,这次是这样的:localhost:5678BCB

    # on Client A
    ssh -D 1234 -p 5678 userB@localhost
    

    “客户端 A”(即)上的浏览器A应使用localhost:1234SOCKS 代理。从他们的角度来看,此变体与前一个变体完全相同。

答案2

如果没有 -J 选项,上述 #3 选项的答案将不起作用

#on Server B
ssh -R 5678:localhost:22 userA@serverA


#on Client A
ssh -D 1234 -J userA@serverA -p 5678 userB@localhost

GatewayPorts yes 

在 sshd 配置中

相关内容