内容纲要

🗂 | 查看 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.cnwww.googleadsserving.cn 都会生效,但 google-adsserving.cn (注意 -)这样的就不会。

💡 关于 DOMAIN-SUFFIX 还有两个小技巧:

  1. *.ads.example.com 为例,ads.example.com 本身及其子域名是广告 而 example.com 本身及其他子域名是正常内容就可以使用: DOMAIN-SUFFIX,ads.example.com,REJECT,所以并不是只能将一级域名用于 DOMAIN-SUFFIX;
  2. 可以对域名后缀使用,如想对所有 .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 规则带有该参数,那么:

  1. 如果目标主机名是一个域名,那么将跳过该规则,不触发 DNS 解析。
  2. 如果目标主机名是 IP 地址,按规则进行判断。
  3. 如果目标主机名是一个域名,且先前出现的 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 个图片地址:

可以看到链接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