有时因为各种原因,更倾向于让 SSH 走一个代理。如果有一个全局的 VPN 或者路由可以透明代理,那就不用多说了。但往往本地只运行了一个提供 socks5 代理的客户端,如此,SSH 通过 socks5 代理的使用方法记录如下。
安装 privoxy,为了将已有的 socks5 代理转换为 http 代理:
1 | sudo yum install -y epel-release privoxy |
编辑 privoxy 的配置文件:
1 | sudo vim /etc/privoxy/config |
搜索 socks5t ,找到第1336行,去掉前面的注释符,端口改成 socks5 的端口:
1 | forward-socks5t / 127.0.0.1:1080 . |
启动 Privoxy服务:
1 | sudo systemctl enable privoxy |
由于 CentOS 预装的是 nmap-ncat,这和 OpenBSD 的 netcat 是有不同的,前者只支持 socks4 和 http,这也是为什么要用 privoxy 把 socks5 先转成 http 代理。nc 命令的用法也不一样。
编辑 ssh 的 config 文件:
1 | vim ~/.ssh/config |
在想使用代理的 Host 下添加一行 ProxyCommand:
1 | Host ***** |
这样终端通过 ssh username@host
就可以直接走代理了。登录远端之后,可使用 who
检查当前 ip 是否为代理服务器的 ip。
踩过的坑
如果想直接用
ProxyCommand nc -X 5 -x localhost:1080 %h %p
是不行的,会出现,nc: invalid option -- X
的错误。原因上面说过了,CentOS 自带的是 nmap-ncat 。之前安装过 connect-proxy,试过在 ProxyCommand 里直接用 socks5 代理。未果。使用
ProxyCommand connect-proxy -S 127.0.0.1:1080 %h %p
,刚刚好奇又试了一次,同样不行,出现ssh_exchange_identification: Connection closed by remote host
。网上看到有人说用同样的命令是成功的。