配置文件
Clash 配置文件格式为YAML,具体写法参考:https://github.com/Dreamacro/clash/wiki/configuration
CFW 启动的过程会使用到两个配置文件,分别是:
Home Directory/config.yamlHome Directory/profiles/xxxx.yaml
config.yaml
这是 Clash 的启动文件,位于Home Directory中,如果此文件有错,则 Clash 核心将无法启动,一般会出现如下界面:
::: danger 此文件关乎 Clash 核心是否能正常启动,如非必要,请勿更改 :::
Profiles/xxxx.yaml
Profiles 文件夹下文件均由用户导入,CFW 统一生成的,一般命名为时间戳
这些文件可以不完整,通常只需要有:proxies/proxy-groups/rules三个字段组成即可:
proxies:
- name: Shadowsocks
type: socks5
server: 127.0.0.1
port: 1080
proxy-groups:
- name: Proxy
type: select
proxies:
- Shadowsocks
rules:
- "MATCH,DIRECT"
除此外,还可以添加tun/dns/hosts等字段,但在使用 CFW 时不建议添加
加载过程
CFW 启动流程如下:
- 使用基础配置文件 config.yaml 启动 Clash 核心
- 根据用户上次使用的配置文件(Profiles/xxxxx.yml)进行恢复
- 恢复用户上次操作的策略情况
解读
步骤 1 完成后,Clash 会按照 config.yaml 设置启动
步骤 2 完成后,用户配置文件中以下字段的内容会被提交至 Clash 核心并替换原有字段(这就是 Profiles 里配置文件可以不完整的原因)
- proxies
- proxy-providers
- proxy-groups
- rule-providers
- rules
- tun
- dns
- hosts
::: tip 如果TUN Mode和Mixin中配置了对应字段,用户配置文件中的字段也会被覆盖。
配置优先级Mixin>TUN Mode>Profile :::
::: tip 从0.20.7开始,可点击 Clash Core 右侧的按钮预览最终提交至 Clash 核心的配置文件
原因
之所以不进行全替换,是因为每一个配置文件所设定的端口号可能是不一样的,这样每次切换配置文件后,需要重新设置系统代理以及其他软件的代理端口,这显然太麻烦
所以采用上面的方案,使得用户配置文件以 Plugin 的方式加载 如果需要修改端口号,只需要在 General 界面点击 Port 右侧的端口号即可更改
URL Scheme
下载配置
clash://install-config?url=<encoded URI>
响应头
content-disposition
如果响应头中存在content-disposition字段,则使用filename对应的值作为配置文件名(例如),否则使用 URL 最后一部分作为配置文件名
content-disposition: attachment; filename="abc.yaml"
profile-update-interval
如果响应头中存在profile-update-interval字段,则配置文件自动更新间隔设置为对应的值,以小时为单位
profile-update-interval: 12
subscription-userinfo
如果响应头中存在subscription-userinfo字段,则其对应的流量及到期信息会显示在 Profiles 模块中,规范参考此处
subscription-userinfo: upload=455727941; download=6174315083; total=1073741824000; expire=1671815872
::: tip 此外,CFW 支持识别添加在配置文件首行的subscription-userinfo,格式以#开头,以;结尾。示例
# upload=455727941; download=6174315083; total=1073741824000; expire=1671815872;
因此可以使用预处理脚本定期更新本地配置文件中的订阅信息,参考案例。 :::
profile-web-page-url
如果响应头中存在profile-web-page-url字段,则在右键点击 profile 菜单中会显示Open web page选项,允许用户跳转到对应的门户首页
退出软件
clash://quit
绕过系统代理
设置方式
- 进入 Settings 页面
- 点击 System proxy Bypass 右边 Edit 小字打开编辑界面
- 若要增加绕过
example.com域名,只需在修改编辑界面内容为:bypass: - "example.com" # 下面字段可不删除 - 127.0.0.1 - ... - 点击编辑器右下角保存
bypass 类型为数组,item 为需要绕过的域名或节点,支持通配符*
打断连接
- 进入 Settings 页面
- 点击滚动至 Connections 设置
- 根据需求进行选择或开关
选项说明
Break When Proxy Change
- None:默认值,不进行打断
- Chain:打断所有 chains 中包含此策略组的连接
- All:打断所有连接
Break When Profile Change
- 开:切换配置前先打断所有连接
- 关:不打断
Break When Mode Change
- 开:切换代理模式时断开所有连接
- 关:不打断
便携模式
版本要求
从 0.13.1 版本开始,便携模式开启方式进行简单调整。
开启方法
当软件可执行文件当前目录中新建一个名为data的文件夹,便携模式会将此文件夹将作为基础启动文件夹,作为Home Directory
在不同系统上,可执行文件位置有所不同:
- Windows:安装目录中
Clash for Windows.exe - macOS:软件包目录中
/Contents/MacOS/Clash for Windows
当文件夹存在时,重启软件即可进入便携模式,此时软件将会读取/写入数据至该目录
更新软件
多数情况下,如果需要更新软件版本,只需要先下载新版本,然后将原目录里的data文件夹复制到新安装目录即可
但要注意的是,如果是使用.exe安装包,不能在原目录中直接覆盖安装,因为安装包会先将目录清空,再写入新版本。这样会导致data文件夹丢失
实际上,可以通过在安装目录中建立一个data文件夹的链接实现将其分离于安装目录,这样即使使用.exe版本,只要在安装后,重新建立链接即可
在不同系统中建立链接的命令如下,假设用户定义的配置文件名称为cfw-portable
Windows
mklink /D "C:\Program Files\Clash for Windows\data" "C:\cfw-portable"
macOS
ln -s "/home/cfw-portable" "/Applications/Clash\ for\ Windows.app/Contents/MacOS/data"
::: tip 此方法也可以用于自定义Home Directory :::
旧版本(已过时)
从 0.4.0 开始,Clash for Windows 提供简单的便携支持
使用方法
进入安装目录/resources/static/files/目录中进行如下操作:
- 新建 config.yaml(文件可以为空,但一定要创建)
- 重新启动 Clash for Windows
此时文件夹目录中还有其他文件及文件夹,请勿对其修改
TUN 模式
Windows
启动 TUN 模式需要进行如下操作:
- 点击
General中Service Mode右边Manage,在打开窗口中安装服务模式,安装完成应用会自动重启,Service Mode 右边地球图标变为绿色即安装成功(无法安装参考:这里) - 点击
General中TUN Mode右边开关启动 TUN 模式
::: tip NOTICE 如果使用system作为 TUN stack,需要同时在系统防火墙中将 clash core 放行,方法如下:
在0.19.27及以上版本中,点击 General 页面的盾牌按钮,并在 UAC 弹窗(若有)中允许运行,CFW 将自动配置对应的防火墙规则。
成功配置防火墙规则后该图标作为指示灯亮起。
在 Scoop 版上使用此功能需要0.20.3及以上版本,并且每次更新 CFW 后都需要更新防火墙规则。如果要通过 Scoop 安装脚本实现自动更新规则,可以参考:manifest script :::
::: tip NOTICE 由于查询防火墙权限受限等原因,指示灯可能无法正常工作,请以系统防火墙列表及 Clash 网卡运行状态为准。
这里提供一个可用于自查的 PowerShell 脚本(可能需要管理员权限):
#Requires -Version 3
#Requires -Modules NetSecurity
$List = Get-NetFirewallRule -Enabled True -Action Allow -Description 'Work with Clash for Windows.' | Where-Object { 'Clash Core' -eq $_.DisplayName }
$Report = foreach ($Rule in $List)
{
$Program = (Get-NetFirewallApplicationFilter -AssociatedNetFirewallRule $Rule).Program
[pscustomobject] @{
Enabled = $Rule.Enabled
Action = $Rule.Action
Protocol = (Get-NetFirewallPortFilter -AssociatedNetFirewallRule $Rule).Protocol
Program = $Program
IsPathValid = Test-Path -PathType Leaf -LiteralPath $Program
}
}
$Report
Pause
以 x86-64 版本为例,如果输出类似以下内容,那么规则添加成功(请自行验证 Program 路径的有效性):
Enabled : True
Action : Allow
Protocol : TCP
Program : C:\Program Files\Clash for Windows\resources\static\files\win\x64\clash-win64.exe
IsPathValid : True
Enabled : True
Action : Allow
Protocol : UDP
Program : C:\Program Files\Clash for Windows\resources\static\files\win\x64\clash-win64.exe
IsPathValid : True
:::
- 在使用的配置文件中加入如下内容:
dns:
enable: true
enhanced-mode: fake-ip
nameserver:
- 8.8.8.8 # 真实请求DNS,可多设置几个
- 114.114.114.114
# interface-name: WLAN # 出口网卡名称,或者使用下方的自动检测
tun:
enable: true
stack: gvisor # 使用 system 需要 Clash Premium 2021.05.08 及更高版本
dns-hijack:
- 198.18.0.2:53 # 请勿更改
auto-route: true
auto-detect-interface: true # 自动检测出口网卡
::: tip NOTICE 从Clash Premium 2021.05.08开始,使用auto-*代替macOS-auto-*,往后数个版本将暂时兼容旧字段名。此版本同时添加了system stack支持。参考 :::
注意事项
当enhanced-mode设置为fake-ip时,会出现系统检测到网卡无法联网,微软系 APP 无法登陆使用等问题,可以通过添加fake-ip-filter解决:
dns:
enable: true
enhanced-mode: fake-ip
nameserver:
- 114.114.114.114
fake-ip-filter:
- "dns.msftncsi.com"
- "www.msftncsi.com"
- "www.msftconnecttest.com"
::: tip TUN 模式更推荐使用 fake-ip 模式 :::
macOS
启动 TUN 模式需要进行如下操作:
- 点击
General中Service Mode右边Manage,在打开窗口中安装服务模式,安装完成应用会自动重启,Service Mode 右边地球图标变为绿色即安装成功 - 点击
General中TUN Mode右边开关启动 TUN 模式
- 在使用的配置文件中加入如下内容:
dns:
enable: true
enhanced-mode: fake-ip
nameserver:
- 114.114.114.114 # 真实请求DNS,可多设置几个
# interface-name: en0 # 出口网卡名称,或者使用下方的自动检测
tun:
enable: true
stack: system # 或 gvisor
dns-hijack: # DNS劫持设置为系统DNS
- 114.114.114.114 # 可任意设置,但为了保证CFW关闭后能不影响联网,建议设置真实能访问的DNS服务器
auto-route: true
auto-detect-interface: true # 自动检测出口网卡
::: tip NOTICE 从Clash Premium 2021.05.08开始,使用auto-*代替macOS-auto-*,往后数个版本将暂时兼容旧字段名。 :::
::: tip dns-hijack 不可以劫持局域网地址的 DNS,如 192.168.0.0/16,请务必手动设置系统 DNS :::
::: tip 若要将此 Mac 设置为代理网关,打开 IP 转发即可:
sudo sysctl -w net.inet.ip.forwarding=1
这种做法将在机器下次重启后失效,如果想要永久保存,编辑文件/etc/sysctl.conf,配置下面变量:
net.inet.ip.forwarding=1
net.inet6.ip6.forwarding=1
或者使用 LaunchDaemons 进行配置:
- 新建
network.forwarding.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>Network Forwarding</string>
<key>UserName</key>
<string>root</string>
<key>GroupName</key>
<string>wheel</string>
<key>ProgramArguments</key>
<array>
<string>/usr/sbin/sysctl</string>
<string>-w</string>
<string>net.inet.ip.forwarding=1</string>
<string>net.inet6.ip6.forwarding=1</string>
</array>
<key>KeepAlive</key>
<false/>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
- 将文件添加进
/Library/LaunchDaemons sudo launchctl load /Library/LaunchDaemons/network.forwarding.plist
Linux
启动 TUN 模式需要进行如下操作:
- 点击
General中Service Mode右边Manage,在打开窗口中安装服务模式,安装完成应用会自动重启(某些系统需要手动重启 APP),Service Mode 右边地球图标变为绿色即安装成功 - 点击
General中TUN Mode右边开关启动 TUN 模式 - 在使用的配置文件中加入如下内容:
dns:
enable: true
enhanced-mode: fake-ip
nameserver:
- 114.114.114.114 # 真实请求DNS,可多设置几个
tun:
enable: true
stack: system # 或 gvisor
dns-hijack:
- 1.0.0.1:53 # 请勿更改
::: tip Linux 下一般不需要设置interface-name字段 :::
配置文件参考
Clash Wiki
::: tip NOTICE 如熟悉使用代码启动,也可以使用 mixin 功能进行其他配置 :::
TAP 模式
安装 TAP 网卡
点击General页面中TAP Device选项的Manage按钮,在弹出对话框中选择Install将会安装 TAP 网卡,此网卡用于接管系统流量,安装完成可在系统网络连接中看到名为cfw-tap的网卡
启动 TAP 模式
使用的 Profile 中包含 listen 设置:
dns:
enable: true
enhanced-mode: redir-host # 或 fake-ip
listen: 0.0.0.0:53
nameserver:
- 223.5.5.5
工作原理
此版本可以通过设置 Interface Name (自动识别) 属性避免回环,并且支持了 UDP 及 IP 类请求,请在Settings页面Interface Name选项中选择出站网卡(通常为本机物理网卡)
注意事项
当enhanced-mode设置为fake-ip时,会出现系统检测到网卡无法联网,微软系 APP 无法登陆使用等问题,可以通过添加fake-ip-filter解决:
dns:
enable: true
enhanced-mode: fake-ip
listen: 0.0.0.0:53
nameserver:
- 223.5.5.5
fake-ip-filter:
- "dns.msftncsi.com"
- "www.msftncsi.com"
- "www.msftconnecttest.com"
::: tip TAP 模式更推荐使用 redir-host 模式 :::
Mixin
版本要求
0.9.5 版本更新后,支持向所有配置文件中注入公共属性设置
配置文件
例如:在配置文件中统一添加dns字段,操作如下:
- 进入 Settings 页面
- 滚动至 Profile Mixin 栏
- 点击 YAML 右边 Edit 小字打开编辑界面
- 在修改编辑界面内容为:
mixin: # 注意下面缩进 dns: enable: true listen: :53 nameserver: - 8.8.8.8 - 点击编辑器右下角保存
在启动或切换配置时,上面内容将会替换到原有配置文件中进行覆盖
::: tip 配置文件内容不会被修改,混合行为只会发生在内存中,可以通过任务栏图标菜单开关这个行为 :::
JavaScript
0.10.1 版本更新后,支持使用 JavaScript 进行 mixin 配置,需要传入一个字符串(yaml 多行字符串使用|)
具体步骤如上,只需要将代码填入 JavaScript 栏中,并将 Type 设置成 JavaScript 即可:
module.exports.parse = async (
{ content, name, url },
{ axios, yaml, notify }
) => {
const extra = {
dns: {
enable: true,
listen: ":53",
nameserver: ["8.8.8.8"],
},
};
return { ...content, ...extra };
};
参数说明
CFW 调用用户定义的parse方法时,会传入 2 个参数,分别是配置文件元数据以及工具类对象/方法
配置文件元数据
包括:
- content:yaml 格式化后的 JavaScript 对象
- name:配置文件文件名
- url:配置文件下载地址
工具类对象/方法
包括:
- axios:网络请求框架,GitHub
- yaml:yaml 框架,GitHub
- notify:发出系统通知方法,签名为
function notify(title:string, message:string, silent:bool)
返回说明
parse方法需要返回一个对象,CFW 会将返回的对象序列化后直接载入
配置文件预处理
版本要求
0.10.1 版本更新后,支持使用 JavaScript 对下载后的配置文件进行预处理
0.11.10 版本更新后,支持使用 YAML 对下载后配置文件进行简单预处理
简便方法(YAML)
如果需要对下载地址为https://example.com/profile.yaml的配置文件进行预处理,操作如下:
- 进入 Settings 界面
- 滚动至 Profiles 栏
- 点击 Parsers 右边 Edit 打开编辑器,填入:
parsers: - url: https://example.com/profile.yaml yaml: prepend-rules: - DOMAIN,test.com,DIRECT # rules最前面增加一个规则 append-proxies: - name: test # proxies最后面增加一个服务 type: http server: 123.123.123.123 port: 456 - 点击编辑器右下角保存按钮
当配置文件触发刷新(包括自动更新)时,CFW 会读取yaml字段定义的值,将对应值插入/合并到原配置文件中
参数说明
| 键 | 值类型 | 操作 |
|---|---|---|
| append-rules | 数组 | 数组合并至原配置rules数组后 |
| prepend-rules | 数组 | 数组合并至原配置rules数组前 |
| append-proxies | 数组 | 数组合并至原配置proxies数组后 |
| prepend-proxies | 数组 | 数组合并至原配置proxies数组前 |
| append-proxy-groups | 数组 | 数组合并至原配置proxy-groups数组后 |
| prepend-proxy-groups | 数组 | 数组合并至原配置proxy-groups数组前 |
| mix-proxy-providers | 对象 | 对象合并至原配置proxy-providers中 |
| mix-rule-providers | 对象 | 对象合并至原配置rule-providers中 |
| mix-object | 对象 | 对象合并至原配置最外层中 |
| commands | 数组 | 在上面操作完成后执行简单命令操作配置文件 |
Commands 使用方法(beta)
commands 是一组简单的命令,作为上面操作的补充
例子:
commands:
- dns.enable=false # 命令1
- proxy-groups.0.proxies.2+DIRECT # 命令2
每个命令可以被分为三个部分,分别是:定位+操作+设定值
命令 1 中,定位是dns.enable,操作是=,设定值是false
命令 2 中,定位是proxy-groups.0.proxies.2,操作是+,设定值是DIRECT
定位
定位中每个层级以.分割,数组类型的定位下标由 0 开始计算,命令 2 中proxy-groups.0即表示定位至第 1 个策略组,.proxies表示访问第一个策略组的 proxies 属性,.proxies.2表示 proxies 属性的第 3 个位置
如果不想用序号定位,也可以使用name值定位,proxies以及proxy-groups中的每个项目都会有name属性。例如在proxies中已经定义了名为debug的节点,那么修改其udp参数的定位即为proxies.(debug).udp,名称两边的()是保证识别,如果节点名不包括+、.或=这几个符号,也可以省略不写
操作
目前支持三种操作:
=:覆盖+:插入-:删除
命令 1 中,=表示将dns下enable的值覆盖为false
命令 2 中,+表示在定位的策略组中的proxies数组中添加一个名为DIRECT的值,原本其他值被向后移动 1 位。如果此处改成=,则会覆盖原来第一个值
设定值
设定值是用于插入或覆盖的值,如果操作是-,则此值可有可无,例如:
commands:
- proxies.0- # 命令3
此处可以将配置文件proxies的第 1 个节点删除
如果设定值为纯数字,则会被识别为整数,为true|false则识别为布尔类型,如果 JSON 编码通过则识别为对象
v0.13.7 版本更新后,支持 3 个内置值用于设置策略组节点,分别是[]proxyNames,[]groupNames和[]shuffledProxyNames,并支持使用正则过滤其中节点,例子如下:
yaml:
prepend-proxy-groups:
- name: myGroup # 建立新策略组
type: fallback
url: "http://www.gstatic.com/generate_204"
interval: 300
proxies:
- DIRECT
commands:
- proxy-groups.myGroup.proxies=[]proxyNames|HK # 向策略组添加所有定义的节点名,并按“HK”正则表达式过滤
进阶方法(JavaScript)
如果需要对下载地址为https://example.com/profile.yaml的配置文件进行预处理,操作如下:
- 进入 Settings 界面
- 滚动至 Profiles 栏
- 点击 Parsers 右边 Edit 打开编辑器,填入:
parsers: - url: https://example.com/profile.yaml code: | module.exports.parse = async (raw, { axios, yaml, notify, console }, { name, url, interval, selected }) => { const obj = yaml.parse(raw) return yaml.stringify(obj) } - 点击编辑器右下角保存按钮
当配置文件触发刷新(包括自动更新)时,CFW 会调用此方法对下载的配置文件内容进行处理,再写入本地文件中
当然,parsers 也支持使用路径引入代码:
parsers:
- url: https://example.com/profile.yaml
file: "C:/Users/cfw/parser.js"
::: tip 使用文件时,允许调用该文件目录下的 node_modules 模块 :::
版本 0.20.10 开始支持从远端获取
parsers:
- url: https://example.com/profile.yaml
remote:
url: https://gist.githubusercontent.com/Fndroid/40e6117252f794aa629b875aa1ecadea/raw/d1ba6d230746c9d2ecfbef211c52fd9a567a781e/parser.js
cache: true # 默认为false,指示是否对重复下载此预处理代码使用缓存
::: danger 注意 使用远端配置请选择可信的代码提供者,如不能信任代码提供者,可以从远端拷贝代码然后使用code填入而非使用remote方式引入! :::
参数说明
CFW 调用用户定义的parse方法时,会传入 3 个参数,分别是配置文件文本内容,工具类对象/方法以及配置文件元数据
配置文件文本内容
raw 是一个字符串,一般需要用 yaml 库解析成 JavaScript 对象
工具类对象/方法
包括:
- axios:网络请求框架,GitHub
- yaml:yaml 框架,GitHub
- notify:发出系统通知方法,签名为
function notify(title:string, message:string, silent:bool) - console:日志输出至文件,方便调试,在 Settings 界面中 Parser 设置下方打开
- homeDir:Home Directory 目录
:::tip 除了以上工具类,在使用.js文件时,也可以通过npm引入第三方模块 :::
配置文件元数据
元数据为 JavaScript 对象,包括:
- name:名称
- url:下载地址
- interval:更新周期
- selected:策略组选择缓存,数组
- mode:模式缓存
:::tip 元数据在配置文件首次下载时只有 url 参数 :::
返回说明
parse方法需要返回一个字符串,CFW 会将返回的字符串存入对应的配置文件中
多处理器及正则匹配
正则匹配
上面例子中,使用url匹配配置文件地址,如果一个处理器需要处理多个配置文件,也可以使用正则表达式进行匹配,使用关键字reg设置
parsers:
- reg: ^https://test\.com/.+$ # 正则匹配域名
yaml:
prepend-rules:
- DOMAIN,test.com,DIRECT
多处理器
parser 定义的数组支持多个处理器从上至下按顺序执行,例如:
parsers:
- reg: https://test.com.+$ # 第一个执行的parser
file: "C:/Users/cfw/parser.yaml"
- url: https://example.com/profile.yaml # 对上一个parser执行的结果进行处理
file: "C:/Users/cfw/parser.js"
::: tip file 同时支持 yaml 及 js 格式的文件 :::
使用案例
向本地配置文件添加订阅信息
- 准备一个本地配置文件的副本,记下文件名和路径。为方便后续说明,以下用
myprofile.yml指代此文件名,用C:\...\myprofile.yml指代此文件路径。
::: tip NOTICE 配置完成后,此副本文件将作为 CFW 配置文件的订阅源使用,对配置文件的非临时性修改需要在此副本文件中进行编辑,并在修改后执行订阅更新。移动、重命名此文件后需要修改 CFW 中相应的配置选项。 :::
::: tip 此处使用 CFW 创建的配置文件本身而非副本作为订阅源虽然可以实现相同的功能,但无法保证运行时的可靠性,如果没有特殊情况不建议这样使用。 :::
- 准备一个包含订阅信息
subscription-userinfo的订阅链接。为方便后续说明,以下用https://example.com/subscription_url指代此订阅链接。
::: tip 可使用curl -I 'https://example.com/subscription_url'检查订阅链接是否包含订阅信息。 :::
- 修改 CFW 中的配置文件选项,在
URL中填写副本文件的本地映射地址file:///C:\...\myprofile.yml。保存后执行订阅更新并确保没有报错。 - 添加对应的预处理脚本,并确保正常匹配到配置文件。
parsers: # array
- reg: "myprofile.yml"
code: |
module.exports.parse = async (raw, { axios, yaml, notify, console }) => {
raw = raw.replace(/# upload=\d*; download=\d*; total=\d*; expire=\d*;*\n/gm,'')
const url = 'https://example.com/subscription_url'
let { headers:{"subscription-userinfo": si = ""}={}, status } = await axios.head(url)
si = si.replace(/;*$/g,'')
if (status === 200 && si) {
return `# ${si};\n${raw}`
}
return raw
}
- 执行订阅更新,配置文件模块中出现订阅信息即说明配置成功。
::: tip 配置完成后可自行设置自动更新选项。 :::
Actions
版本要求
0.18.8 版本更新后,支持使用 JavaScript 定义 proxy 及 profile 右键菜单中 Run script 选项行为
定义行为
- 进入 Settings 界面
- 滚动至 Actions 栏
- 点击 Scripts 右边 Edit 打开编辑器,填入:
scripts: proxy: code: | module.exports.run = (payload, { dialog }) => { dialog({ message: `proxy name: ${payload.name}` }) } profile: {} - 点击编辑器右下角保存按钮
- 进入 Proxies 界面,在任意 proxy 中右键选择 Run script 即会弹出对话框显示该 proxy 的 name 属性
::: tip 除了使用 code 指定运行代码,也可以用 file 属性指定执行脚本路径 :::
参数说明
CFW 调用用户定义的run方法时,会传入 2 个参数,分别是proxy 或 profile 属性,工具类对象/方法
proxy 或 profile 属性
payload 是一个对象,表示右键点击的对象
工具类对象/方法
包括:
- axios:网络请求框架,GitHub
- yaml:yaml 框架,GitHub
- notify:发出系统通知方法,签名为
function notify(title:string, message:string, silent:bool) - console:日志输出至文件,方便调试,在 Settings 界面中 Actions 设置下方 Console Output 打开
- homeDir:Home Directory 目录
- dialog: 对话框,可以获取用户选择,Docs
:::tip 除了以上工具类,在使用.js文件时,也可以通过npm引入第三方模块 :::
Diff 处理
git merge。
使用方法
- 进入 Profiles 界面,在需要设置 Diff 处理的配置文件上点击右键,出现菜单后,选择 Diff 选项:

- 此时会调用系统默认编辑器编辑配置文件,对此文件的编辑将会在配置文件更新时自动合并到新的配置文件中
- 更新一次配置文件
冲突
如果远端配置文件发生更新,并且与本地修改产生冲突,将需要手动进行合并。
冲突的格式非常简单:
<<<<<<<
本地修改
=======
远端修改
>>>>>>>
根据自己的需求,把多余的地方删除即可,包括<<<<<<<、=======和>>>>>>>。
如果使用 VSCode,操作更简便: 
::: tip Diff 处理会在预处理之后进行 :::
轻量模式(Lightweight Mode)
版本要求
0.15.0 版本更新后,增加轻量模式支持
使用说明
依赖于内置 Service Mode,启动轻量模式后,关闭软件界面后 CFW 将会完全关闭,仅保留 Clash 核心继续工作。再次启动 CFW 则会快速恢复并连接核心。
此模式下,CFW 界面关闭后将不再占用系统内存,但同时部分功能将会失效,例如:
- 任务栏图标及菜单
- 配置文件定时更新
- TAP 模式
- 后台启动其他应用
- 后台更新检测
::: danger 其他未提及功能也可能会受到影响,如追求更好体验,不建议使用此功能 :::
开启步骤
- 点击
General中Service Mode右边Manage,在打开窗口中安装服务模式,安装完成应用会自动重启,Service Mode 右边地球图标变为绿色即安装成功 - 点击
Settings界面中General模块中Lightweight Mode进行开启
开启后关闭界面操作即自动关闭软件,重新启动软件会自动恢复,已选择配置文件及节点不会丢失。
SSID 策略
版本要求
0.20.23 版本更新后,支持 SSID 策略,General 中部分开关可以根据设定的策略临时切换
配置
- 进入 Settings 界面
- 滚动至 Experimental Features 栏
- 点击 SSID Strategy 右边 Edit 按钮打开编辑界面,按照格式添加对应策略:
strategy: # object SSID: # name of your Wi-Fi tun: false # mixin: false system: false
说明
- tun:是否开启 TUN Mode 开关
- mixin:是否开启 Mixin 开关
- system:是否开启 System Proxy 开关
注意
- 如果不写对应的键,则触发 Wi-Fi 连接时,对应开关不会变更,上面例子中
mixin不会因 Wi-Fi 切换而改变,保持用户原来选择的状态 - 如果在当前已经连接了包含在策略中的 Wi-Fi,此时在界面中更改以上三个开关的动作会被记录为用户行为,即策略触发时为临时状态
DHCP 服务端
版本要求
0.16.0 版本更新后,macOS 版本支持 DHCP 服务端部署
用途
TUN 模式下,macOS 可作为局域网代理网关。DHCP 服务器可以方便对局域网内其他设备进行地址及网关分配,进而控制设备流量是否被 Clash 接受并处理。
开启条件
- TUN 模式正确配置并运行,并且已经开启 IP 转发
- 网络中 DHCP 功能关闭(一般是路由器,避免冲突)
- 本机 IP 地址设置为静态地址
操作步骤
- 进入 Settings 界面,底部找到
Experimental Features打开DHCP Server选项 - 进入 Router 界面,点击右上角 Start 按钮
点击 Interface 右边选择对应网卡,此时剩下值会自动填充,如果不明白这些字段的意义,使用默认即可 - 点击 Continue 后,DHCP 服务器将会启动
局域网中设备重新连接后,列表中将会出现。此时可以在 Default Gateway和Clash TUN中切换进而控制设备是否由 Clash 接管网络,切换后设备需要重新接入网络
::: tip 接管切换后需要将设备重新接入网络方能获取正确的地址 :::
::: tip 启动 DHCP 服务端功能后,CFW 将会阻止系统进入休眠(但允许关闭显示器) :::
Enhanced Tray
版本要求
0.15.2 版本更新后,支持 Enhanced Tray。
系统区别
由于 Windows 任务栏只能显示一个图标,无法显示更多其他信息,为了保证和 macOS 有类似的体验,在 Windows 下 Enhanced Tray 将会以悬浮窗的形式显示。
默认情况下,Enhanced Tray 显示的内容包括 4 部分:图标,流量速度,规则模式及自定义内容。
自定义内容
自定义内容允许是简单字符串或脚本返回值。
当使用脚本(Script)时,需要在模块导出一个run方法:
module.exports.run = () => {
return "hello world"; // 如果想以双行显示两个字符串,此处可以返回一个长度为2的数组
};
当然,脚本支持使用 npm 引入其他第三方模块。
自定义配置目录
版本要求
0.8.5 版本后,支持自定义profiles目录路径
配置文件
- 进入 Settings 界面
- 滚动至 Profiles 栏
- 点击 Folder Path 右边 Select 按钮
- 选择目录
启动其他应用
使用
- 进入 Settings 页面
- 点击滚动至 Child Processes 设置
- 点击 Processes 右边 Edit 按钮,打开的编辑器中添加:
processes: - command: bark-helper-go.exe # 程序名称 args: - "-t" # 运行参数1 - "abcdefghijk" # 运行参数2 options: cwd: C:\bark-helper # 子进程工作目录 log: true # 将在 cwd 目录生成输出日志 - 点击编辑器右下角保存
添加完毕后重启 CFW 即可生效
其他参数参考:http://nodejs.cn/api/child_process.html#child_process_child_process_spawn_command_args_options
自定义状态栏图标
版本要求
0.8.9 版本后,支持自定义状态栏图标
配置
- 进入 Settings 界面
- 滚动至 Appearance 栏
- 在 Default Icon Path 及 System Proxy On Icon Path 右边输入栏中输入图标路径
ICO 文件大小
建议 64x64,如果不清晰可以尝试 32x32
自定义字体
版本要求
0.9.3 版本更新后,支持自定义客户端字体
配置文件
- 进入 Settings 界面
- 滚动至 Appearence 栏
- 在 Font Family 右边输入框输入字体名称
::: tip 注意:新安装字体需要重启软件才会生效 :::
自定义节点排序
版本要求
0.9.10 版本更新后,支持自定义节点排序
配置文件
- 进入 Settings 界面
- 滚动至 Proxies 栏
- 在 Order By 右边选择对应排序方式
参数说明:
- Default:按配置文件定义节点顺序
- Latency:按节点延迟升序排列
- Alphabet:按节点名称字母表排列
自定义请求头
版本要求
0.9.11 版本更新后,支持自定义配置文件下载请求的请求头
配置文件
- 进入 Settings 界面
- 滚动至 Profiles 栏
- 点击 Request Headers 右边 Edit 按钮打开编辑器,输入:
headers: token: "123456" cfw-version: "0.9.11" - 点击编辑器右下角按钮保存
保存成功后,更新配置文件(包括自动更新)时,CFW 所发起的请求将会包含上述定义的字段。