Clash在Linux下的使用

程序运行环境

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Clash 的 DNS 服务有两种类型,一种是 Fake-IP,另一种是 Redir-Host(半淘汰)。Clash默认端口port通常是 7890,这个端口用于 HTTP 代理。

Fake-IP 的原理:首先定义一个 Fake IP 池(198.18.0.1/16),所有的 DNS 查询服务都直接返回这个池子里的 IP,此时可以做到如果通过域名匹配到某条规则不是直连,可以将 DNS 放到远程服务器解析,借此解决 DNS 污染问题。这种场景下,因为所有返回的(目标) IP 都变成了 198.18.0.1/16,我们无法区分是内网还是外网,我们需要更新一下 clash 的配置,在 DNS 服务中提供了参数,在这里面的域名将保持在本地查询 DNS 同时返回真实的 IP。

Redir-Host 的原理:首先查询不可信 DNS,如果返回了海外的 IP,则查询可信 DNS 并返回可信结果,如果返回国内 IP,就直接返回不可信结果。另外,此模式下所有的请求在转发时都发送 Host,而不是 IP,这样即使得到了污染 IP,远端仍然能解析出正确的 IP。

# 综合来看,玩游戏建议优先用 TUN 模式配合 Fake-IP,Fake-IP 会更快一点,但假IP也可能会导致某些情景下无法加载。虽然 Redir-Host 省心且不会有假IP污染DNS缓存的情况,但DNS泄露是在所难免的。

Fake-IP 模式下ping特定域名如何返回真实IP:把需要返回真实IP的域名加到dns配置中的 fake-ip-filter 即可
Fake-IP 模式下配合去广告 DNS 使用的时候,由于终端拿到的假 IP 不为空,有些没节操的软件会引发雪崩,即不断循环发请求,导致设备发热以及额外的流量消耗

# Clash 的工作模式(mode: rule)默认为规则模式,按配置文件中的规则对国内外流量进行分流。以下是其他一些模式:
rule: 规则模式,按规则对流量进行分流
direct:直连模式,所有流量不使用代理
global:全局模式,所有流量都走代理
script:脚本模式,仅 premium 版可用,允许用户编写脚本以编程的方式设置规则

在Linux中安装Clash

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
# META 版本项目地址:https://github.com/MetaCubeX/mihomo/releases/
# OpenClash项目地址:https://github.com/vernesong/OpenClash/tree/core/master
# dev版本: 是初始的开源项目(clash-foss),dev和premium都是同一班人马,meta则是clash项目的另一个分支
# meta版本: 是基于dev版本修改的开源版本,相较于上面两个的区别是 vless支持,域名嗅探等功能
# premium版本: 是基于dev版本修改的闭源版本,用于clash for windows和clash for android,相较于dev版本多出了节点集、代理集等功能
# dev和premium都算是停止开发了,现在很多新特性和功能都是meta独有的,TUN模式meta内核一样支持

wget https://raw.githubusercontent.com/vernesong/OpenClash/core/master/meta/clash-linux-arm64.tar.gz
tar -xzvf clash-linux-arm64.tar.gz
sudo mv clash /usr/local/bin/clash
sudo chmod +x /usr/local/bin/clash

# 创建文件夹,运行 clash 之前需要存在配置文件,否则 clash 无法启动:
mkdir -p /home/leux/.config/clash/
wget -O /home/leux/.config/clash/Country.mmdb https://github.com/Dreamacro/maxmind-geoip/releases/download/20241212/Country.mmdb
wget -O /home/leux/.config/clash/config.yaml [你的订阅链接]

# 运行如下命令启动Clash后将你要翻墙的设备设置【代理IP为:192.168.1.1 端口:7890】即可通过Clash访问外网
sudo /usr/local/bin/clash -d /home/leux/.config/clash/

# 为clash添加绑定低位端口的权限(可选),这样运行clash的时候可无需root权限
# sudo setcap cap_net_bind_service=+ep /usr/local/bin/clash

# Windows手动代理:设置 -> 网络和Internet -> 代理 -> 手动设置代理 -> 打开并填入该IP地址和端口

#########################################################################################

# 执行如下命令段来添加开机自启Clash程序的systemd服务文件:
sudo cat > /etc/systemd/system/clash.service << EOF
[Unit]
Description=Clash Service
After=network.target

[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/clash -d /home/leux/.config/clash/
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

Clash配置文件解析

  1. 全局配置
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
# port: 7890			# HTTP(S) 代理服务器端口
# socks-port: 7891 # SOCKS5 代理端口
# redir-port: 7892 # 透明代理端口,用于 Linux 和 MacOS
mixed-port: 10801 # HTTP(S) 和 SOCKS 代理混合端口

ipv6: true # # 开启IPv6总开关,关闭阻断所有IPv6链接和屏蔽DNS请求AAAA记录。可选值 true/false,默认为 true
mode: rule # 运行模式。rule 规则匹配(默认),direct 全局直连,global 全局代理 (需要在 GLOBAL 策略组选择代理/策略)
allow-lan: true # 允许其他局域网设备经过Clash的代理端口访问互联网。可选值 true/false
interface-name: en0 # Clash的流量出站接口

# 绑定地址,仅允许其他设备通过这个地址访问
bind-address: "*" # "*" 绑定所有IP地址,192.168.1.1 绑定单个IPV4地址,[ff06::c3] 绑定单个IPV6地址

# Clash内核输出日志的等级,仅在控制台和控制页面输出
log-level: info # silent 静默不输出,error 仅输出发生错误至无法使用的日志,warning 输出发生错误但不影响运行的日志,以及 error 级别内容,info 输出一般运行的内容,以及 error 和 warning 级别的日志,debug 尽可能的输出运行中所有的信息

secret: "" # API 的访问密钥
external-controller: 127.0.0.1:9090 # 外部控制器API监听地址,你可以将 127.0.0.1 修改为 0.0.0.0 来监听所有 IP
external-ui: /path/to/ui/folder # 外部用户界面,可将静态网页资源 (比如Clash-dashboard) 运行在 Clash API, 路径为 API 地址/ui
external-ui-name: xd # 自定义外部用户界面名字,合并为 external-ui/xd
external-ui-url: "https://github.com/MetaCubeX/metacubexd/archive/refs/heads/gh-pages.zip" # 从GitHub获取外部用户界面下载地址

geo-auto-update: false # 是否自动更新GEOIP
geo-update-interval: 24 # 更新间隔,单位为小时
geodata-mode: true # 更改GEOIP使用文件,mmdb 或者 dat,可选 true/false,true为 dat,此项有默认值 false
geodata-loader: memconservative # GEOIP文件加载模式,standard:标准加载器,memconservative:专为内存受限 (小内存) 设备优化的加载器 (默认值)
geox-url: # 自定 GEO 下载地址
geoip: "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@release/geoip.dat"
geosite: "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@release/geosite.dat"
mmdb: "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@release/country.mmdb"
asn: "https://github.com/xishang0128/geoip/releases/download/latest/GeoLite2-ASN.mmdb"

authentication: # http,socks 入口的验证用户名,密码
- "user1:pass1"
- "user2:pass2"

skip-auth-prefixes: # 设置允许跳过验证的 IP 段
- 127.0.0.1/8
- ::1/128

lan-allowed-ips: # 允许连接的 IP 地址段,仅作用于 allow-lan 为 true, 默认值为 0.0.0.0/0 和::/0
- 0.0.0.0/0
- ::/0

lan-disallowed-ips: # 禁止连接的 IP 地址段,黑名单优先级高于白名单,默认值为空
- 192.168.0.3/32
  1. DNS配置
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
dns:
enable: true # 是否启用,如为 false,则使用系统 DNS 解析
prefer-h3: false # DOH 优先使用 http/3
use-hosts: true # 是否回应配置中的 hosts,默认 true
use-system-hosts: true # 是否查询系统 hosts,默认 true
respect-rules: false # dns 连接遵守路由规则,需配置 proxy-server-nameserver
listen: 0.0.0.0:1053 # DNS 服务监听,仅支持 udp
ipv6: false # 是否解析 IPV6, 如为 false, 则回应 AAAA 的空解析
default-nameserver: # 默认DNS, 用于解析DNS服务器的域名,必须为IP, 可为加密DNS
- 223.5.5.5
enhanced-mode: fake-ip # Clash的DNS处理模式,可选值 fake-ip / redir-host(默认)
fake-ip-range: 198.18.0.1/16 # fakeip 下的 IP 段设置,tun 的默认 IPV4 地址 也使用此值作为参考
fake-ip-filter-mode: blacklist # 可选 blacklist/whitelist,默认blacklist,whitelist 即只有匹配成功才返回 fake-ip
fake-ip-filter: # fakeip 过滤,以下地址不会下发 fakeip 映射用于连接,值支持域名通配以及引入域名集合
- '*.lan'
- "+.*" # 本通配符可回退所有域名,此时fakeip就完全变成了redir-host(不建议)
nameserver-policy: # 指定域名查询的解析服务器,可使用 geosite, 优先于 nameserver/fallback 查询,键支持域名通配,值支持字符串/数组
'+.arpa': '10.0.0.1'
'rule-set:cn':
- https://doh.pub/dns-query
- https://dns.alidns.com/dns-query
nameserver: # 默认的域名解析服务器
- https://doh.pub/dns-query
- https://dns.alidns.com/dns-query
fallback: # 后备域名解析服务器,一般情况下使用境外 DNS, 保证结果可信,配置 fallback后默认启用 fallback-filter,geoip-code为 cn
- tls://8.8.4.4
- tls://1.1.1.1
proxy-server-nameserver: # 代理节点域名解析服务器,仅用于解析代理节点的域名,如果不填则遵循nameserver-policy、nameserver和fallback的配置
- https://doh.pub/dns-query
direct-nameserver: # 用于direct出口域名解析的 DNS 服务器,如果不填则遵循nameserver-policy、nameserver和fallback的配置
- system
direct-nameserver-follow-policy: false # 是否遵循nameserver-policy,默认为不遵守,仅当direct-nameserver不为空时生效
fallback-filter: # 后备域名解析服务器筛选,满足条件的将使用 fallback结果或只使用 fallback解析
geoip: true # 是否启用 geoip 判断
geoip-code: CN # 可选值为 国家缩写,默认值为 CN,除了 geoip-code 配置的国家 IP, 其他的 IP 结果会被视为污染,geoip-code 配置的国家的结果会直接采用,否则将采用 fallback结果
geosite: # 可选值为对于的 geosite 内包含的集合,geosite 列表的内容被视为已污染,匹配到 geosite 的域名,将只使用 fallback解析,不去使用 nameserver
- gfw
ipcidr: # 书写内容为 IP/掩码,这些网段的结果会被视为污染,nameserver解析出这些结果时将会采用 fallback的解析结果
- 240.0.0.0/4
domain: # 这些域名被视为已污染,匹配到这些域名,会直接使用 fallback解析,不去使用 nameserver
- '+.google.com'
- '+.facebook.com'
- '+.youtube.com'
  1. TUN配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
tun:
enable: false
device: utun0 # 指定TUN网卡名称,MacOS设备只能使用 utun 开头的网卡名
stack: system # TUN模式堆栈,如无使用问题建议使用 mixed 栈,可用值: system/mixed/gvisor(默认)
auto-route: true # 配置路由表
auto-redirect: false # 自动配置 iptables 以重定向 TCP 连接。仅支持 Linux。带有 auto-redirect 的 auto-route 现在可以在路由器上按预期工作,无需干预。
auto-detect-interface: true # 自动识别出口网卡
mtu: 9000 # 最大传输单元
gso: false # 启用通用分段卸载,仅支持 Linux
gso-max-size: 65536 # 通用分段卸载包的最大大小
strict-route: true # 将所有连接路由到 tun 来防止泄漏,但你的设备将无法其他设备被访问
dns-hijack: # 需要劫持的 DNS
- 0.0.0.0:53
route-address-set: # 将指定规则集中的目标 IP CIDR 规则添加到防火墙, 不匹配的流量将绕过路由, 仅支持 Linux,且需要 nftables,`auto-route` 和 `auto-redirect` 已启用。
- ruleset-1
- ruleset-2
route-exclude-address-set: # 将指定规则集中的目标 IP CIDR 规则添加到防火墙, 匹配的流量将绕过路由, 仅支持 Linux,且需要 nftables,`auto-route` 和 `auto-redirect` 已启用。
- ruleset-3
- ruleset-4
route-address: # 启用 auto-route 时使用自定义路由而不是默认路由
- 0.0.0.0/1
- 128.0.0.0/1
- "::/1"
- "8000::/1"
  1. 路由规则
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
rules:						# 规则将按照从上到下的顺序匹配,列表顶部的规则优先级高于其底下的规则
- 'IP-CIDR,127.0.0.0/8,DIRECT' # 匹配IP地址范围,IP-CIDR和IP-CIDR6效果是一样的,IP-CIDR6只是一个别名
- 'IP-CIDR6,fe80::/10,DIRECT'
- 'DOMAIN,local.adguard.org,DIRECT' # 精确匹配某个域名
- 'DOMAIN-SUFFIX,cn,DIRECT'
- 'DOMAIN-SUFFIX,youtu.be,OKZTWO' # 匹配域名的后缀
- 'DOMAIN-KEYWORD,usage,REJECT'
- 'DOMAIN-KEYWORD,google,OKZTWO' # 匹配包含指定关键字的域名
- 'GEOIP,CN,DIRECT' # 匹配 IP 所属国家代码
- 'MATCH,OKZTWO' # 匹配所有剩余流量,通常用于兜底规则

# 高优先级规则放在顶部。常见规则放在中间。MATCH(兜底规则)放在底部,确保所有流量都有处理。
PROXY # 使用代理策略组,例如上面的 OKZTWO
DIRECT # 直连,不使用代理
REJECT # 拦截流量,丢弃请求
  1. 代理节点
1
2
3
4
5
6
7
8
9
proxies:
- { name: 专线4, type: vmess, server: hk.abc.com, port: 60237, uuid: 12345678-1234-4888-ac86-0123388099ca, alterId: 0, cipher: auto, udp: true }
- { name: '韩国2' type: trojan, server: kr.abc.com, port: 60195, password: 12345678-1234-4888-ac86-0123388099ca, udp: true, sni: kr.dns.com }

name # 必须项,代理名称,不可重复
type # 必须项,代理节点类型
server # 必须项,代理节点服务器 (域名/ip)
port # 必须项,代理节点端口
udp # 是否允许 UDP 通过代理,默认为 false
  1. 代理策略组
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
proxy-groups:
- { name: OKZTWO, type: select, proxies: [自动选择, 故障转移, 专线4, '韩国2'] }
- { name: 自动选择, type: url-test, proxies: [专线4, '韩国2'], url: 'http://www.gstatic.com/generate_204', interval: 86400 }
- { name: 故障转移, type: fallback, proxies: [专线4, '韩国2'], url: 'http://www.gstatic.com/generate_204', interval: 7200 }

name # 必须项,策略组的名字,如有特殊符号,应当使用引号将其包裹
type # 必须项,策略组的类型
proxies # 该组内包含的具体代理节点的列表
url # 健康检查测试地址
interval # 健康检查间隔,如不为 0 则启用定时测试,单位为秒

策略组的类型 (type:) 有以下几种:
select: # 手动选择。用户可以在客户端中手动选择具体节点。
url-test: # 自动测试所有节点的延迟,并选择最快的节点。
fallback: # 备用机制。主要节点不可用时切换到可用的节点。
load-balance: # 负载均衡,在多个节点间分配流量。

添加WEB控制界面

1
2
3
4
5
6
7
8
9
10
11
# 修改配置文件 /home/leux/.config/clash/config.yaml 中WEB控制界面的参数
external-controller: 0.0.0.0:9090 # 控制面板端口(允许任意IP访问)
external-ui: "/ui" # 界面所在路径(填文件夹的路径)
secret: "1234567890" # 控制面板密码(访问密码可选)

# 下载并拷贝WEB控制界面到指定路径
wget https://github.com/haishanh/yacd/archive/gh-pages.zip
unzip gh-pages.zip
mv yacd-gh-pages/ /home/leux/.config/ui/

# 最后可通过【运行Clash的设备IP地址和端口号】加界面路径访问控制页面:http://192.168.1.1:9090/ui/

局域网下设备无感代理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 使用Clash中TUN功能可以自动对操作系统的路由表、路由规则和重定向的管理
# 开启TUN功能后LAN下DHCP接入的设备无需手动设置代理即可访问墙外网站,但运行Clash时需要使用root权限

# 添加或修改配置文件 /home/leux/.config/clash/config.yaml 中TUN功能参数
tun:
enable: true
stack: system # TUN模式堆栈,如无使用问题建议使用 mixed 栈,可用值: system/mixed/gvisor(默认)
auto-route: true # 自动设置全局路由,可以自动将全局流量路由进入 tun 网卡
auto-redirect: true # 仅支持 Linux,自动配置 iptables/nftables 以重定向 TCP 连接,需要auto-route已启用(需要内核netlink支持)
auto-detect-interface: true # 自动选择流量出口接口,多出口网卡同时连接的设备建议手动指定出口网卡,与 interface-name: 参数冲突
#device: utun0 # 指定TUN网卡名称,MacOS设备只能使用 utun 开头的网卡名
#dns-hijack: # DNS劫持,将匹配到的连接导入内部DNS模块,默认协议为 udp://
# - 198.18.0.2:53 # 当 "fake-ip-range" 是 198.18.0.1/16, 应该劫持 198.18.0.2:53
#- 1.0.0.1:53
#- tcp://8.8.8.8:53
#- any:53
#- tcp://any:53 # 代表接管局域网中所有IP的53端口请求

自用Clash配置部分示例

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
# 在Linux下使用networking,dnsmasq,hostapd搭建无线路由器能实现LAN下设备无感代理的配置(Fake-IP类型 + TUN模式)
mixed-port: 7890
allow-lan: true
bind-address: '*'
mode: rule
log-level: info
external-controller: '0.0.0.0:9090'
external-ui: "/ui"
dns:
enable: true
ipv6: false
default-nameserver: [223.5.5.5, 119.29.29.29]
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
use-hosts: true
nameserver: ['https://doh.pub/dns-query', 'https://dns.alidns.com/dns-query']
fallback: ['https://doh.dns.sb/dns-query', 'https://dns.cloudflare.com/dns-query', 'https://dns.twnic.tw/dns-query', 'tls://8.8.4.4:853']
fallback-filter: { geoip: true, ipcidr: [240.0.0.0/4, 0.0.0.0/32] }
tun:
enable: true
stack: system
auto-route: true
auto-redir: true
auto-detect-interface: true
proxies:
......
proxy-groups:
......
rules:
......