How to Setup Clash Premium on Linux

UPDATE!!!
自 2022/04/10 日起 clash premium 更新了 linux 平台的auto-route,因此可直接在配置文件中配置的tun字段的auto-route即可:

1
2
3
4
tun:
enable: true
auto-route: true
...

Optional Setup

clash premium 分支的 nightly 版可在 https://nightly.icpz.workers.dev 下载,或在官方的 docker image 中提取。下载好之后请将其放在 /usr/bin/clash ,如果放在其他位置,请注意同步修改后文中的路径。

接下来需要执行 setcap ,这样 clash 可以在非 root 权限下绑定特权端口以及建立 tun 设备:

1
sudo setcap cap_net_bind_service,cap_net_admin=+ep /usr/bin/clash

DEPRECATED!!!: 以下为原文

近期发布的 Clash Premium 版加入了 TUN 模式,可以方便得实现透明代理。本文介绍如何在各种 Linux 发行版中配置该模式。

Setup Binary

可以在此 release/premium 下载预编译的可执行文件,或者在官方的 docker image 中提取。下载好之后请将其放在 /usr/bin/clash ,如果放在其他位置,请注意同步修改后文中的路径。

接下来需要执行 setcap ,这样 clash 可以在非 root 权限下绑定特权端口以及建立 tun 设备:

1
sudo setcap cap_net_bind_service,cap_net_admin=+ep /usr/bin/clash

Setup Configuration Directory

建立 /etc/clash 文件夹:

1
2
mkdir /etc/clash
mkdir /etc/clash/scripts # this is for post scripts

Setup config.yaml

注意,如果您有多个非 loopback interface 出口,那么请不要在 config.yaml 中填写 interface-name 字段,否则会导致 clash 自己的流量全部从指定 interface 发出,导致网络异常。实际上无论有没有多个非 loopback interface 都不建议在 Linux 版配置中填写该字段。

需要配置 tun 字段:

1
2
3
4
5
6
7
tun:
enable: true
stack: system # or `gvisor'
dns-listen: 0.0.0.0:53
dns-hijack:
- tcp://8.8.8.8:53
- 8.8.8.8:53

config.yaml 放在 /etc/clash 文件夹下。

Compose Post Scripts

将下述三个脚本文件放在 /etc/clash/scripts 文件夹下。

准备 config.sh ,这是需要根据情况修改的脚本文件,将其中 TUN_ADDR 和 TUN_NET 替换成与 config.yaml 中的配置一致:

1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/env bash

# TUN Interface
TUN_ADDR='198.19.0.1'
TUN_NET='198.19.0.0/16'
TUN_DEV='utun'

# MISC
CLASH_TABLE='0x164'
CLASH_USER='proxy'
CLASH_UID=$(id -u "$CLASH_USER")
MAIN_TABLE='main'

新建 setup.sh 并保存以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/usr/bin/env bash

#file: setup.sh

SELF=$(readlink -f "$0")
BASEDIR=$(dirname "$SELF")

. "$BASEDIR"/config.sh

#wait for TUN device
while ! ip address show "$TUN_DEV" > /dev/null; do
sleep 0.2
done

ip route flush table "$CLASH_TABLE"
ip route add default via "$TUN_ADDR" dev "$TUN_DEV" table "$CLASH_TABLE"
ip route add "$TUN_NET" dev "$TUN_DEV" table "$CLASH_TABLE"

ip rule add from all table "$CLASH_TABLE"
ip rule add uidrange "${CLASH_UID}-${CLASH_UID}" table "$MAIN_TABLE"
ip rule add to 192.168.0.0/16 table "$MAIN_TABLE"
ip rule add to 172.16.0.0/12 table "$MAIN_TABLE"
ip rule add to 10.0.0.0/8 table "$MAIN_TABLE"

新建 unsetup.sh 并保存以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/usr/bin/env bash

SELF=$(readlink -f "$0")
BASEDIR=$(dirname "$SELF")

. "$BASEDIR"/config.sh

ip rule delete from all table "$CLASH_TABLE"
ip rule delete uidrange "${CLASH_UID}-${CLASH_UID}" table "$MAIN_TABLE"
ip rule delete to 192.168.0.0/16 table "$MAIN_TABLE"
ip rule delete to 172.16.0.0/12 table "$MAIN_TABLE"
ip rule delete to 10.0.0.0/8 table "$MAIN_TABLE"

ip route flush table "$CLASH_TABLE"

基本思路是利用 rule-based routing 来将所有流量重定向至 clash 的 TUN 设备,并让由 clash 自己的流量遵循原始路由表。

Setup systemd

将下述文件保存为 /etc/systemd/system/clash.service :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# /etc/systemd/system/clash.service
[Unit]
Description=A rule based proxy tunnel
After=network-online.target

[Service]
Type=simple
User=proxy
Group=proxy
ExecStartPost=+/etc/clash/scripts/setup.sh
ExecStopPost=+/etc/clash/scripts/unsetup.sh
ExecStart=/usr/bin/clash -d /etc/clash
StandardOutput=append:/var/log/clash.log

[Install]
WantedBy=multi-user.target

建立一个空的 log 文件并给予正确的权限:

1
2
sudo touch /var/log/clash.log
sudo chown proxy /var/log/clash.log

至此准备工作已经完毕,接下来设置为开机启动并开始运行即可:

1
2
systemctl enable clash
systemctl start clash