我~/.ssh/config
配置了各种主机,这些主机可以在我们公司的 VPN 上或通过 SSH 代理服务器访问。
目前我只有
Host internal-server
ProxyCommand ssh -W internal.ip:22 external-server
但是,如果我在内部网络中,我可以直接访问内部 ip,因此通过外部服务器代理只会增加连接延迟。
如果内部IP无法访问,有没有办法可以临时代理,否则直接连接?
我~/.ssh/config
配置了各种主机,这些主机可以在我们公司的 VPN 上或通过 SSH 代理服务器访问。
目前我只有
Host internal-server
ProxyCommand ssh -W internal.ip:22 external-server
但是,如果我在内部网络中,我可以直接访问内部 ip,因此通过外部服务器代理只会增加连接延迟。
如果内部IP无法访问,有没有办法可以临时代理,否则直接连接?
我通常设置这样的东西。它假定中间主机将能够解析名称。
所以我会连接到 like
ssh blah%homeproxy
。我使用不同的方法来使用 Match。就我而言,如果它正在运行,我想使用本地代理,如果没有,我想使用它。以下指令很好地完成了这一点:
它匹配每次 ssh 尝试,并执行快速检查,
nc
以查看我的代理是否已启动并在 1086 上运行(在这种情况下,nc
退出时没有错误)。如果发生这种情况,它会设置 ProxyCommand。感谢@till 的回答,它给了我很多启发。
我发现你可以强制重定向你的连接
ProxyCommand nc dst dst-port
。例如,
B.com
如果您使用,您实际上将连接到但
UserKnownHostsFile
仍会记录为A.com
因此,您可以将域“auto”添加到您的
ssh_config
我替换
nc -w 1 %h %p
为(timeout 0.1 nc -z %h %p) && nc %h %p
,如果您能在 100 毫秒内到达内部服务器,它会更快。或者您可以替换为
ping
,但如果您使用基于 TCP 的代理(如proxychains
)或服务器不允许 ICMP 回显,则它可能表示错误信息。您可以
(timeout 0.1 nc -z %h %p)
用任何检测您是否在内部服务器中的东西替换。如果您有多个候选 IP,即使您也可以使用:
它将尝试连接
1.1.1.1
,如果失败尝试连接2.2.2.2
,然后3.3.3.3
。十年前,我为这种场景编写了一个代理命令。在您的用例中,我的代理命令可以这样使用:
一些警告:我有点尴尬地承认,它不处理 IPv6,并且它只会尝试每个主机名的单个 IP 地址。此外,在发送服务器横幅之前,它不会将客户端横幅传输到服务器。但这不太可能引起问题。
这会更自动地工作一点点额外的 0.1 秒延迟:
(评论没有足够的声誉,所以另一个答案,无论如何都是这样。)
除了domoarigato 回答谁使用
Match exec
添加代理命令之外,您也可以在Match host
那里添加一个。这样,匹配执行将仅在该主机上执行,这非常重要,因为您希望 a) 此代理仅在此主机上,并且 b) 不会减慢您使用此命令对所有主机的 ssh 连接。它也不会更改用于 ssh 的名称,这对我的实际使用非常重要:在脚本、快捷方式、配置文件等中具有相同的 ssh 主机名。我想这是 OP 的主要愿望(至少它当我偶然发现这个问题时,是给我的)。我的 ssh_config 看起来像:
(请注意,我还在端口扫描中添加了一个
-w 1
选项,该选项nc
是一秒超时,因为过滤后的端口将永远使用此命令完成 - 即使 1 秒也可能令人厌烦,因此欢迎任何更好的解决方案!)我通常会创建另一个类似这样的条目——
然后根据您当前的代理环境调用您想要的那个。
使用 Match 和 Exec 可以检查 SSH 端口是否可访问,如果不能访问,则仅使用 ProxyCommand。在此处查看我的示例: https ://stackoverflow.com/questions/40746463/how-to-automatically-switch-ssh-config-based-on-local-subnet/62924483#62924483