规则类型
通过规则匹配连接信息,指定连接的出站方式,例如直连、代理、拦截等。
规则可以分类为两种类型,其中 IP 类型可能会触发 DNS 解析:
- 基于域名
- 基于 IP
- 其他复合类型
希望针对 URL 编写规则?请阅读 HTTP 重写章节。
如果一个规则引用了不存在代理,该规则被略过而不会引发错误,排查此类问题请留意日志。
DOMAIN
完全匹配域名。
DOMAIN-SUFFIX
匹配域名后缀,例如 DOMAIN-SUFFIX,google.com
匹配 google.com
和 www.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