为反向隧道+本地转发创建 ssh 配置

为反向隧道+本地转发创建 ssh 配置

我正在尝试创建 ~/.ssh/config 条目对于以下场景:

我有一个linux盒子在某个私有网络中,VPS服务器可以从任何地方访问我的本地MacBook

Linux 盒子位于防火墙后面,但我仍然应该能够从本地 MacBook 通过 SSH 进入该盒子。


我当前有效的解决方案如下:

Linux 盒子通过以下方式启动到 vps 的反向隧道:

ssh -R 15000:localhost:22 vps-user@vps

然后从我本地的 macbook 通过以下方式启动通往 vps 的隧道:

ssh -L 12345:localhost:1500 vps-user@vps

然后我启动另一个 ssh 命令,从那里我可以直接 ssh 进入 linux 盒子,否则它会隐藏在防火墙等后面:

ssh linuxbox-user@localhost -p 12345

首先,这一切都非常可靠(如果你有任何更简单的方法来做到这一点,请告诉我 - 在 MacBook 方面这似乎相当麻烦)。

在最好的情况下,我将如何创建 ~/.ssh/config 条目,只需编写:

ssh linuxbox

就这样结束了吗?

我尝试过使用本地转发选项,它允许我至少为ssh -L ...命令,但它仍然需要第二个 ssh 命令。

我也尝试过代理命令选项但没有运气,也许只是错误的配置?

答案1

最简单的方法可能是避免本地转发,这在您的情况下似乎是不必要的,并利用该ProxyJump指令,它允许您指定一个或多个跳转代理(即您连接的一个或多个中间主机以及您从其中到达的主机)您的目标主机)。

您将需要两个连接:

  1. 您已经建立的从 Linux 主机到 vps 的远程转发:

    ssh -R 15000:localhost:22 vps-user@vps
    

    我假设您可以连接到端口上的 vps 22(正如您的问题中所暗示的那样)。
    这将使 vps 将其在端口上收到的连接转发到您的 Linux 盒子的15000端口。22

  2. 从本地 MacBook 到 vps 的连接:

    ssh -J vps-user@vps -p 15000 linuxbox-user@localhost
    

    -J是指定指令的快捷方式ProxyJump(请参阅 的手册页ssh(1))。
    同样,这意味着您可以连接到端口 上的 vps 22
    此命令会将您的本地 MacBook 连接到22vps 上的端口,然后从那里连接到15000同一 vps 上的端口(linux 盒子正在监听),让您无需进一步连接即可登录到您的 linux 盒子。

相应的.ssh/config文件将是:

  • 在你的 Linux 机器上:

    Host vps
        RemoteForward 15000 localhost:22
        User          vps-user
    

    这允许您只需输入:

    ssh vps
    
  • 在本地 MacBook 上:

    Host linuxbox
        ProxyJump vps-user@vps
        Hostname  localhost
        Port      15000
        User      linuxbox-user
    

    这让你只需要发出:

    ssh linuxbox
    

如果您正在使用公钥身份验证(正如您可能正在做的那样,至少允许远程转发的无人值守设置),您还可以将该IdentityFile指令添加到两个.ssh/config文件中,以消除输入密码的需要。


如果满足某些条件,您也许还可以直接将本地 MacBook 连接到15000vps 上的端口,从而无需本地转发或代理跳转。即,条件是:

  1. vps 上的端口15000没有被防火墙过滤。

  2. GatewayPorts yessshdvps 上设置 的配置(通常在 中/etc/ssh/sshd_config)。
    此设置默认为no并确定远程转发是否可以将侦听端口绑定到除环回端口之外的其他地址(因此,IP 地址不是127.0.0.1::1)。请参阅手册页sshd_config(5)以获取更多信息。

在这种情况下,您只需要这两个命令:

  1. 从你的linux机器到vps的反向转发(注意*:前面的远程端口,它代表“监听任何地址”):

    ssh -R *:15000:localhost:22 vps-user@vps
    
  2. 从 MacBook 到 vps 的简单连接:

    ssh -p 15000 -l linuxbox-user vps
    

其翻译成以下.ssh/config文件:

  • 在你的 Linux 机器上(再次注意*:前面的远程端口):

    Host vps
        RemoteForward *:15000 localhost:22
        User          vps-user
    
  • 在本地 MacBook 上:

    Host linuxbox
        Hostname  vps
        Port      15000
        User      linuxbox-user
    

但请注意,这种方式你将把你的 linux 盒子暴露在互联网上,这很可能是您不想要的。

答案2

我假设 Linux 机器会自动执行到 VPS 的反向隧道,因为如果您可以从 MacBook 上执行此操作,则无需这样做。

所以你在 MacBook 上需要做的就是:

  • 编写一个 bash 脚本:

    #!/bin/bash
    ssh -f -N -L 12345:localhost:1500 vps-user@vps
    sleep 5
    ssh -f -N linuxbox-user@localhost -p 12345
    
  • 确保它是可执行的chmod +x /path/to/script

  • 然后在末尾创建一个别名/home/username/.bashrc

    alias sshlinuxbox="/path/to/script"
    
  • 然后您所要做的就是sshlinuxbox在打开新终端后键入以从 .bashrc 刷新。

答案3

这行是正确的,但令人困惑:

  1. 从 MacBook 到 vps 的简单连接:

ssh -p 15000 -l linuxbox-用户 vps

“-l”是登录名,在 ssh 中不常用

一个更简单的命令是这样的:

ssh -p 15000 linuxbox-user@vps

解释:当“linuxbox”与反向 ssh 连接(类型 R)连接时,其连接被转发到 vps 服务器上的端口 15000。现在,笔记本电脑访问 vps 服务器上的“linuxbox”,笔记本电脑需要在 vps 服务器上寻址 linuxbox 用户。因此是 linuxbox-user@vps。

另外,如果您建立连接并且您的远程 linuxbox 需要密码,您将收到提示: linxubox-user@vps 的密码:此时您需要实际输入 linuxbox-users 密码。

相关内容