SSH 通过代理连接服务器
老规矩,欧博官网先说结论: # 用于 macOS,FreeBSD 未经测试 $ ssh -o ProxyCommand="nc -X connect/4/5 -x proxy.net:port %h %p" user@server.net或者: # 如果代理服务器需要认证,可以使用 nc 的升级版 ncat 指定代理服务器的用户名和密码 $ ssh -o ProxyCommand="ncat --proxy-type http/socks4/socks5 --proxy proxy.net:port --proxy-auth proxyuser:proxypwd %h %p" user@server.net注意:由于 macOS 版 Ncat 的 7.90 和 7.91 版本的 bug,上述方式不再生效。起码 7.91 版本在 macOS 10.15.7 上是不行的。此问题在 7.92 版本中已经解决。 具体原因参见:https://nmap.org/changelog.html [Ncat][GH#2149] Fixed a bug in proxy connect mode which would close the connection as soon as it was opened in Nmap 7.90 and 7.91. 但 Linux 上没问题。所以增加个 socat 的替补方案: # 主机:user@server.net # 代理::proxypwd@proxy.net:30808 $ ssh -o \ ProxyCommand='socat - proxy:proxy.net:%h:%p,proxyport=your_port,proxyauth=proxyuser:proxypwd' \ user@server.netScout 本身很强大,但对代理的支持这部分貌似差一些,只支持 SOCKSv4 和 HTTP Proxy,不支持 SOCKS5。详情参考《socat 初窥门径》。 一、背景有些时候,由于网络限制等原因,不能直接连通过 SSH 连到指定服务器,欧博需要经过代理进行连接。例如如下场景: 客户机:client.net 代理服务器:proxy.net,安装代理服务器软件,通过 1080 端口,提供 Socket5 代理服务 目标服务器:server.net,在默认 22 端口,提供 SSH 服务 其中, 使用 SSH 的 ProxyCommand 选项,配合 nc/Ncat 命令,实现 client.net 通过代理 proxy.net,以 SSH 访问 server.net。 1、连接代理工具(1)nc macOS 上常用这种方案。但是 nc 不支持需要认证的代理。 常用参数: -X 指定代理协议 4 SOCKS v.4 5 SOCKS v.5(默认) connect HTTPS proxy
-x 代理地址[:端口] SOCKETS 使用 1080 HTTPS 使用 3128 (2)Ncat Ncat 在 macOS 上通过代理连接时会出现连接断开的情况。 常用参数: --proxy-type 指定代理协议 socks4 SOCKS v4 socks5 SOCKS v5 http HTTP proxy(默认)
--proxy 代理地址[:端口] SOCKETS 使用 1080 HTTPS 使用 3128 --proxy-auth 指定访问代理的账号、密码 对于 --proxy-type http/socks5 形式为 --proxy-auth proxyuser:proxypwd 对于 --proxy-type socks4 形式为 --proxy-auth proxyuser 2、SSH 命令行以 nc 为例,如使用 Ncat 可以自行替换。 $ ssh -o ProxyCommand="nc -X 5 -x proxy.net:1080 %h %p" user@server.net默认为 Socket5 代理,这时可以省略 -X 参数 SSH 配置文件位置: ~/.ssh/config增加如下两行内容:以 nc 为例,如使用 Ncat 可以自行替换。 Host * ProxyCommand nc -X 5 -x proxy.net:1080 %h %p使用配置文件之后,就不需要在命令行中进行代理配置了。 三、其他解决方案对于大部分情况,都可以直接使用 nc 或者 Ncat 解决。但对于一些复杂情况,也可以通过其它方案完成。如在 macOS 上想通过需要认证的代理连接,用 nc 不支持代理认证,Ncat 又有些问题。 对于代理类型的问题,可以通过 Brook 来进行类型转换。 1、corkscrew 只支持 HTTP 代理 $ ssh -o ProxyCommand='corkscrew proxy.net 8888 %h %p' user@server.net如需要访问带认证的代理服务器: $ ssh -o ProxyCommand='corkscrew proxy.net 8888 %h %p ~/.ssh/myauth' user@server.net~/.ssh/myauth 的内容: username:password2、proxytunnel 只支持 HTTP 代理 $ ssh -o ProxyCommand='proxytunnel -p proxy.net:8888 -P username -d %h:%p' user@server.net命令行里只填用户名,会提示输入密码,或者通过环境变量传入。 四、参考资料(完) (责任编辑:) |