规则是静态的匹配表,而脚本模式允许你用一段 JavaScript 为每一条连接动态决定出口——按时间段、按端口、按解析出的 IP,逻辑任意组合。这是 Premium 内核的功能,CFW 开箱即用。
启用方式
配置文件顶级加入 script 段,并把 mode 设为 script(CFW 的模式切换里会出现 Script 选项):
mode: script
script:
code: |
function main(ctx, metadata) {
// 返回出口名称:代理组名 / "DIRECT" / "REJECT"
if (metadata.host && metadata.host.endsWith("company.com")) {
return "DIRECT";
}
// 深夜自动直连游戏端口,白天走代理组
const hour = new Date().getHours();
if (metadata.dst_port === 3074 && hour >= 1 && hour <= 7) {
return "DIRECT";
}
// 其余交给规则引擎继续匹配
return ctx.resolveOutbound(metadata) ?? "节点选择";
}
metadata 常用字段
| 字段 | 含义 |
|---|---|
host | 目标域名(可能为空,纯 IP 连接时) |
dst_ip / dst_port | 目标 IP 与端口 |
src_ip / src_port | 来源地址(配合 allow-lan 区分设备) |
network | tcp / udp |
process_name | 进程名(TUN 下可用) |
上下文对象还提供 ctx.geoip(ip)、ctx.resolveIP(host) 等工具函数,可实现“先解析再按归属分流”这类规则做不到的逻辑。
脚本 shortcuts:更轻量的用法
不想整个接管 mode,可以只定义“快捷函数”,然后在普通规则里引用,兼得两者:
script:
shortcuts:
late-night-game: dst_port == 3074 and now.hour < 7
rules:
- SCRIPT,late-night-game,DIRECT
- MATCH,节点选择
注意事项
- 脚本对每条连接执行,复杂逻辑会放大延迟;能用规则表达的尽量用规则。
- 脚本报错时连接会失败,Logs 页面会输出异常信息,改动后务必观察日志。
- 不要运行来路不明的配置中的脚本——脚本能力越强,恶意配置的风险越大。
提示:时间、端口一类的条件用 shortcuts 表达最简洁;只有需要调用解析、组合多条件时才值得写完整 main 函数。