Clash大家一定都不陌生。Clash提供的大量丰富的网络功能可以为上网提供定制化的良好体验,其中tun模式就是特色之一。

本文将会详细说明如何在Linux和Windows平台上手工配置tun模式。也许你已经在使用Clash for Windows,手动配置是因为我并不喜欢cfw那样的工具,我更喜欢纯粹一点的工具。

什么是tun

tun是操作系统上的一种虚拟网络设备,可以让用户处理网络中的三层数据包(例如IP包)。

与此差不多的还有tap,但tap处理的是二层数据包。

只处理三层数据包这就决定了tun性能往往比tap要好一些。

Windows平台下,系统内核并不默认提供tun功能,需要安装 Wintun 这个第三方驱动才能支持

在Windows下配置Clash的tun模式

首先当然是下载Clash,需要注意的是Clash有标准版和高级版,tun模式只在高级版提供。下载地址

下载之后解压,并将上面下载好的Wintun.dllclash的可执行文件放在一起。需要注意的是程序位数必须相同。

编写配置文件

也许你已经有了一个配置文件,那就先说明启用tun模式需要添加的内容

1
2
3
4
5
6
7
tun:
enable: true
stack: system
dns-hijack:
- 198.18.0.2:53
auto-route: true
auto-detect-interface: true

在你的配置文件内添加这部分内容即可启用tun模式,但是这还没完,你必须配置一个有效的DNS服务器。

添加下面的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
dns:
enable: true
enhanced-mode: redir-host
listen: :53
default-nameserver:
- 210.5.56.145
nameserver:
- 114.114.114.114
fallback:
- https://8888.google/dns-query
- https://1.0.0.1/dns-query
- https://dns.twnic.tw/dns-query
- https://doh.opendns.com/dns-query
- https://dns-nyc.aaflalo.me/dns-query
- https://dns.aa.net.uk/dns-query
- https://sg.adhole.org/dns-query
- https://kaitain.restena.lu/dns-query
- https://hydra.plan9-ns1.com/dns-query
- https://jp.tiar.app/dns-query
- https://doh.asia.dnswarden.com/adblock
fallback-filter:
geoip: true
geoip-code: CN

需要保证本地的53端口没有被占用。fallback内的服务器地址是我从互联网上搜索得到可以直连的服务器。服务器地址什么的可以根据自己的需要更改.

到这里其实已经可以用了,但是对于不使用cfw的人来说还需要一个管理页面

添加下面的代码

1
2
3
4
secret: ""
external-controller: 127.0.0.1:9090
external-ui: ui
mode: rule

然后下载 yacd 并创建ui文件夹,将文件放到文件夹内,打开 http://127.0.0.1:9090/ui/ 即可看到管理界面。

需要注意的是要下载release内已经打包好的管理面板文件,不是源代码

当然可能大家也有分流的需求,下面是我的配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
proxy-groups:
- name: PROXY
type: select
proxies:
- .....
rule-providers:
reject:
type: http
behavior: domain
url: https://fastly.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/reject.txt
path: ./ruleset/reject.yaml
interval: 86400
icloud:
type: http
behavior: domain
url: https://fastly.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/icloud.txt
path: ./ruleset/icloud.yaml
interval: 86400
apple:
type: http
behavior: domain
url: https://fastly.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/apple.txt
path: ./ruleset/apple.yaml
interval: 86400
google:
type: http
behavior: domain
url: https://fastly.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/google.txt
path: ./ruleset/google.yaml
interval: 86400
proxy:
type: http
behavior: domain
url: https://fastly.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/proxy.txt
path: ./ruleset/proxy.yaml
interval: 86400
direct:
type: http
behavior: domain
url: https://fastly.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/direct.txt
path: ./ruleset/direct.yaml
interval: 86400
cncidr:
type: http
behavior: ipcidr
url: https://fastly.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/cncidr.txt
path: ./ruleset/cncidr.yaml
interval: 86400
lancidr:
type: http
behavior: ipcidr
url: https://fastly.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/lancidr.txt
path: ./ruleset/lancidr.yaml
interval: 86400
tld-not-cn:
type: http
behavior: domain
url: "https://fastly.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/tld-not-cn.txt"
path: ./ruleset/tld-not-cn.yaml
interval: 86400
gfw:
type: http
behavior: domain
url: "https://fastly.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/gfw.txt"
path: ./ruleset/gfw.yaml
interval: 86400

greatfire:
type: http
behavior: domain
url: "https://fastly.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/greatfire.txt"
path: ./ruleset/greatfire.yaml
interval: 86400

rules:
- IP-CIDR,1.0.0.1/32,DIRECT
- IP-CIDR,101.101.101.101/32,DIRECT
- IP-CIDR,8.8.8.8/32,DIRECT
- RULE-SET,icloud,DIRECT
- RULE-SET,apple,DIRECT
- RULE-SET,google,DIRECT
- RULE-SET,proxy,PROXY
- RULE-SET,gfw,PROXY
- RULE-SET,greatfire,PROXY
- GEOIP,CN,DIRECT
- GEOIP,HK,DIRECT
- GEOIP,TW,DIRECT
- MATCH,PROXY

可以按需修改

在Linux下配置

同样的,你需要下载clash高级版的Linux版本,不过你并不需要单独下载Wintun,因为Linux已经在内核支持了这个功能。

和Windows一样,你也需要像上面一样更改配置文件,与Windows不同的是,在Linux下你需要手动将DNS服务器指定为本地

以Ubuntu为例,修改/etc/systemd/resolved.conf

1
2
3
DNS=127.0.0.1
FallbackDNS=114.114.114.114
DNSStubListener=no

然后重启服务

1
systemctl restart systemd-resolved.service

然后启动clash即可

启动

将配置文件重命名为config.yaml并和可执行文件放在一起。打开终端在当前目录输入

1
.\clash-windows-amd64.exe -d ./

无论是哪一个系统,都需要以管理员权限运行

配合WireGuard使用

可能有人需要这个功能

快速搭建wg服务器

由于wg已经集成到了内核中,所以搭建变得非常简单。这里使用NetworkManager的nmtui作为搭建演示

启用ip转发

1
2
3
4
5
6
#关闭防火墙
ufw disable

echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
echo "net.ipv4.conf.all.proxy_arp = 1" >> /etc/sysctl.conf
sysctl -p /etc/sysctl.conf

安装工具,生成私钥和公钥

1
2
3
4
5
apt install wireguard-tools
# 生成私钥
wg genkey
# 生成公钥
echo "私钥" | wg pubkey

使用nmtui编辑链接,到最底下找到wg并添加新链接,按照下面的图片操作

设备可以填自己喜欢的接口名字,地址也可以填自己喜欢的

将刚刚生成的公钥发送到手机,然后从手机得到手机生成的公钥,然后添加peer

直接保存即可,在启动链接部分关闭链接并重新开启即可让手机链接。

手机端配置

同样的,将手机的局域网ip设置成和上面peer相同的ip 172.25.0.2,并将 DNS 服务器设置成服务器配置的内网ipv4 172.25.0.1

添加一个peer,公钥设置为刚刚在服务器生成的公钥并填写服务器ip和端口,路由的ip地址设置为 0.0.0.0/0,::/0 这样就可以让所有网络流量经过服务器

这时候启动按上面配置好的clash,你的客户端也就能使用clash的网络了