如何在 Linux 上优雅的使用 Clash?

为什么选择 Clash?

目前 Clash 由于其基于规则分流的强大代理功能,已经成为主流的代理内核,在各个平台都有对应的客户端。如 Windows 端的 Clash For Windows(CFW),MacOS 端的 ClashX,Android 端的 Clash For Android,IOS 端 Choc。

值得一提的是上述的 CFW 也能够运行于 Linux 平台,但是体验并不如 Windows 端那么丝滑。而 Linux 端还有一个名为 Clashy 的软件,实事求是的说,体验并不是很好。

那么我们如何能够在 Linux 上优雅的使用 Clash 呢?

一、基于 Docker 的实现

Docker 是一个开源的应用容器引擎,开发者可以把包和依赖等集成到一个容器中,并打包成镜像发布。用户可以直接拉取镜像并创建容器,而不会污染本地的环境,十分的好用

我现在在使用一个软件的时候一般都是有 docker 实现会优先使用 docker,配合 docker-compose 管理真的非常的方便。因此我们优先考虑使用 docker 来配置 clash 代理。

1.1 安装 docker

大家可以参考 官网安装指南 来在 Linux 安装 docker,就不详细赘述了。

顺便可以参考 docker-compose 安装指南 来安装 docker-compose。

安装结束后,使用 docker --version 以及 docker-compose --version 进行验证,输出如下进行下一步。

❯ docker --version        
Docker version 20.10.14, build a224086

❯ docker-compose --version
docker-compose version 1.29.2, build 5becea4c

1.2 创建 docker-compose 文件

首先打开一个新的终端,进入根目录,运行如下指令,创建文件夹存放 docker-compose 配置文件。这里是在当前用户家目录下创建了 Services 文件夹,并在其中创建了 clash 文件夹。

❯ mkdir -p ~/Services/clash

然后进入上述文件夹,并使用文本编辑器创建 docker-compose.yml 文件

~
❯ cd ~/Services/clash     

~/Services/clash
❯ vim docker-compose.yml

在文件中填入下述内容,该文件参考官方文档,并进行了一定的改动

version: '3'
services:
  clash:
    # ghcr.io/dreamacro/clash
    # ghcr.io/dreamacro/clash-premium
    # dreamacro/clash
    # dreamacro/clash-premium
    image: dreamacro/clash
    container_name: clash
    volumes:
      - ./config.yaml:/root/.config/clash/config.yaml
      - ./Country.mmdb:/root/.config/clash/Country.mmdb
      - ./ui:/ui # dashboard volume
    ports:
      - "7890:7890"
      - "7891:7891"
      - "9090:9090" # external controller (Restful API)
    # # TUN
    # cap_add:
    #   - NET_ADMIN
    # devices:
    #   - /dev/net/tun
    restart: unless-stopped
    network_mode: "bridge" # or "host" on Linux

我们映射了三个文件到容器内部,分别是代理配置文件 config.yaml ,全球IP库文件 Country.mmdb ,控制面板静态源码 ui 文件夹。

然后映射了三个端口,上述三个端口分别对应了 config.yaml 文件中的 portsocks-portexternal-controller。分别用于 http/https 流量代理,socks 流量代理,以及外部控制。

1.3 下载对应的文件

首先是 config.yaml 文件,这个就是下载你的配置文件,将 $your-proxy-url 替换为对应的订阅链接即可。

~/Services/clash
❯ cd ~/Services/clash #下述所有操作都在该文件夹执行

~/Services/clash
❯ wget -O config.yaml $your-proxy-url

然后下载 Country.mmdb 文件,虽然这个文件在没有的时候会自动下载,但是一般速度较慢,还是手动下载比较好,你可以在这里找到对应的文件 Dreamacro/maxmid-geoip/releases

~/Services/clash
❯ wget -O https://github.com/Dreamacro/maxmind-geoip/releases/download/20220412/Country.mmdb

然后下载对应的 ui 控制面板,目前有两款,分别是 clash 原作者的 clash-dashboard 以及另一位大佬的 yacd-dashboard ,大家自选其一即可,我常用的是 clash-dashboard

Ps:这一步算是可有可无,大家可以直接访问对应的链接

  • clash-dashboard:http://clash.razord.top/
  • yacd-dashboard:http://yacd.haishan.me/

填入对应的 IP、端口、密钥进行控制,如果上述需求已经足够,就无需配置后续的本地面板

~/Services/clash
❯ git clone -b gh-pages https://github.com/Dreamacro/clash-dashboard ui

这样就克隆 clash-dashboard 仓库的 gh-pages 分支到了 ui 文件夹。

然后配置一下我们的 config.yaml 文件,确保下面四项如下:

port: 7890
socks-port: 7891
external-controller: :9090
external-ui: /ui

这里的 port 是 http/https 代理端口,socks-port 是 socks 流量代理端口,external-controller 是外部控制端口,用于面板控制,external-ui 是本地控制页面的源码,确保 localhost:external-controller/ui 页面可以控制代理。

顺便说一下,这里其实严格意义上不是必须和我一样,只要和前面的 docker-compose.yml 文件中的端口映射对应起来即可,但是如果你对 Docker 及 Clash 不够了解,推荐和我选择一样的配置。

1.4 启动容器

在该目录下启动容器

~/Services/clash
❯ docker-compose up -d

后续可以通过 docker ps 查看容器状态

~/Services/clash
❯ docker ps               
CONTAINER ID   IMAGE             COMMAND    CREATED          STATUS          PORTS                                                                                                      NAMES
304c4934e528   dreamacro/clash   "/clash"   53 minutes ago   Up 52 minutes   0.0.0.0:7890-7891->7890-7891/tcp, :::7890-7891->7890-7891/tcp, 0.0.0.0:9090->9090/tcp, :::9090->9090/tcp   clash

可以通过在该目录下执行 docker-compose logs ,或在任何位置执行 docker logs clash 查看容器日志

~/Services/clash
❯ docker-compose logs | tail -n 20 #查看最近20条log

~
❯ docker logs clash | tail -n 30 #查看最近30条

关闭容器可以使用 docker-compose down,即可停止并移除该容器,不留任何残余(干净又卫生啊兄弟们)。

~/Services/clash
❯ docker-compose down 
Stopping clash ... done
Removing clash ... done

1.5 控制代理

后续大家可以通过访问上述的两个公开链接,或者本地的 localhost:9090/ui(必须配置了 external-ui 参数才可使用)来对代理进行控制。

clash-dashboard 界面

yacd-dashboard 界面

二、基于 Systemd 的实现

Systemd 是 Linux 系统工具,用来启动守护进程,已成为大多数发行版的标准配置。

大家可以通过下面阮一峰老师的教程1来学习 Systemd 的一些基础知识。

2.1 下载 Clash 内核

首先下载 clash 内核并且移动到用户可执行目录下,你可以在这里找到最新的内核 clash-core

~
❯ cd ~/Downloads

~/Downloads
❯ wget https://github.com/Dreamacro/clash/releases/download/v1.10.0/clash-linux-amd64-v1.10.0.gz # 如果速度较慢,可以添加 https://ghproxy.com/ 形成 https://ghproxy.com/https://github.com/Dreamacro/clash/releases/download/v1.10.0/clash-linux-amd64-v1.10.0.gz 式的链接进行加速

# 解压
~/Downloads
❯ gunzip clash-linux-amd64-v1.10.0.gz

# 移动到 /usr/local/bin 目录
~/Downloads
❯ sudo mv clash-linux-amd64-v1.10.0 /usr/local/bin/clash

2.2 下载各类配置文件

这里跟上面的 1.3 下载对应的文件 非常的相似,大家可以参考上面的进行,不过可以都统一下载到 /opt/clash 文件夹中,包括 config.yamlCountry.mmdb 文件及 ui 文件夹(如果不需要本地面板,则不需要配置 ui)。

下面是创建文件夹等过程示例,下载配置文件请参考 1.3 节进行

~/Downloads
❯ sudo mkdir -p /opt/clash

~/Downloads
❯ cd /opt/clash

/opt/clash
❯ wget -O config.yaml ..............

# 接下来下载对应的文件

最后结构目录应该如下所示,ui 为文件夹

/opt/clash
❯ ls -la
total 5508
drwxr-xr-x 3 root root    4096 4月  23 20:30 .
drwxr-xr-x 9 root root    4096 4月  22 09:02 ..
-rw-r--r-- 1 root root  177047 4月  22 09:04 config.yaml
-rw-r--r-- 1 root root 5446245 4月  12 08:56 Country.mmdb
drwxr-xr-x 4 root root    4096 4月  22 08:40 ui

2.3 配置 clash.service 守护进程文件

~/Downloads
❯ sudo vim /etc/systemd/system/clash.service

运行上述命令,并在文件中写入下列内容,这里参考了官网的文档2

[Unit]
Description=Clash daemon, A rule-based proxy in Go.
After=network.target

[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/clash -d /opt/clash/
Restart=on-failure

[Install]
WantedBy=multi-user.target

大家如果对上述内容有疑问,可以参考阮一峰老师的教程。

2.4 修改配置文件

1.3 下载对应的文件 所示,要确保配置文件中的下面四个参数对应如下:

port: 7890
socks-port: 7891
external-controller: :9090
external-ui: /opt/clash/ui

具体参数的作用上面已经讲过了。

2.5 启动并设置开机启动

启动 Clash service 守护进程

~/Services/clash
❯ sudo systemctl start clash

设置为开机自启动

~/Services/clash
❯ sudo systemctl enable clash
Created symlink /etc/systemd/system/multi-user.target.wants/clash.service → /etc/systemd/system/clash.service.

查看 Clash 进程状态,确保下面的 Activeactive(running) 即正常。如果有遇到问题可以评论或者通过搜索引擎。

~/Services/clash
❯ sudo systemctl status clash
● clash.service - Clash daemon, A rule-based proxy in Go.
     Loaded: loaded (/etc/systemd/system/clash.service; disabled; vendor preset>
     Active: active (running) since Sat 2022-04-23 21:49:39 CST; 43s ago
   Main PID: 120629 (clash)
      Tasks: 13 (limit: 18860)
     Memory: 16.1M
     CGroup: /system.slice/clash.service
             └─120629 /usr/local/bin/clash -d /opt/clash/

查看详细日志,可以使用 journalctl,所有 Systemd 服务的日志都可以通过这个查看

~/Services/clash
❯ sudo journalctl -u clash     
-- Logs begin at Thu 2022-04-14 23:14:57 CST, end at Sat 2022-04-23 21:53:15 CS>
4月 15 01:23:14 zs-XiaoXinPro systemd[1]: /etc/systemd/system/clash.service:5: >
4月 15 01:23:14 zs-XiaoXinPro systemd[1]: Started clash daemon.

取消开机自启动

~/Services/clash
❯ sudo systemctl disable clash
Removed /etc/systemd/system/multi-user.target.wants/clash.service.

停止 Clash 服务守护进程

~/Services/clash
❯ sudo systemctl stop clash