我使用 ssh 命令通过 proxyjump 使用中间节点登录远程节点。远程节点和中间节点是 Linux 服务器,我的客户端是 Macbook。此命令有效,如下所示:
ssh -i .ssh/id_file -J user1@jump_node -A -D remote_port user2@remote_node
其中,我将 jump_node 和 remote_node 替换为中间节点和远程节点的主机名,并将 remote_port 替换为 remote_node 上的 sshd 端口。
我的第一个也是主要的问题是:如何将此命令变成配置部分我可以将其放入 .ssh/config 文件中吗?我查看了 ssh 手册页,但无法找到-D
和-A
标志(我猜ForwardAgent yes
是-A
?)的相应配置选项。有人可以解释一下这些标志以及如何使用此命令创建正确的配置部分吗?
我的另一个问题不太重要,但可以帮助我了解这里发生的事情。第二个问题是关于我发出稍微不同的命令时出现的错误。
我在网上读到的大多数文档都建议使用这样的命令:
ssh -i .ssh/id_file -J user1@jump_node user2@remote_node:remote_port
但是当我尝试此命令(带有和不带有标志-A
)时,出现以下错误:
channel 0: open failed: connect failed: Name or service not known
stdio forwarding failed
kex_exchange_identification: Connection closed by remote host
Connection closed by UNKNOWN port 65535
我无法弄清楚这个错误意味着什么以及我是否可以使用它的一些提示?
答案1
ForwardAgent yes
IdentityFile .ssh/id_file
Host jump_node
User user1
Host remote_node
ProxyJump jump_node
User user2
然后运行ssh remote_node
。
ProxyJump
如果您还为其指定了(另一个),您甚至可以通过这种方式构建一个链jump_node
。
第二个问题是ssh user2@remote_node:remote_port
语法不正确。错误消息指出Name or service not known
,因为它尝试(但失败)将其解析remote_node:remote_port
为主机名(是的,带有内嵌冒号),这remote_node
可能与您预期的不一样。尝试在没有的情况下运行相同的程序-J
,错误消息会稍微清晰一些。
我将其解释为尝试指定 SSH 服务器在远程节点上监听的端口;为此,请使用-p
命令行参数或Port
配置文件中的主机条目选项。
这与命令行开关没有任何共同之处-D
。它的参数不是“远程端口”。相反,该开关的作用完全不同,即它使 SSH 客户端听在指定端口上在本地机器上并接受 SOCKS 连接,远程将用作出口节点。例如,您可以在本地浏览器中配置它,这样它将通过 SSH 隧道访问互联网,第三方(Web 服务器)将看到您的连接来自远程主机的 IP;除了 SSH 服务器(在这种情况下,它将看到跳转服务器的地址),没有人会看到您的“真实”IP。要设置这在配置中,您使用DynamicForward
配置文件中的选项。