规则是静态的匹配表,而脚本模式允许你用一段 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 区分设备)
networktcp / 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 函数。