写在前面

我每年被问到最多的问题之一,就是:怎么在服务器上使用代理。
不论是 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
2
3
4
# 注意,代理的 scheme 应该和本地的代理一致
# 如本地是 http 代理,则写 http://,与想要访问的地址无关
# 访问 http 网站设置 http_proxy 环境变量,访问 https 网站则设置 https_proxy
https_proxy=http://127.0.0.1:23456 curl -v https://www.google.com

如果不想在每次 SSH 的时候都输入这个命令,可以将其写入 ~/.ssh/config 文件中:

1
2
3
4
Host my-server
HostName 172.16.0.2
User username
RemoteForward 23456 127.0.0.1:7890

这样一来,我们只需要使用 ssh my-server 命令就可以自动连接服务器创建这个隧道了。

注意:当服务器上的这个端口被占用时,SSH 不会有任何提示。如果我们先后创建两个 SSH 连接,那么第一个连接会创建该隧道,第二个连接不会。此时若第一个连接被关闭,则隧道也会被关闭,需要创建新的 SSH 连接才能重新创建隧道。

使用 Tailscale 等 VPN 软件

另一种方式是使用 VPN 软件。这里的 VPN 指的是虚拟专用网络(Virtual Private Network),而不是那些加密流量的代理软件。以 Tailscale 为例,我们可以用它创建一个虚拟的局域网,网络会为每个设备分配一个固定的 IP 地址。这样一来,我们就可以在服务器上通过这个 IP 地址访问本地的代理了。

在 Clash 等软件中,我们可以设置其监听在这个虚拟局域网的 IP 上,而不用打开“允许局域网访问”。以 Clash Verge 为例,我们可以在“订阅“—“全局扩展配置”中添加以下内容:

1
2
3
4
5
listeners:
- name: tailscale
type: mixed
port: 17890
listen: 100.132.107.253 # 填 Tailscale IP

这样,Clash Verge 就会在这个 IP 上监听 17890 端口。在服务器和本地都安装 Tailscale 并加入同一个网络后,我们可以在服务器上用 Tailscale 的 IP 和端口访问本地的代理。

我们可以用 curl 命令测试一下:

1
https_proxy=http://100.132.107.253:17890 curl https://www.google.com

使用代理

通过环境变量设置代理

在服务器上使用代理最简单的办法是设置环境变量。大多数软件会自动读取 http_proxyhttps_proxy 环境变量。我们可以通过 export 命令设置这些变量,在当前的 shell 中生效:

1
2
3
export http_proxy=http://100.132.107.253:17890
export https_proxy=http://100.132.107.253:17890
curl https://www.google.com

或者,如果只想对某一条命令生效,可以直接在命令前加上环境变量:

1
https_proxy=http://100.132.107.253:17890 curl https://github.com/

但有些软件不支持通过环境变量设置代理,比如 npmgit 等。我们可以参考各个软件的文档,设置其代理。也可以使用其他工具,比如下面要介绍的 proxychains,让不支持环境变量的软件也能使用代理。

通过 proxychains 设置代理

安装 proxychains。

1
2
sudo apt update
sudo apt install proxychains4

proxychains 使用配置文件设置代理。其按照以下的顺序查找配置文件:

1
2
3
4
5
6
7
# 当前目录
./proxychains.conf
# 用户目录
~/.proxychains/proxychains.conf
# 系统目录
/etc/proxychains.conf
/etc/proxychains4.conf

我们在用户目录下创建配置:

1
2
mkdir -p ~/.proxychains
cp /etc/proxychains4.conf ~/.proxychains/proxychains.conf

修改其末尾的 [ProxyList] 部分,添加我们需要的代理:

1
2
3
4
[ProxyList]
# 默认情况下 Clash 会同时监听 http 和 socks5 代理
# 根据所使用的代理软件和隧道的配置,设置对应的协议、IP 与端口
socks5 100.132.107.253 17890

然后我们就可以通过 proxychains 来使用代理了:

1
2
3
4
$ proxychains curl https://www.google.com
[proxychains] config file found: /home/username/.proxychains/proxychains.conf
[proxychains] preloading /usr/lib/x86_64-linux-gnu/libproxychains.so.4
[proxychains] DLL init: proxychains-ng 4.17

proxychains 会输出如上所示的调试信息。我们可以通过 -q 参数来关闭这些调试信息:

1
proxychains -q curl https://www.google.com

也可以在配置文件中设置 quiet_mode 选项,关闭所有的调试信息:

1
2
3
# Quiet mode (no output from library)
quiet_mode
# 去掉 quite_mode 前面的 # 符号

注意,proxychains 只对动态链接 libc 的程序生效。尽管 Linux 下大部分程序都会动态链接 libc,但有些语言编写的程序,比如 Go,默认不动态链接 libc。对于这些程序,也有 graftcp 之类的工具可以使用。


本站由 @Rhacoal 使用 Stellar 主题创建。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 许可协议,转载请注明出处。