用 Clash 做代理

2021-10-28

科学上网一直是我的刚需,从 2015 年的 shadowsocks 开始,到 2020年的 WireGuard,都在博客中留有记录。然而随着墙的不断升级,只在一台服务器上搭梯子的做法慢慢靠不住了,还是得有多台服务器才能保证至少有一个是能用的。所以我放弃了购买海外云主机自搭梯子的做法,老老实实从「机场」购买服务。

过去一年我用来翻墙的工具是 Clash,因其图标获赠绰号「小猫咪」,又可靠又可爱。

Clash 的客户端有两个常用的可选:Mac平台上的 ClashX 和跨平台的 Clash for Windows。后者虽然名字里有 for Windows,但其实是用 Electron 开发的跨平台客户端,它的功能界面更丰富,用起来也复杂,check update 下载更新的频次也多。

对于我来说,一个上网代理软件,它就在后台默默工作就好了,太刷存在感了反倒是打扰。所以我用的还是相对安静的 ClashX。

有一天我在服务器下载文件,发现有个文件下不动,一看地址是 github 的,怪不得。于是打算在服务器上搭建代理。以前用 ss 和 v2ray 也搭过代理,但用起来不方便,因为一旦在环境变量中设置了代理,所有走代理的网络请求,无论是否必须,都绕远到国外服务器,这不是我们希望看到的。

Clash 解决了这个问题,请求发到 Clash 代理服务后并不一定全都翻墙,而是由 Clash 根据地址做规则判断,需要翻的才转发到海外翻墙服务器。

服务器端的 Clash

Clash 在 github 上是个活跃的项目,维护者是中国人,目前已经有两万个 star。

这个 Clash 是用 Go 语言写的不带图形界面的命令行程序。它会在本机端口上起一个服务,但还是要连墙外的服务器才行,因此称它既是服务端又是客户端。

与之前不同,我们不必关心服务器用的是trojan、v2ray 还是 shadowsocks,也不用管端口号和密码是多少,这些细节是可以被屏蔽的。所有复杂的配置和规则,都汇总在一个配置文件中,那配置文件又从哪来呢?下面我们会讲。

下载安装

到这里下载最新版:https://github.com/Dreamacro/clash/releases

因为 Go 写的程序要编译成二进制的可执行文件,也就是 CPU 指令。因此每种平台的 CPU 要各来一份。从下载文件列表中挑选出想要使用的平台版本,目前绝大多数 Linux 服务器都是 amd64 平台,所以选它就没错。

image-20211026061508081

# 下载二进制文件
wget https://github.com/Dreamacro/clash/releases/download/v1.7.1/clash-linux-amd64-v1.7.1.gz

# 使用 gzip 解压,顺便删除压缩包
gzip -d clash-linux-amd64-v1.7.1.gz 

# 改名叫 clash,顺便移动到 bin 目录
mv clash-linux-amd64-v1.7.1 /usr/local/bin/clash 

# 添加执行权限
chmod +x /usr/local/bin/clash 

配置文件

下载完之后解压缩,直接就能得到 clash 二进制文件。执行看看会发生什么:

image-20211028094344469

程序跑起来了,但控制台输出的前两行都是 Can’t find 某个东西,我们重点关注第一行日志。

第一行日志说找不到配置文件,自动创建了一个初始态配置文件。文件的路径在 ~/.config/clash/config.yaml,但还是初始状态,没啥内容。

这个配置文件包含了服务器列表、转发规则等所有的配置细节。幸好我们不必手动编辑这个文件,而是可以从机场直接下载。一般从机场买了服务后,会提供你一个订阅链接,这个链接的地址是固定的,但内容是动态的,因为服务器列表经常更新,毕竟翻墙打的就是游击战。

我的订阅链接长这样:

https://s.trojanflare.com/clashx/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

订阅地址指向的其实就是一个配置文件,直接下载到 Clash 的配置文件路径下:

wget -O ~/.config/clash/config.yaml <你的订阅链接>

下载好配置文件后,再重新运行 clash 就能翻墙了。保持 clash 在运行状态,开启另外一个终端访问谷歌试试:

image-20211026064622177

做成开机自启的服务

刚才试过了好用,但还要先用命令行启动不太方便,最好做成一个能开机自动运行的服务。

先编辑一个文件:

vim /etc/systemd/system/clash.service

写入以下内容:

[Unit]
Description=clash service
After=network.target

[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/clash
Restart=on-failure # or always, on-abort, etc

[Install]
WantedBy=multi-user.target

启动服务:

service clash start 

配置环境变量

有些程序会默认使用系统环境变量中的代理,就省的我们在命令行中敲代理参数了。

Clash 提供了 http proxy 和 socks5 proxy 运行在两个不同端口。默认配置下 http proxy 在 7890 端口,而 socks proxy 在 7891 端口。

因为 socks 比 http 代理有更好的性能,而且支持 UDP 协议,所以使用 socks 代理是更佳选择。但同时也要考虑到,有些软件不支持 socks 协议,所以还不能完全丢弃 http。

查一下配置文件 ~/.config/clash/config.yaml 中的端口号,一般最开头就是:

port: 7890
socks-port: 7891

第一行的 port 就是 http 端口,第二行 socks-port 很显然就是 socks 端口号。查到端口号,我们在服务器环境里配置一下:

vim /etc/profile

在文件末尾添加下面内容:

export http_proxy=http://127.0.0.1:7890
export https_proxy=http://127.0.0.1:7890
export all_proxy=socks5://127.0.0.1:7891

保存文件后,使用下面命令使其生效:

source /etc/profile

image-20211028152114304

定期更新

机场提供给每个用户一个固定的订阅链接,订阅链接指向一个配置文件,配置文件里列出的翻墙服务器不断被封,同时机场也会不断把新的服务器加进来,因此需要经常更新才行。

我们写一个脚本来更新配置文件和IP数据库,然后重启 clash 以加载新的配置:

# 备份旧配置文件,下载新的并替换
cp ~/.config/clash/config.yaml ~/.config/clash/config.yaml.bak;
wget -O ~/.config/clash/config.yaml https://s.trojanflare.com/clashx/6d759ea0-809a-4410-ad5a-b55d7005e9e6;

# 备份旧 GeoIP 数据库,下载新的并替换
cp ~/.config/clash/Country.mmdb ~/.config/clash/Country.mmdb.bak;
wget -O ~/.config/clash/Country.mmdb https://cdn.jsdelivr.net/gh/Loyalsoldier/geoip@release/Country.mmdb;

# 重启 clash 服务,使以上更新生效
service clash restart;

我们把上面的脚本保存到一个位置,例如 ~/script/refresh_clash.sh,然后定期执行就可以了。大概多久执行一次?一星期一次是比较合理的。我用的 GeoIP 数据库来自于这个项目,从文档上看到,每周四会生成 Country.mmdb 文件,那就每周五下载好了。

crontab -e

进入编辑后,在文件末尾加一行:

# 每周五凌晨三点执行
0 3 * * 5 ~/script/refresh_clash.sh;
END