我正在尝试创建 ~/.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
指令,它允许您指定一个或多个跳转代理(即您连接的一个或多个中间主机以及您从其中到达的主机)您的目标主机)。
您将需要两个连接:
您已经建立的从 Linux 主机到 vps 的远程转发:
ssh -R 15000:localhost:22 vps-user@vps
我假设您可以连接到端口上的 vps
22
(正如您的问题中所暗示的那样)。
这将使 vps 将其在端口上收到的连接转发到您的 Linux 盒子的15000
端口。22
从本地 MacBook 到 vps 的连接:
ssh -J vps-user@vps -p 15000 linuxbox-user@localhost
-J
是指定指令的快捷方式ProxyJump
(请参阅 的手册页ssh(1)
)。
同样,这意味着您可以连接到端口 上的 vps22
。
此命令会将您的本地 MacBook 连接到22
vps 上的端口,然后从那里连接到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 连接到15000
vps 上的端口,从而无需本地转发或代理跳转。即,条件是:
vps 上的端口
15000
没有被防火墙过滤。您
GatewayPorts yes
在sshd
vps 上设置 的配置(通常在 中/etc/ssh/sshd_config
)。
此设置默认为no
并确定远程转发是否可以将侦听端口绑定到除环回端口之外的其他地址(因此,IP 地址不是127.0.0.1
或::1
)。请参阅手册页sshd_config(5)
以获取更多信息。
在这种情况下,您只需要这两个命令:
从你的linux机器到vps的反向转发(注意
*:
前面的远程端口,它代表“监听任何地址”):ssh -R *:15000:localhost:22 vps-user@vps
从 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
这行是正确的,但令人困惑:
- 从 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 密码。