写在前面
我每年被问到最多的问题之一,就是:怎么在服务器上使用代理。
不论是 GitHub、Hugging Face,还是各种各样需要下载资源的场景,对代理的需求从来没有停止过。所以我决定写篇博客,以后再被问到就可以直接发链接了。
我们的目标是在服务器上监听某个端口(比如 23456),将所有的发往这个端口的流量转发到本地的代理上。这样一来,我们就可以在服务器上使用本地的代理了。
我们分别介绍如何配置这样一个端口转发,以及在服务器上怎样通过代理访问网络。
设置转发隧道
使用 SSH Remote Forward
SSH 的 Remote Forward 功能可以将远程服务器的端口转发到本地。使用以下命令将服务器的 23456 端口流量转发到本地的 7890 端口:
1 | ssh user@server-ip -R 23456:127.0.0.1:7890 |
这样,服务器会在 23456 端口上监听,该端口收到的所有流量都会被转发到本地的 7890 端口。我们可以在服务器上使用 curl 命令测试一下:
1 | # 注意,代理的 scheme 应该和本地的代理一致 |
如果不想在每次 SSH 的时候都输入这个命令,可以将其写入 ~/.ssh/config 文件中:
1 | Host my-server |
这样一来,我们只需要使用 ssh my-server 命令就可以自动连接服务器创建这个隧道了。
注意:当服务器上的这个端口被占用时,SSH 不会有任何提示。如果我们先后创建两个 SSH 连接,那么第一个连接会创建该隧道,第二个连接不会。此时若第一个连接被关闭,则隧道也会被关闭,需要创建新的 SSH 连接才能重新创建隧道。
使用 Tailscale 等 VPN 软件
另一种方式是使用 VPN 软件。这里的 VPN 指的是虚拟专用网络(Virtual Private Network),而不是那些加密流量的代理软件。以 Tailscale 为例,我们可以用它创建一个虚拟的局域网,网络会为每个设备分配一个固定的 IP 地址。这样一来,我们就可以在服务器上通过这个 IP 地址访问本地的代理了。
在 Clash 等软件中,我们可以设置其监听在这个虚拟局域网的 IP 上,而不用打开“允许局域网访问”。以 Clash Verge 为例,我们可以在“订阅“—“全局扩展配置”中添加以下内容:
1 | listeners: |
这样,Clash Verge 就会在这个 IP 上监听 17890 端口。在服务器和本地都安装 Tailscale 并加入同一个网络后,我们可以在服务器上用 Tailscale 的 IP 和端口访问本地的代理。
我们可以用 curl 命令测试一下:
1 | https_proxy=http://100.132.107.253:17890 curl https://www.google.com |
使用代理
通过环境变量设置代理
在服务器上使用代理最简单的办法是设置环境变量。大多数软件会自动读取 http_proxy 和 https_proxy 环境变量。我们可以通过 export 命令设置这些变量,在当前的 shell 中生效:
1 | export http_proxy=http://100.132.107.253:17890 |
或者,如果只想对某一条命令生效,可以直接在命令前加上环境变量:
1 | https_proxy=http://100.132.107.253:17890 curl https://github.com/ |
但有些软件不支持通过环境变量设置代理,比如 npm,git 等。我们可以参考各个软件的文档,设置其代理。也可以使用其他工具,比如下面要介绍的 proxychains,让不支持环境变量的软件也能使用代理。
通过 proxychains 设置代理
安装 proxychains。
1 | sudo apt update |
proxychains 使用配置文件设置代理。其按照以下的顺序查找配置文件:
1 | # 当前目录 |
我们在用户目录下创建配置:
1 | mkdir -p ~/.proxychains |
修改其末尾的 [ProxyList] 部分,添加我们需要的代理:
1 | [ProxyList] |
然后我们就可以通过 proxychains 来使用代理了:
1 | $ proxychains curl https://www.google.com |
proxychains 会输出如上所示的调试信息。我们可以通过 -q 参数来关闭这些调试信息:
1 | proxychains -q curl https://www.google.com |
也可以在配置文件中设置 quiet_mode 选项,关闭所有的调试信息:
1 | # Quiet mode (no output from library) |
注意,proxychains 只对动态链接 libc 的程序生效。尽管 Linux 下大部分程序都会动态链接 libc,但有些语言编写的程序,比如 Go,默认不动态链接 libc。对于这些程序,也有 graftcp 之类的工具可以使用。