在办公室里,我可以不使用代理连接到内部机器,但需要使用代理才能连接到外部机器。在办公室外,我可以不使用代理连接到其他外部机器,但需要使用 2 个代理之一才能连接到内部机器。
如果我能找到一种方法来自动检测我所在的网络,我可以指示 ssh 加载适当的配置文件吗?
如果没有,有没有比编写 shell 脚本将适当的配置文件符号链接到 ~/.ssh/config 更优雅的解决方案(这是我迄今为止最好的想法)?
编辑:我认为@pcm 和 JonnyRo 理解了我的问题,我会尝试他们的建议,但为了清楚起见,我想要
|--------\ Dest | abc.example.com | xyz.external.org |
| Source \---------\| | |
|--------------------+-----------------+------------------|
| example.com office | No Proxy | Proxy |
| outside | Proxy | No Proxy |
答案1
根据代理的配置方式,您可以简单地构建一个适用于任何情况的 SSH 配置条目。例如,在我经常使用的网络上,我必须先 ssh 到中间主机,然后才能建立出站连接。所以基本上我设置了一个如下所示的配置。
# proxy ssh
Host *%sshproxy
ProxyCommand ssh [email protected] /bin/netcat -w 1 $(echo %h | cut -d%% -f1) 22
Host myhost.example.org
HostName 172.16.24.1
Host otherhost.example.com
HostName 192.168.57.12
因此,当我不需要使用代理时,我可以简单地运行类似的命令ssh myhost.example.org
并连接,但是当我确实需要代理时,我会运行命令ssh myhost.example.org%sshproxy
。
我怀疑您可能设置了某种别名或自动完成设置,可以自动附加该%proxy
位。
答案2
老问题,但这个帖子中的一些想法对我有帮助,这是我想到的解决方案:
首先,代理服务器ssh 配置。
Match Originalhost proxy Exec "ifconfig | grep 10.0.1"
Hostname 10.0.1.2
Host proxy
Hostname external.hostname.com
然后,服务器 B配置:
Match Originalhost server-b Exec "ifconfig | grep 10.0.1"
ProxyCommand none
Host server-b
Hostname 10.0.1.3
ProxyCommand ssh -W %h:%p server-a
这里的想法是,默认情况下是从外部站点连接,并且 ProxyCommand 启动到代理人首先然后连接到服务器-b。另一方面,如果我们已经位于本地子网,ProxyCommand 将被禁用,并且没有代理连接到服务器-a已制作完成。
无论你身在何处,你都可以随时联系服务器-abc通过此条目和此设置可以确定您所在的位置并相应地设置连接。对于服务器-xyz,就用同样的想法。
我在这里做了更详尽的解释: http://blog.kihltech.com/2017/04/ssh-conditional-host-address-based-on-network-or-location/
答案3
您可以使用 -F 选项从不同的配置文件中进行选择。适用于两种网络情况。然后,您可以根据您所在的网络创建使用不同配置文件的别名,或者根据您的 IP 地址在登录脚本中设置单个别名。
答案4
.ssh/config 中的“Host”选项允许您根据目的地更改配置。我使用它来根据要去的地方调整端口转发等。