CentOS 7 下 SSH 使用 Socks5 代理连接服务器

有时因为各种原因,更倾向于让 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 的端口:

/etc/privoxy/config
1
forward-socks5t  /  127.0.0.1:1080  .

启动 Privoxy服务:

1
2
sudo systemctl enable privoxy
sudo systemctl start privoxy

由于 CentOS 预装的是 nmap-ncat,这和 OpenBSD 的 netcat 是有不同的,前者只支持 socks4 和 http,这也是为什么要用 privoxy 把 socks5 先转成 http 代理。nc 命令的用法也不一样。

编辑 ssh 的 config 文件:

1
vim ~/.ssh/config

在想使用代理的 Host 下添加一行 ProxyCommand:

~/.ssh/config
1
2
3
4
5
Host *****
HostName *****
Port **
User ****
ProxyCommand nc --proxy 127.0.0.1:8118 %h %p

这样终端通过 ssh username@host 就可以直接走代理了。登录远端之后,可使用 who 检查当前 ip 是否为代理服务器的 ip。

踩过的坑

  1. 如果想直接用 ProxyCommand nc -X 5 -x localhost:1080 %h %p 是不行的,会出现,nc: invalid option -- X 的错误。原因上面说过了,CentOS 自带的是 nmap-ncat 。

  2. 之前安装过 connect-proxy,试过在 ProxyCommand 里直接用 socks5 代理。未果。使用ProxyCommand connect-proxy -S 127.0.0.1:1080 %h %p,刚刚好奇又试了一次,同样不行,出现 ssh_exchange_identification: Connection closed by remote host。网上看到有人说用同样的命令是成功的。

Mastodon