内容纲要

🗂 | 本文目录: Surge 指南


💡 没必要死记硬背,毕竟也不是每个类型都是常用的,可以只有个大致印象,在需要用到的时候再回来看一遍。

域名类型规则:DOMAIN

涉及到域名的类型规则有 3 种:DOMAIN、DOMAIN-SUFFIX 及 DOMAIN-KEYWORD

域名其实是主机名的一种形式,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,googleadsserving.cn,REJECT
DOMAIN,static.googleadsserving.cn,REJECT
DOMAIN,lh3.googleadsserving.cn,REJECT

如果相对一条完整的域名做出某些操作,如上所述,对于 GoogleAdsService 的一些域名使用了「阻止请求」策略,以试图阻止广告。

这里可能还是要说明 URL 的构成以及域名仅仅包括什么,不然不了解这块的可能会存在误解,下面是一条 URL 示例:

http://www.example.com:80/path/to/myfile.html?key1=value1&key2=value2#SomewhereInTheDocument

  • http:是协议,现在比较常见的有 http 和 https
  • www.example.com:是域名
  • :80:是端口,HTTP 默认使用 80 端口、HTTPS 默认使用 443 端口,所以默认情况是不用特别加上端口,在使用非标准端口时如 8443 才需要特地加上
  • /path/to/myfile.html:网络服务器上资源的路径
  • ?key1=value1&key2=value2:额外参数
  • #SomewhereInTheDocument:资源本身的另一部分的锚点

也就是说当使用 DOMAIN 相关的类型规则时,仅仅匹配域名部分,也就是上述 URL 中的 www.example.com

DOMAIN-SUFFIX

如果请求的域名的后缀匹配,则执行该规则:

DOMAIN-SUFFIX,googleadsserving.cn,REJECT

在上一条示例中,对于 googleadsserving.cn 本身以及一些子域名进行了 REJECT,这样的做法很像网上的一些去广告 hosts,这样一条条的添加子域名是很费事且死板的。

如果想要对于 googleadsserving.cn 本身及其所有的子域名都 REJECT,可以使用 DOMAIN-SUFFIX。

⚠️ 注意: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
  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-CIDR 及 GEOIP

IP 地址规则包含 IP-CIDR,IP-CIDR6,GEOIP 三种类型。

当目标主机名是一个域名或主机名时,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

当访问的 IPv4 段匹配时,执行该规则:

IP-CIDR,1.2.3.4/32,CELLULAR

当匹配 IP 1.2.3.4 时,优先使用数据网络。

如果不执行 DNS 解析可以加上参数 no-resolve

IP-CIDR,1.2.3.4/32,CELLULAR,no-resolve

在有 DOMAIN 类型规则之前使用 IP-CIDR 或 GEOIP 类型规则时都要加上 no-resolve,如果没有加上 Surge 也会有相关提示。

IP-CIDR6

当访问的 IPv6 段匹配时,执行该规则:

IP-CIDR,62606:4700:4700::1001/8,DIRECT

GEOIP

根据 IP 的国家或地区信息来决定是否执行该规则:

GEOIP,CN,DIRECT

当 IP 信息为中国区域时走直连。

GEOIP 也需要注意是否需要加上 no-resolve 的问题,一般来说 GEOIP 类型规则都放在末尾 FINAL 类型规则之前,所以也就不需要参数 no-resolve

进程名类型规则:PROCESS-NAME

当请求的应用进程名符合时匹配,可匹配可执行文件的文件名或绝对路径,支持 * 和 ? 通配符。

PROCESS-NAME,/Applications/QQ.app/Contents/MacOS/QQ,DIRECT
# 或
PROCESS-NAME,QQ,DIRECT

该类型规则仅 macOS 版 Surge 可用,iOS 版 Surge 会忽略。

HTTP 类型规则:USER-AGENT 及 URL-REGEX

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://www.dangdang.com/,DIRECT

如果还不怎么了解正则表达式需要自行学习一下。

因为是匹配 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、IN-PORT、SRC-IP、PROTOCOL、SCRIPT、DOMAIN-SET、SUBNET

⚠️ 注意:DEST-PORT、IN-PORT、SRC-IP 仅 macOS 版 Surge 可用

DEST-PORT

当目标主机端口一致时,执行该规则:

DEST-PORT,80,DIRECT
DEST-PORT,443,DIRECT

IN-PORT

当监听端口号一致时,执行该规则:

IN-PORT,6152,DIRECT

配合多端口监听功能使用。

SRC-IP

当请求的来源 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

参考