分流规则
规则类型

规则类型

通过规则匹配连接信息,指定连接的出站方式,例如直连、代理、拦截等。

规则可以分类为两种类型,其中 IP 类型可能会触发 DNS 解析:

  • 基于域名
  • 基于 IP
  • 其他复合类型
💡

希望针对 URL 编写规则?请阅读 HTTP 重写章节。

💡

在 Stash 2.0 以及后面的版本中,引用不存在代理的规则会被略过而不会引发错误,排查此类问题请留意日志。

DOMAIN

完全匹配域名。

DOMAIN-SUFFIX

匹配域名后缀,例如 DOMAIN-SUFFIX,google.com 匹配 google.comwww.google.com

DOMAIN-KEYWORD

关键词匹配域名。

GEOIP

通过 MaxMind GeoIP 匹配国家代码,比如 CN,可以添加 no-resolve 避免触发 DNS 解析。

💡

Stash 允许用户替换符合 MaxMind GeoIP 格式的数据库,用户可以根据自身需求选择更适合自己场景的 MaxMind GeoIP 数据库。

IP-ASN

通过 IP 自治系统编号,比如 714,可以添加 no-resolve 避免触发 DNS 解析。

IP-CIDR / IP-CIDR6

IP CIDR 范围,可以添加 no-resolve 避免触发 DNS 解析。

DST-PORT

目标端口。

RULE-SET

规则集合,请参考规则集合

PROCESS-NAME

进程名称,例如 Telegram,仅对本机进程有效。

⚠️

由于 Network Extension 的限制,Stash for iOS(包括运行于 Apple silicon 设备上的 iOS 版)不支持 PROCESS-NAME 规则,配置中进程相关规则会被忽略。

PROCESS-PATH

进程路径,例如 /Applications/Telegram.app/Contents/MacOS/Telegram,仅对本机进程有效。

⚠️

由于 Network Extension 的限制,Stash for iOS(包括运行于 Apple silicon 设备上的 iOS 版)不支持 PROCESS-PATH 规则,配置中进程相关规则会被忽略。

SCRIPT

通过 Python 表达式匹配请求,表达式必须返回 Boolean 值,执行错误的表达式会被略过。

表达式可以读取下面的变量:

{
  "network": "string", // one of tcp / udp
  "host": "string", // may be empty
  "dst_ip": "string", // may be empty
  "dst_port": "number",
  "src_ip": "string", // only works with gateway mode
  "src_port": "number" // only works with gateway mode
}

表达式可以调用下面的函数:

def resolve_ip(host: str) -> str:
    pass
 
def in_cidr(ip: str, cidr: str) -> bool:
    pass
 
def geoip(ip: str) -> str:
    pass
 
def ipasn(ip: str) -> int:
    pass
 
def match_provider(name: str) -> bool:
    pass

例如,需要拦截 QUIC 协议的请求,可以这样写:

rules:
  - SCRIPT,quic,REJECT
  - SCRIPT,udp-cn,REJECT
 
script:
  shortcuts: # 可以在 rule 中引用
    quic: network == 'udp' and (dst_port == 443 or dst_port == 4483 or dst_port == 9305) # 4483 与 9305 为 BiliBili 的 QUIC CDN
    udp-cn: network == 'udp' and geoip(dst_ip if dst_ip != '' else resolve_ip(host)) == 'CN' # 禁止发往 CN 的 UDP
Last updated on September 13, 2022