分流规则
规则类型

规则类型

通过编写规则可以指定不同连接的出站方式,例如通过某个代理转发,或者拦截。可以依据连接的 IP、域名、进程名或者组合多个条件去匹配。

对于每一条连接,总是从上到下匹配规则。

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

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

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

💡

在规则的末尾可以添加 no-track 参数,可以隐藏匹配到此规则的连接,例如 SCRIPT,quic,REJECT,no-track。这对于避免大量 REJECT 记录充斥页面十分有效。

DOMAIN

完全匹配域名,例如 DOMAIN,google.com 匹配 google.com 但不匹配 www.google.com

DOMAIN-SUFFIX

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

DOMAIN-KEYWORD

关键词匹配域名,例如 DOMAIN-KEYWORD,google 匹配 google.comgoogle.jp

GEOIP

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

💡

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

IP-ASN

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

IP-CIDR / IP-CIDR6

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

DST-PORT

目标端口。

RULE-SET

在引用大量规则时请使用规则集合

GEOSITE

domain-list-community (opens in a new tab) 是由 v2fly 社区维护的域名列表。

例如 GEOSITE,twitter 匹配 Twitter (opens in a new tab) 公司相关域名:

ads-twitter.com
cms-twdigitalassets.com
periscope.tv
pscp.tv
t.co
tellapart.com
tweetdeck.com
twimg.com
twitpic.com
twitter.biz
twitter.com
twitter.jp
twittercommunity.com
twitterflightschool.com
twitterinc.com
twitteroauth.com
twitterstat.us
twtrdns.net
twttr.com
twttr.net
twvid.com
vine.co
x.com
⚠️

domain-list-community 数据并不伴随 Stash 分发,Stash 会在首次使用时从 github.com 按需加载域名数据。首次使用请确保当前配置对 github.com 的连通性。

PROCESS-NAME

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

⚠️

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

PROCESS-PATH

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

⚠️

由于 Network Extension 的限制,Stash iOS/tvOS(包括运行于 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,ProxyToCN
 
script:
  shortcuts: # 可以在 rule 中引用
    quic: network == 'udp' and dst_port == 443 # 匹配 QUIC 协议
    udp-cn: network == 'udp' and geoip(dst_ip if dst_ip != '' else resolve_ip(host)) == 'CN' # 匹配发往 CN 的 UDP