我的配置与这个问题(相关图片如下):
我希望能够直接RPC-2
从LPC-1
或通过 ssh 进入任意机器LPC-1
。我可以控制路由器,LR
但不能RR
,当然也可以完全控制两台机器。
我按照原始问题的答案中提供的步骤进行操作,即:
- 在 LR 上> 将端口 22222 转发到 192.168.1.16 端口 22
- RPC-2>
ssh -f -N -T -p22222 -R8022:localhost:22 42.48.128.49
- LPC-1>
ssh -p8022 localhost
但是,当我运行步骤 3 时,似乎流量没有被正确转发到,RPC-2
因为出现的密码挑战实际上是针对系统的LPC-1
(唯一有效的凭据是)。我最终从userLPC1
ssh 进入!LPC-1
LPC-1
对于如何正确设置的任何想法或建议都将受到赞赏!
干杯
答案1
你的 SSH 隧道是正确的,但是当你ssh
在 LPC1 上运行时作为用户LPC1如果不指定用户 ID,它就会通过隧道连接到 RPC2,但是以用户LPC1身份登录即与您运行的系统相同的用户 ID ssh
。
指定正确的用户 ID,如ssh -p8022 userRPC2@localhost
。
或者可能更好,输入.ssh/config
类似
Host tunneltoRPC2
Hostname localhost
Port 8022
User userRPC2 # optional
因此您可以说ssh tunneltoRPC2
(或者userRPC2@tunneltoRPC2
如果您省略User
)并且它实际上将连接到/通过本地主机 8022。
补充:第一次看的时候我错过了“任意机器”,直到你提醒我,并澄清了(一些)。这变得更加复杂,尤其是对于事情以外像浏览器一样使用 SSH。步骤如下:
为了使 LAN1 中的其他机器(LPC1 除外)也能以类似的方式与 RPC2 建立 SSH 连接,您必须:
更改 LPC2 上的初始设置,
-R*:8022:localhost:22
告诉 LPC1 中的 sshd 在所有接口上监听(此隧道),而不仅仅是环回。您能而是使用特定的绑定地址,-R192.168.1.16:8022:localhost:22
但是在这个简单的设置中没有理由这样做。GatewayPorts on
通常情况下, LPC1 中会有/etc/ssh/sshd_config
这个选项。这通常不是默认选项,因此您需要更改它并重新启动 sshd(可能需要通过重新引导)。
允许 LAN 外部的机器使用 SSH此外:
设置 LR 将 42.48.128.49 上的一些合适端口转发到 192.168.1.16 8022
然后外部机器执行(或使用等效方法)
ssh [email protected] -pthatport
.ssh/config
对于他人应用程序,可能如网页浏览,有几种替代方案:
- 添加另一个
-R
示例,如果对于 HTTP,您想将 LPC1 上的 80 转发到 LPC2 上的 80。-R[:]80:localhost:80
然后让 LPC1、其他 LAN1 机器或外部的程序按照上述规则在 LPC1 上/通过 LPC1 发出请求。(但请参阅下面有关 HTTP 的注释。)这意味着,如果/当端口集发生变化时,您需要重新启动从 RPC2 到 LPC1 的“基础”SSH(中断任何正在进行的操作)——除非您使用最近的 OpenSSH 的“ControlMaster”功能,这会变得更加复杂——因此,您可能只在端口集是静态的或几乎是静态的时才需要这样做。
5A:(基础保持不变)在 LPC1 上运行ssh -N userRPC2@localhost -L80:localhost:80
,现在如果 LPC1 上的程序连接到 localhost:80 或 192.168.1.16:80,它们实际上将获得 RPC2:80。LAN1 上其他地方的机器必须使用后者,而外面的机器必须使用转发到该端口的 42.48.128.49:someport。
5B:如果客户端应用程序支持 SOCKS,(离开基础)在 LPC1 上运行ssh -N userRPC2@localhost -Dsomeport
,然后让 LPC1 上的程序使用 localhost:someport作为 SOCKS 代理连接到 localhost:80 或 somename:80 时,其中 somename 解析为 127.0.0.1,这两个地址实际上都是 RPC2:80。在 LAN1 的其他地方,使用 192.168.1.16:someport 作为代理(但仍将目标指定为 localhost 或解析为 127.0.0.1 的其他地址),在外部使用 42.48.128.49:routerport,该地址转发到 192.168.1.16:someport(同上)。
但是对于某些应用程序特别在 Web(HTTP/S)上,这可能行不通。对于许多传统网络应用程序来说,连接到正确的地址和端口就足够了,即使通过看起来不同的地址或名称和端口也是如此。但对于 HTTP/1.1,通常需要使用服务器的“真实”名称(即 RPC2 或某些变体或别名)进行连接,因为这在 HTTP 协议中用于选择/传递正确的内容,并且对于所有版本的 HTTPS,这通常是必要的,因为服务器的证书包含其预定义的名称,如果浏览器/客户端请求的名称与证书中的名称不匹配,则连接失败。因此,您可能需要:
- 设置客户端计算机或程序(LPC1、LAN1 上的其他地方或外部)使用的名称解析,以便它们查找真实名称(“RPC2”或其他名称),但获取上面指定的地址,例如 127.0.0.1 或 192.168.1.16 或 42.48.128.49(视情况而定)。但在 LAN2 中,您必须将 RPC2 的“真实”名称解析保留为其真实地址 192.168.2.72。如果您只有一台或几台计算机,并且没有或很少更改,则可以使用 /etc/hosts 文件相当简单地完成此操作;否则,您可能需要某种“拆分”或“本地化”或完全伪造的 DNS。这可以非常复杂且没有“任意”的解决方案;您需要指定细节,并且可能针对不同的细节集实施几种不同的解决方案。
因此,如果您已经到达这一点,您可能需要考虑:
- 改用 VPN。与 SSH 隧道不同,VPN 是一种旨在实际实现“隔离”子网之间联网的技术,以便网络协议和应用程序正常运行而无需更改。