通过代理连接 SSH

有时虽然 VPS 没被墙,但通过 SSH 连接进行操作时却十分卡顿,或者 VPS 不幸被墙,只能通过代理来访问。虽然 Putty 等 SSH 客户端可以很方便地配置代理,但如果你像俺一样使用操作系统的终端来通过 OpenSSH 连接,那么需要一番设置才能顺利使 SSH 经过代理。下面分别记录一下 Windows 和 Linux 下的配置过程。

§Windows 系统

使用 connect ,Windows 默认没有自带这个程序,需要去 https://bitbucket.org/gotoh/connect/downloads/ 这里下载 exe 文件并放至本机目录(比如俺这里放在了 C:\Windows\ 这个目录)。

然后编辑 C:\Users\Administrator\.ssh\config 这个文件,其中 Administrator 部分改为你电脑当前的用户名,如果这个文件不存在,那就新建一个,在其中写入:

1
2
Host *
    ProxyCommand C:\Windows\connect.exe -S 127.0.0.1:1080 %h %p

参数说明:

  • 第一行 Host * 代表下面配置的代理的作用范围是所有 SSH 连接,如果只需要对个别连接配置代理,那么把型号换成对应连接的别名或者 IP 地址;
  • 下面的 C:\Windows\connect.exe 是 connect 程序的绝对路径;
  • -S 是指定使用 socks 5 协议,也可以使用 -H 来使用 HTTP 协议来代理,不过后面的 127.0.0.1:1080 也要改为你的 HTTP 代理的地址和端口;
  • %h%p 用于替换真正要连接的服务器主机名(host)和端口(port)。

如果只是临时需要走一下代理,那么可以不修改配置文件,而是在原本的 SSH 命令后面加上参数 -o "ProxyCommand path-to-connect.exe -S 127.0.0.1:1080 %h %p ,例如上面的例子,可以在连接的时候使用类似下面的命令,是一样的效果:

1
ssh user@server -o "ProxyCommand C:\Windows\connect.exe -S 127.0.0.1:1080 %h %p"

§Linux 系统

使用 nc ,即 netcat ,这是一个强大的网络工具,不过许多发行版默认没有安装,需要手动安装,CentOS 可以使用 yum install nc 来安装,Manjaro 使用 sudo pacman -S openbsd-netcat 来安装。

用法和上文中 Windows 下使用 connect 类似,只是 nc 的参数和 connect 略有不同,下面举个栗子:

1
ssh user@server -o "ProxyCommand nc -X 5 -x 127.0.0.1:1080 %h %p"

部分参数说明:

  • -X 5 指定代理协议为 socks 5 ,如果是 socks 4 则写为 -X 4 ,如果是 HTTPS 代理则为 -X connect
  • 如果不写 -X 参数,默认使用 socks 5 ,即相当于 -X 5
  • -x 指定代理的主机地址及端口。

注意:

nc 有许多变种,在原版基础上增加了许多不同的功能。安装 nc 时务必安装 OpenBSD 的变种,这是一个由 OpenBSD 社区重写的 nc 变种,增加了代理和 ipv6 等支持。俺在 Manjaro 上安装时一时不察,装成了 gnu-netcat,这是 GNU 社区重写的一个 nc 变种,没有本文需要的代理等功能。

其他配置比如修改 SSH 配置文件,除了路径不同(Linux 一般在 ~/.ssh/config),内容的格式是一样的,参照上文即可。


参考链接:

  1. 通过 Socks5 代理进行 SSH 连接 - PRIN BLOG

  2. Windows 下配置 SSH 走 Shadowsocks 代理 – 兴趣使然的博客

  3. ssh怎样通过代理登录远程主机 | Bruce's Blog

  4. 编程随想的博客: 扫盲 netcat(网猫)的 N 种用法——从“网络诊断”到“系统入侵”