🗂 | 查看 Surge 专题可浏览更多内容
域名类型规则
首先需要弄明白,一条 URL 中域名是哪些部分?以一条 URL 为例:
http://www.example.com:80/path/to/myfile.html?key1=value1&key2=value2#SomewhereInTheDocument
其中 www.example.com
为域名,或者说你只需要记住只需要第二个 /
之后以及第三个 /
之间的内容(不包括冒号和端口)。
域名其实是主机名的一种形式,Surge 内部对域名和主机名并没有区分,所有文档所提到的域名和主机名所对应的处理逻辑都是一样的。
比如,DOMAIN,1.2.3.4
规则其实也可以用于匹配目标主机为 IP 地址 1.2.3.4
的连接。DOMAIN,MacBook.local
也可用于匹配 Bonjour 主机名。
💡 在 Surge 3 之前的早期版本,DOMAIN 类型规则有一个用于代理策略的参数:
force-remote-dns
,使用该选项时的主机名返回 Fake IP,以此解决 DNS 污染问题,由于该选项经常对用户产生困扰,现在版本已取消了这个选项,对所有主机名都会返回 Fake IP 地址。配置[General]
中的always-real-ip
选项用于覆盖该行为,对于出现在该选项中的主机名,Surge 不会返回 Fake IP,会将该 DNS 查询转发给 DNS 服务器获得真实 IP 地址。
DOMAIN
当请求的域名完全匹配,则执行该规则:
DOMAIN,www.baidu.com,REJECT // 屏蔽百度首页
DOMAIN,baike.baidu.com,REJECT // 屏蔽百度百科
如上,对于「百度」的一些域名使用了「阻止请求」策略。
DOMAIN-SUFFIX
当请求的域名的后缀匹配,则执行该规则:
DOMAIN-SUFFIX,doubleclick.net,REJECT
如上示例,相比使用 hosts 需要一条条的阻止域名,如:
127.0.0.1 ad.doubleclick.net
127.0.0.1 adx.g.doubleclick.net
127.0.0.1 pubads.g.doubleclick.net
Surge 仅使用一条 DOMAIN-SUFFIX 类型规则,就可以对 doubleclick.net
及其子域名都做出了阻止。
再看个例子:DOMAIN-SUFFIX,googleadsserving.cn
对于 googleadsserving.cn
、www.googleadsserving.cn
都会生效,但 google-adsserving.cn
(注意 -
)这样的就不会。
💡 关于 DOMAIN-SUFFIX 还有两个小技巧:
- 以
*.ads.example.com
为例,ads.example.com
本身及其子域名是广告 而example.com
本身及其他子域名是正常内容就可以使用:DOMAIN-SUFFIX,ads.example.com,REJECT
,所以并不是只能将一级域名用于 DOMAIN-SUFFIX; - 可以对域名后缀使用,如想对所有
.cn
后缀的域名做出直连策略,那么可以:DOMAIN-SUFFIX,cn,DIRECT
遇到过 3 个类似 Surge 的应用都出现过对
DOMAIN-SUFFIX
设计的理解错误
DOMAIN-KEYWORD
当请求的域名包含关键词,则执行该规则:
DOMAIN-KEYWORD,adservice,REJECT
顾名思义就是匹配到域名中的关键词,这条规则对于以下域名都会生效:
- adservice.google.com
- adservice.google.com.hk
- googleadservice.com
- adservice-google.com
IP 类型规则
当目标主机名是一个域名或主机名时,IP 类型规则会触发本地 DNS 解析。根据解析得到的 IP 地址进行判断。当解析失败时:如果最终的 FINAL 规则带有 dns-failed
标记,那么将直接匹配 FINAL 规则。如果 FINAL 规则不带有 dns-failed
标记,该请求将直接失败。
IP 类型规则有一个专有的参数 no-resolve
,如果一个 IP 规则带有该参数,那么:
- 如果目标主机名是一个域名,那么将跳过该规则,不触发 DNS 解析。
- 如果目标主机名是 IP 地址,按规则进行判断。
- 如果目标主机名是一个域名,且先前出现的 IP 规则已经触发了 DNS 解析获得了 IP 地址,那么使用该 IP 地址进行判断。
由于 DNS 查询有时间开销,所以在配置规则时,最优的方式是尽量先不触发 DNS 解析,将所有会触发 DNS 解析的规则放在底部。这样应使用代理策略的请求就完全避免了在本地进行 DNS 解析。
但是也不用刻意的去完全避免解析,因为一旦决定使用 DIRECT 策略,那么最终还是要进行解析。Surge 有完备的 DNS 缓存系统,不必在意短时间内的重复解析。
不过需要注意,如果某目标主机在本地 DNS 不可被解析,那么一定需要加入对应的规则,在触发 DNS 前就决定策略终止匹配。或者对 FINAL 规则加上 dns-failed
标记并使用代理策略。
IP-CIDR 与 IP-CIDR6
当请求的目标 IP 属于指定段时,执行该规则:
# IPv4
IP-CIDR,47.119.139.56/32,REJECT
# IPv6
IP-CIDR6,2606:4700:4700::1001/128,CELLULAR
如果不清楚这里的 /32
与 /128
,需要自行了解「CIDR」与「子网掩码」,你还可以搜索「子网掩码计算器」获取帮助。
另外也就是前面提到的参数 no-resolve
,不执行 DNS 解析可以加上,如:
IP-CIDR,1.2.3.4/32,CELLULAR,no-resolve
在有 DOMAIN 类型规则之前使用 IP-CIDR 或 GEOIP 类型规则时最好要加上 no-resolve
。
GEOIP
当 IP 归属地地区符合时,执行该规则:
GEOIP,CN,DIRECT
当 IP 为中国地区时走直连。
GEOIP 也需要注意是否需要加上 no-resolve
,如果放在 DOMAIN 类型规则之后就不需要参数 no-resolve
。
IP-ASN
当 IP 属于 ASN 号时,执行该规则:
IP-ASN,AS13335,CELLULAR
进程名类型规则
PROCESS-NAME
当请求的应用进程名符合时匹配,可匹配可执行文件的文件名或绝对路径,支持 * 和 ? 通配符。
PROCESS-NAME,/Applications/QQ.app/Contents/MacOS/QQ,DIRECT
# 或
PROCESS-NAME,QQ,DIRECT
该类型规则仅 macOS 版 Surge 可用,iOS 版 Surge 会忽略。
HTTP 类型规则
USER-AGENT
当请求的 User Agent 符合时,执行该规则:
USER-AGENT,TIM*,DIRECT
User Agent 可在 iOS 版 Surge 的「工具」>「最近请求」内的请求列表中找到想要的并进入某个请求,在「请求」选项卡下的「REQUEST HEADER」中可看到,如腾讯 TIM 的 User Agent 为:User-Agent: TIM/3.3.5.545 CFNetwork/1220.1 Darwin/20.3.0
可以使用通配符省去名字后面的内容,也就是:TIM*
。
比较特殊的是,由于只有进行 MITM 解密后才可获取到 URL,所以 URL-REGEX 对未解密的 HTTPS 连接无效。但是 USER-AGENT 规则却对未解密的 HTTPS 也连接有效,因为程序在使用 HTTP 代理时,会在发送 CONNECT 请求时带上自己 User Agent 的明文。
URL-REGEX
当请求的 URL 匹配正则表达式时,执行该规则:
URL-REGEX,^http://img61.ddimg.cn/upload_img,REJECT
然后访问这 2 个图片地址:
- http://img61.ddimg.cn/upload_img/00405/luyi/DDlogoNEW.gif
- http://img61.ddimg.cn/2021/2/26/2021022611324396126.jpg
可以看到链接1被拦截而链接2没有,因为链接1匹配到了 /upload_img
。
开启 show-error-page-for-reject
这样就能看到 Surge 的错误页面,该页面会告知你当前请求被拦截了。
你可以修改配置文件来开启 show-error-page-for-reject
:
[General]
show-error-page-for-reject = true
或是在图形界面开启:
- iOS:在「首页」底部的「更多设置」中打开「Show Reject Error Page」
- macOS:「设置」>「通用」>「错误页」
⚠️ 注意:到上述例子中都是 HTTP 链接,如果你测试的是 HTTPS 链接需要开启 MitM 功能,关于 MitM 后续文章会提到,此处先略过。
其他类型规则
DEST-PORT
⚠️ 注意:仅 macOS 版 Surge 可用
当目标主机端口一致时,执行该规则:
DEST-PORT,80,DIRECT
DEST-PORT,443,DIRECT
IN-PORT
⚠️ 注意:仅 macOS 版 Surge 可用
当监听端口号一致时,执行该规则:
IN-PORT,6152,DIRECT
配合多端口监听功能使用。
SRC-IP
⚠️ 注意:仅 macOS 版 Surge 可用
当请求的来源 IP 一致时,执行该规则:
SRC-IP,192.168.20.100,DIRECT
可匹配连接来源 IP 地址,接管其他设备连接时可使用。比如在使用 Surge Mac 的网关模式时可以使用该规则让某台设备全局代理或直连。
PROTOCOL
当请求的协议符合时,执行该规则:
PROTOCOL,HTTP,DIRECT
可以使用该类型规则对某个网络协议作出策略,支持的协议有:
- HTTP
- HTTPS
- TCP
- UDP
- DOH
SCRIPT
可以使用 JavaScript 根据各种参数完全自由的选择策略。
DOMAIN-SET
此类型与 Ruleset 类似所以我放在 Surge | 规则系统:规则集 一起说。
SUBNET
可用于匹配 SSID/BSSID/路由 IP 地址,SSID 匹配支持通配符
# 匹配 SSID
SUBNET,Apple Store,DIRECT
# 匹配 BSSID
SUBNET,44:f9:71:4d:ef:ef,DIRECT
# 匹配 Router Address
SUBNET,192.168.1.1,DIRECT
举个例子,如果想要出门时使用 Surge 处理广告,但在家时(使用路由器上的 AdguardHome 处理广告),那么希望 Surge 在处理广告时使用直连处理:
[Rule]
# 反运营商劫持
RULE-SET,https://www.example.com/Hijacking.list,REJECT
# 在连接 SSID 为 Apple 的 Wi-Fi 时直连
SUBNET,Apple,DIRECT
# 反广告
RULE-SET,https://www.example.com/Advertising.list,REJECT
FINAL,DIRECT
RULE-SET 可以先不用急着理解它,你只需要知道这个示例的意思为在连接到 SSID 名为 Apple 的 Wi-Fi 时,反运营商劫持依然生效,但反广告为直连。
也就是说后续的 FINAL 规则也不重要了,因为它和反广告规则都在 SUBNET 规则的后面,在遇到 SSID 名为 Apple 的 Wi-Fi 时就已经全都走直连了。
数据网络运营商类型规则
CELLULAR-CARRIER
这是一个匹配数据网络运营商 MCC-MNC 代码的类型规则
CELLULAR-CARRIER,460-1,DIRECT
移动设备网络代码(Mobile Network Code,MNC)是与移动设备国家代码(Mobile Country Code,MCC)(也称为「MCC / MNC」)相结合,以用来表示唯一一个的移动设备的网络运营商。
运营商代码映射表、电信运营商标识等叫法也是表示 MCC / MNC。
以维基百科提供的中华人民共和国大陆地区数据为例:
中国移动
MCC | MNC | MHz |
---|---|---|
460 | 00 | GSM 900 / GSM 1800 / TD-SCDMA 1880 / TD-SCDMA 2010 / TD-LTE 1800/2300/2600 |
460 | 02 | GSM 900 / GSM 1800 / TD-SCDMA 1880 / TD-SCDMA 2010 |
460 | 07 | GSM 900 / GSM 1800 / TD-SCDMA 1880 / TD-SCDMA 2010 |
中国联通
MCC | MNC | MHz |
---|---|---|
460 | 01 | GSM 900 / GSM 1800 / UMTS 2100 / TD-LTE 2300/2600 / FDD-LTE 1800/2100 |
460 | 06 | GSM 900 / GSM 1800 / UMTS 2100 |
460 | 09 |
中国电信
MCC | MNC | MHz |
---|---|---|
460 | 03 | CDMA2000 800 / CDMA2000 2100 / TD-LTE 2300/2600 / FDD-LTE 1800/2100 / EV-DO / eHRPD |
460 | 05 | |
460 | 11 | CDMA2000 800 / CDMA2000 2100 / TD-LTE 2300/2600 / FDD-LTE 1800/2100 / EV-DO / eHRPD |
中国铁通
MCC | MNC | MHz |
---|---|---|
460 | 20 | GSM-R |
其他国家或地区的 MCC / MNC 可查阅维基百科:Mobile country code
CELLULAR-RADIO
该类型规则用于匹配运营商的无线电接入技术(Radio Access Technology)
CELLULAR-RADIO,LTE,DIRECT
可选值有:
- GPRS
- Edge
- WCDMA
- HSDPA
- HSUPA
- CDMA1x
- CDMAEVDORev0
- CDMAEVDORevA
- CDMAEVDORevB
- eHRPD
- HRPD
- LTE
- NRNSA
- NR