游戏中有三台计算机。全部都是 Linux 计算机。
笔记本电脑:我的工作用笔记本电脑,运行 Linux,几乎可以用它做任何事情。可以将其设置为可通过互联网访问
RootServer (RS):此服务器位于防火墙和许多不同系统后面,只能通过 Web 界面访问,这为我提供了一个糟糕的 Web 终端。但它确实可以完全访问互联网,我甚至在这里拥有 root 访问权限。
Web 服务器 (WS):在端口 80、8000、8001、443 和其他一些端口上提供一些网页。除了网页之外,没有其他途径可以访问此机器。我不知道防火墙设置中的具体情况,但 RS 机器可以访问此处的网页。
所以这里的问题是,我需要某种方式来访问 WS 上的网页,就好像我和 RS 在同一个网络上一样,所有这些都通过我的笔记本电脑进行,而我的笔记本电脑无法直接连接到 RS。但是 RS 可以连接到 WS 和我的笔记本电脑。
我在想应该有某种 SSH 魔法可以让我做这样的事情:
(浏览网页)笔记本电脑 <- RS --> WS(托管网页)
有人知道怎么做吗?
答案1
分析
您所需要的 SSH 魔法的关键部分描述如下:如何使用创建 SOCKS 代理ssh
。 按照我的答案在那里,有两种情况:
-
- 笔记本电脑=
A
=B
- RS=
C
- WS=
D
- 笔记本电脑=
-
- 笔记本电脑=
A
- RS=
B
=C
- WS=
D
- 笔记本电脑=
在第一种情况下,您需要通过 SSH 从笔记本电脑访问 RS(B -> C
)。在第二种情况下,您需要在 RS 上打开一个监听端口,以便笔记本电脑可以连接到它(A -> B
)。
由于 RS “位于防火墙和许多不同系统后面”,并且“只能通过 Web 界面访问”,我认为您的“此处的 root 访问权限”不足以使某些端口(无论是否使用 SSH)公开可访问。因此,您很可能需要创建一个隧道,以便您的笔记本电脑可以访问 RS。
无论选择哪种场景,要求都是相同的:
- 笔记本电脑上的 SSH 服务器能够接受来自 RS 的连接。
- RS 上的 SSH 客户端能够访问笔记本电脑。
- RS 上的 SSH 服务器能够接受从 RS 本身到 RS 本身的连接。
- 笔记本电脑上的浏览器能够使用 SOCKS。
此外,场景 1 要求笔记本电脑上有 SSH 客户端。这个要求可能微不足道。
我认为,如果一种方案可行,那么另一种方案也会可行。
场景 1
创建一个隧道,以便您
ssh
稍后可以从笔记本电脑到 RS:# on RS ssh -R 7722:localhost:22 Laptopuser@Laptop
此处 7722 为任意端口。您可能无法绑定到小于 1024 的端口。22 是 RS 上的 SSH 服务器的端口(必要时可调整)。
ssh
使用动态端口转发(SOCKS代理)的RS:# on the Laptop ssh -p 7722 -D 7780 RSuser@localhost
7780 是任意端口。
在笔记本电脑上设置浏览器,以便将其用作
localhost:7780
SOCKS 代理。要访问 WS,请使用 URL,就像浏览器在 RS 上一样。
请注意,您的笔记本电脑的其他用户(例如通过 SSH 连接的用户)localhost:7780
也可以使用它来访问 WS。
场景 2
准备动态端口转发(SOCKS代理):
# on RS ssh -D 7781 RSuser@localhost
此处 7781 是任意端口。您可能无法绑定到编号低于 1024 的端口。
创建到代理的隧道:
# on RS ssh -R 7780:localhost:7781 Laptopuser@Laptop
7780 是任意端口。我使用了不同的数字(7780 和 7781)来表明它们可以不同;但它们也可以相同,在这种情况下这并不重要。
在笔记本电脑上设置浏览器,以便将其用作
localhost:7780
SOCKS 代理。要访问 WS,请使用 URL,就像浏览器在 RS 上一样。
注意,RS 的其他用户可以使用localhost:7781
SOCKS 代理。这可能没什么区别,因为他们可能无论如何都能访问 WS。或者这可能会有很大的不同,因为他们将使用由您用户下运行的代理发起的从 RS 到 WS 的连接(RSuser
)和用户可能很重要。
同样,您的笔记本电脑的其他用户(例如通过 SSH 连接的用户)也可以使用它localhost:7780
来访问 WS。
笔记
考虑
-N
或-N -f
选择ssh
(见man 1 ssh
); 或者autossh
。