让 SSH 在本地 SOCKS 监听可用时使用它
把 OpenSSH 的 Match exec 检查限定到单个目标,并弄清一次成功的本地端口探测能证明什么、不能证明什么。
本地 SOCKS 监听在某些网络上可用,在另一些网络上则不存在。OpenSSH 可以按条件选择代理命令,而不必让这一选择作用于所有主机。
对于使用 OpenBSD 版 nc 的 OpenSSH,一个示例客户端配置如下:
Host work-server
HostName ssh.example.net
User alex
Match originalhost work-server exec "nc -z -w 1 127.0.0.1 1080"
ProxyCommand nc -X 5 -x 127.0.0.1:1080 %h %p
Match all
originalhost 把检查限定在 SSH 命令行给出的名称上。exec 在其命令成功退出时匹配。末尾的 Match all 结束该条件作用域,后续设置不再受其影响。
这假定此前没有任何生效的设置已经选出冲突的代理命令或跳板路径。SSH 通常对某个选项采用最先取到的值,因此文件顶部一条宽泛的默认值可能让后面的条件无法产生预期效果。
正在监听的套接字只是一个有限的承诺
这次探测检验的是能否通过 TCP 访问本地端口。它并不完成 SOCKS 协商,不建立所需的目标连接,也不能证明该端口归哪个程序所有。检查之后监听者还可能消失。
超时限制让失败的探测保持在有限范围内。所示选项属于 OpenBSD 的 nc 接口;同名程序的其他实现可能提供不同的选项。
当条件不匹配时,这个示例让连接不带该 ProxyCommand,从而允许其走常规路由。只有在允许直连时这样做才合适。强制代理策略不应当把可用性检查当作改走其他路由的许可。
目标 SSH 主机名与主机密钥校验仍然负责确认目的服务器。选择传输辅助工具,并不构成接受意外主机密钥的理由。