我需要有关如何建立正确的 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
到 的通信现在从到达。D
A
D
C
D
是任何服务器,它都可以看到来自的通信C
,但可能没有意识到A
并B
参与其中;可能有许多服务器。在某些特定使用情况下,其中一些字母可能指的是同一台机器。[…]
我想参考链接的答案。不幸的是,它使用大写字母A
来B
命名一些(抽象)机器;而您的问题也使用它们来命名一些(真实)机器。为了减轻“冲突”,我将在链接答案的“命名空间”中使用独立字母;我将在您的问题的“命名空间”中使用更具描述性的术语,例如“服务器 B”。
您希望能够从“客户端 A”访问任何“服务器 B_?”。最终服务器应该看到来自“服务器 B”的连接。这意味着:
- 你的“客户 A”
A
是 - 你的“服务器 B”是
C
, - 任何“服务器 B_?”都是
D
。
您需要选择B
,因此A
可以达到B
并且B
可以达到C
。有几种可能的变体:
您的“服务器 B”可以
B
(并且仍然是C
),只要您允许A
通过 SSH 隧道访问它。 在您的例子中,这需要链接两个隧道(或隧道化一个隧道)。 有更简单的替代方案,因此我不会详细说明(暂时)。您的“服务器 A”可以
B
,只要您允许它C
通过 SSH 隧道到达 上的 SSH 服务器即可。这要求“服务器 A”上的 SOCKS 代理可从“客户端 A”(即A
)访问,因此您需要将其公开可用或使用另一个隧道。这仍然不简单,我就不详细说明了。您的“客户端 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:1234
SOCKS 代理。要访问“服务器 B_?”,浏览器可能应该使用 URL,就好像浏览器位于“服务器 B”上一样(请参阅如果我使用 SSH 作为 SOCKS 代理,DNS 连接会通过它吗?)。注意,“服务器 B”的 SSH 服务器现在公开可用作
serverA:5678
。我的意思是,如果攻击者想要瞄准“服务器 B”并发现,serverA:5678
那么他们的任务将比“服务器 B”完全隐藏在 NAT 后面时更容易。有了另一条隧道(总共两条链式隧道;或一条隧道隧道),就可以避免将“服务器 B”的 SSH 服务器暴露给公众。整个设置与 (1) 类似,不同之处在于隧道的内容和哪台机器充当
B
。为了完整起见,让我们按照下面的变体 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:5678
B
C
B
# on Client A ssh -D 1234 -p 5678 userB@localhost
“客户端 A”(即)上的浏览器
A
应使用localhost:1234
SOCKS 代理。从他们的角度来看,此变体与前一个变体完全相同。
答案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 配置中