SSH 反向隧道到 Linux 机器

SSH 反向隧道到 Linux 机器

我的配置与这个问题(相关图片如下):

在此处输入图片描述

我希望能够直接RPC-2LPC-1或通过 ssh 进入任意机器LPC-1。我可以控制路由器,LR但不能RR,当然也可以完全控制两台机器。

我按照原始问题的答案中提供的步骤进行操作,即:

  1. 在 LR 上> 将端口 22222 转发到 192.168.1.16 端口 22
  2. RPC-2>ssh -f -N -T -p22222 -R8022:localhost:22 42.48.128.49
  3. LPC-1>ssh -p8022 localhost

但是,当我运行步骤 3 时,似乎流量没有被正确转发到,RPC-2因为出现的密码挑战实际上是针对系统的LPC-1(唯一有效的凭据是)。我最终从userLPC1ssh 进入!LPC-1LPC-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 连接,您必须:

  1. 更改 LPC2 上的初始设置,-R*:8022:localhost:22告诉 LPC1 中的 sshd 在所有接口上监听(此隧道),而不仅仅是环回。您而是使用特定的绑定地址,-R192.168.1.16:8022:localhost:22但是在这个简单的设置中没有理由这样做。

  2. GatewayPorts on通常情况下, LPC1 中会有/etc/ssh/sshd_config这个选项。这通常不是默认选项,因此您需要更改它并重新启动 sshd(可能需要通过重新引导)。

允许 LAN 外部的机器使用 SSH此外

  1. 设置 LR 将 42.48.128.49 上的一些合适端口转发到 192.168.1.16 8022

  2. 然后外部机器执行(或使用等效方法)ssh [email protected] -pthatport.ssh/config

对于他人应用程序,可能如网页浏览,有几种替代方案:

  1. 添加另一个-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,这通常是必要的,因为服务器的证书包含其预定义的名称,如果浏览器/客户端请求的名称与证书中的名称不匹配,则连接失败。因此,您可能需要:

  1. 设置客户端计算机或程序(LPC1、LAN1 上的其他地方或外部)使用的名称解析,以便它们查找真实名称(“RPC2”或其他名称),但获取上面指定的地址,例如 127.0.0.1 或 192.168.1.16 或 42.48.128.49(视情况而定)。但在 LAN2 中,您必须将 RPC2 的“真实”名称解析保留为其真实地址 192.168.2.72。如果您只有一台或几台计算机,并且没有或很少更改,则可以使用 /etc/hosts 文件相当简单地完成此操作;否则,您可能需要某种“拆分”或“本地化”或完全伪造的 DNS。这可以非常复杂且没有“任意”的解决方案;您需要指定细节,并且可能针对不同的细节集实施几种不同的解决方案。

因此,如果您已经到达这一点,您可能需要考虑:

  1. 改用 VPN。与 SSH 隧道不同,VPN 是一种旨在实际实现“隔离”子网之间联网的技术,以便网络协议和应用程序正常运行而无需更改。

相关内容