Surge 使用手册:规则

本文来自 Surge 使用手册|如何定制自己的规则配置 专题

上一篇 Surge 入门 熟悉了 Surge 的「首页」界面和如何配置服务器和策略组。 这一篇开始,我们有了代理服务器,可以开始对网络进行个性化设置了。

配置规则

在「首页 > 出站模式」中选中「规则模式」后进入「代理规则」

如上一篇所说,现在只有一条 FINAL 规则

[General]
loglevel = notify
skip-proxy = 192.168.0.0/16, 193.168.0.0/24, 10.0.0.0/8, 172.16.0.0/12, 100.64.0.0/10, 17.0.0.0/8, 127.0.0.1, localhost, *.local
dns-server = system,119.29.29.29,223.5.5.5
allow-wifi-access = false
ipv6 = false

[Proxy]
# 节点名称 = 协议,服务器地址,服务器端口,encrypt-method=加密协议,password=密码,obfs=混淆类型(http/tls),obfs-host=混淆地址
1 = ss, 1.2.3.4, 443, encrypt-method=aes-128-gcm, password=password
2 = ss, 1.2.3.4, 443, encrypt-method=aes-128-gcm, password=password
3 = ss, 1.2.3.4, 443, encrypt-method=chacha20-ietf-poly1305, password=password, obfs=tls, obfs-host=yunjiasu-cdn.net
4 = ss, 1.2.3.4, 443, encrypt-method=chacha20-ietf-poly1305, password=password, obfs=http, obfs-host=bing.com

[Proxy Group]
# 策略组名称 = 策略组类型,策略组名称或者节点名称
# 节点选项
PROXY = select,AUTO,1,2,3,4
# 节点延迟自动测试
AUTO = url-test,1,2,3,4,url = http://www.gstatic.com/generate_204

[Rule]
FINAL,DIRECT

此处选择「增加规则」

此界面有四个功能区: - 类型

  • 内容
  • 策略
  • 注释

如开篇说的,看到的功能先不管怎么用先点进去看看有什么再说,先看「规则类型」

然后看看「策略」

一条规则主要是四个部分组成,先看一条例子:

# 规则类型 - 内容 - 策略 - 注释
DOMAIN-SUFFIX,google.com,PROXY // 代理 Google 网站
  • 规则类型:配置一个什么类型的规则,如示例中针对域名的 DOMAIN-SUFFIX
  • 内容:规则类型的内容,如针对域名则此处填写要代理的域名如 Google.com
  • 策略:即要对它进行什么操作,可以让它直连也可阻止它,还可以选择指定服务器或者使用策略组
  • 注释:记录这条规则是用来干什么的

规则类型

那么规则类型的具体意思是什么?可以看到图形化界面中有以下几个类型

DOMAIN:一般用于匹配完整域名,也就说比如 HERE 地图(wego.here.com)是禁止了中国访问,但是 HERE 官方网站(www.here.com)本身并没有,那我想仅代理 HERE 地图而不代理整个 HERE 官网时就可以使用该类型。

DOMAIN,wego.here.com,PROXY

DOMAIN-SUFFIX:一般用于匹配「域名后缀」比如现在想代理整个 HERE 网站了,但是 HERE 官网域名那么多,有 wego.here.com 和 www.here.com 还有其他各类子域名,如果每条都用「DOMAIN 类型」岂不是要累死?所以就可以使用该类型。

DOMAIN-SUFFIX,here.com,PROXY

另外对于「DOMAIN-SUFFIX 类型」的误区主要有 2 点:一是和通配符即 *.here.com 还是有区别的,通配符并不涵盖 here.com 本身,二是注意我所说的是匹配「域名后缀」,一个例子

# 匹配 ad.xxx.com 本身及 *.ad.xxx.com
# 但是不会匹配如 lovead.xx.com,并不会 live(ad.xx.com) 这样匹配!如果这样就乱套了
DOMAIN-SUFFIX,ad.xxx.com,REJECT

以上第二个误区我在两个类似 Surge 的应用工具上遇到过反馈给开发者修复,抛开 Surge 的营销模式其良好口碑不是凭空而来的。

DOMAIN-KEYWORD:而有一些公司的域名非常多比如 Google,一个个加「DOMAIN-SUFFIX 类型」也还是嫌累,那么可以使用此类型凡是匹配到域名中含有「google」关键字我都对其进行代理。

DOMAIN-KEYWORD,google,PROXY

IP-CIDR:除了域名有些网站或应用还会直接使用 IP 地址

# no-resolve:即不执行 DNS 解析,当一个使用域名的请求遇到 IP-CIDR 规则时,Surge 需要进行 DNS 查询才能确定是否应该执行规则,启用 no-resolve 参数后会将域名跳过此该规则处理。

# > Telegram
IP-CIDR,91.108.4.0/22,PROXY,no-resolve
IP-CIDR,91.108.8.0/22,PROXY,no-resolve
IP-CIDR,91.108.56.0/22,PROXY,no-resolve
IP-CIDR,109.239.140.0/24,PROXY,no-resolve
IP-CIDR,149.154.160.0/20,PROXY,no-resolve

# Local Area Network
DOMAIN-SUFFIX,local,DIRECT
IP-CIDR,192.168.0.0/16,DIRECT
IP-CIDR,10.0.0.0/8,DIRECT
IP-CIDR,172.16.0.0/12,DIRECT
IP-CIDR,127.0.0.0/8,DIRECT
IP-CIDR,100.64.0.0/10,DIRECT

你可能搞不懂「/斜杠」后面的数字是什么(掩码位),而关于这个「子网掩码」的篇幅太大不是这一篇能说完的请自行了解,我只说说大致用法:

  • 当你想针对一个完整的 IP 如「8.8.8.8」进行策略操作的时候使用「8.8.8.8/32」
  • 当你想对一个 IP 的最后一段如「8.8.8.*」进行策略操作的时候使用「8.8.8.0/24」
  • 当你想对一个 IP 的最后两段如「8.8..」进行策略操作的时候使用「8.8.0.0/16」
  • 当你想对一个 IP 的最后三段如「8...*」进行策略操作的时候使用「8.0.0.0/8」

那么有时候可能不是一整段比如「8.8.1.」到「8.8.16.」这种应该怎么算?请 Google 关键字「子网掩码计算器」

IP-CIDR6:IP-CIDR 是 IPv4,除了 IPv4 还有 IPv6,IP-CIDR6 就是针对 IPv6 的规则类型,使用方法大体和 IP-CIDR 一样。

GEOIP:简单说就是匹配国家的 IP 地址

# 中国的 IP 均直连
GEOIP,CN,DIRECT
# 美国的 IP 均代理
GEOIP,US,PROXY

USERAGENT:应用会使用 User-Agent 让网络协议的对端来识别发起请求的应用类型、操作系统、软件开发商以及版本号。

URL-REGEX:使用正则表达式匹配的 URL,不支持 TCP 协议和 MitM 解密,所以我个人推荐使用 「[URL Rewrite]」这个稍后再说。

最近请求

理论讲了,现在开始上手,先启动 Surge,接着随便打开一个软件,我以 TIM 为例

然后在「分析」中进入「最近请求」

顶部「显示」中开启「User-Agent」后可以在请求列表中看到 TIM,随便点进去一条

在「请求」选项卡中的「User-Agent」亦可看到 TIM 名称,那么 User-Agent 规则应该怎么写?

# 让 TIM 走直连
# 使用通配符 * 匹配到各种版本的 TIM
USER-AGENT,TIM*,DIRECT

如此一来 TIM 不管使用什么域名或者 IP 都会选择直连,这比一个个的加域名或 IP 要省事对吧?

这时你可能会想到那如果要让 Youtube 走代理,那么打开 Youtube 应用然后查看「最近请求」里的 User-Agent 规则不就好了,但是单纯使用 User-Agent 规则有以下两个问题:

  1. 如果别人是在 TIM 或微信里发给你 Youtube 视频链接你直接打开,此时的 User-Agent 就不是 Youtube 应用
  2. 有些情况下是不带有 User-Agent 的,比如常见的 WhatsApp

所以 User-Agent 虽然方便,就算你仅使用 App 也要在添加 User-Agent 规则后反复测试看看是不是有域名不带 User-Agent 而需要添加 DOMAIN 规则。 ## 被遗弃的 force-remote-dns

在 Surge 3.4 之前还有一个有关代理的参数:force-remote-dns,示例

DOMAIN-KEYWORD,google,PROXY,force-remote-dns

此参数的意思是强制远端 DNS 解析,因为 DNS 的查询是没有解密的[尽管现在有了 DoT(DNS over TLS) 和 DoH(DNS over HTTPS] 但是尚未普及,这样的结果就是当我们查询有些域名比如 Instagram 的时候,得到的是错误的服务器地址,即使代理了但是目标不对所以就出现了还是无法使用的情况。

所以需要使用此参数使用代理服务器的解析得到正确的结果,从 Surge 3.4 开始默认代理域名均使用远端解析,所以不再需要此参数,但是如 Shadowrocket、Quantumult(reslove-on-proxy)都还是在使用。关于 DNS 污染和网络劫持我写了一篇不那么严谨的文章可以一看:小谈网络劫持

更高级的规则集 RULE-SET

Surge 3 新功能之一就是 RULE-SET,这个功能可以将规则简化,也可以让规则实现远程更新这样使得用户使用网上维护的配置时可以避免规则每次更新时自己都要大动干戈折腾一番

[Rule]
RULE-SET,SYSTEM,DIRECT
RULE-SET,LAN,DIRECT
FINAL,PROXY,dns-failed

RULE-SET 的使用方法和其他规则一样,很简单,但这个规则内容包含了什么? 先看 SYSTEM 的,官方说法是:可匹配来自 macOS 和 iOS 自身的大多数请求,App Store 和 iTunes 等其他内容服务的请求不会被匹配。那么具体规则其实是什么?

USER-AGENT *com.apple.mobileme.fmip1
USER-AGENT *WeatherFoundation*
USER-AGENT %E5%9C%B0%E5%9B%BE*
USER-AGENT %E8%AE%BE%E7%BD%AE*
USER-AGENT com.apple.geod*
USER-AGENT com.apple.Maps
USER-AGENT FindMyFriends*
USER-AGENT FindMyiPhone*
USER-AGENT FMDClient*
USER-AGENT FMFD*
USER-AGENT fmflocatord*
USER-AGENT geod*
USER-AGENT locationd*
USER-AGENT Maps*
DOMAIN api.smoot.apple.com
DOMAIN captive.apple.com
DOMAIN configuration.apple.com
DOMAIN guzzoni.apple.com
DOMAIN smp-device-content.apple.com
DOMAIN xp.apple.com
DOMAIN-SUFFIX ess.apple.com
DOMAIN-SUFFIX push-apple.com.akadns.net
DOMAIN-SUFFIX push.apple.com
DOMAIN aod.itunes.apple.com
DOMAIN mesu.apple.com
DOMAIN api.smoot.apple.cn
DOMAIN gs-loc.apple.com
DOMAIN mvod.itunes.apple.com
DOMAIN streamingaudio.itunes.apple.com
DOMAIN-SUFFIX lcdn-locator.apple.com
DOMAIN-SUFFIX lcdn-registration.apple.com
DOMAIN-SUFFIX ls.apple.com
PROCESS-NAME trustd

接着看 LAN 的,官方说法是:可匹配局域网 IP 地址和 .local 后缀,请注意该规则集会触发 DNS 请求。那么具体规则其实是什么?

DOMAIN-SUFFIX local
IP-CIDR 192.168.0.0/16
IP-CIDR 10.0.0.0/8
IP-CIDR 172.16.0.0/12
IP-CIDR 127.0.0.0/8
IP-CIDR 100.64.0.0/10

大家看明白了吗?其实还是那一套东西,只是内置到了 Surge 里,并且具体规则不包含策略名。 那么如何自行制作一个规则集并使用? 首先制作一个 .list 文件,里面照样是规则内容但是不包含策略,如下

# > Twitter
DOMAIN-SUFFIX,t.co
DOMAIN-SUFFIX,twimg.co
DOMAIN-SUFFIX,twimg.com
DOMAIN-SUFFIX,twitpic.com
DOMAIN-SUFFIX,twitter.com

注意,这个命名为「Proxy.list」的内容仅仅是规则且不带策略,没有其他内容,接着放到自己的服务器上

[Rule]
# 外置自定义规则集
RULE-SET,https://example.com/Proxy.list,PROXY
# 内置系统规则集
RULE-SET,SYSTEM,DIRECT
# 内置 LAN 规则集
RULE-SET,LAN,DIRECT
# 最终策略
FINAL,PROXY,dns-failed

在配置中使用规则类型「RULE-SET」,内容为 .list 文件地址(可以是本地或者链接),最后是策略。 之后 Surge 会每 24 小时自动下载 .list 的内容并应用。 ## 白名单还是黑名单模式?

一个黑名单模式的示例

[General]
loglevel = notify
skip-proxy = 192.168.0.0/16, 193.168.0.0/24, 10.0.0.0/8, 172.16.0.0/12, 100.64.0.0/10, 17.0.0.0/8, 127.0.0.1, localhost, *.local
dns-server = system,119.29.29.29,223.5.5.5
allow-wifi-access = false
ipv6 = false

[Proxy]
# 节点名称 = 协议,服务器地址,服务器端口,encrypt-method=加密协议,password=密码,obfs=混淆类型(http/tls),obfs-host=混淆地址
1 = ss, 1.2.3.4, 443, encrypt-method=aes-128-gcm, password=password
2 = ss, 1.2.3.4, 443, encrypt-method=aes-128-gcm, password=password
3 = ss, 1.2.3.4, 443, encrypt-method=chacha20-ietf-poly1305, password=password, obfs=tls, obfs-host=yunjiasu-cdn.net
4 = ss, 1.2.3.4, 443, encrypt-method=chacha20-ietf-poly1305, password=password, obfs=http, obfs-host=bing.com

[Proxy Group]
# 策略组名称 = 策略组类型,策略组名称或者节点名称
# 节点选项
PROXY = select,AUTO,1,2,3,4
# 视频服务
VIDEO = select,2,3
# 节点延迟自动测试
AUTO = url-test,1,2,3,4,url = http://www.gstatic.com/generate_204

[Rule]
DOMAIN,wego.here.com,PROXY

FINAL,DIRECT

所谓黑名单模式就是除了列表中的都走直连,如上述例子。 一个白名单模式的示例

[General]
loglevel = notify
skip-proxy = 192.168.0.0/16, 193.168.0.0/24, 10.0.0.0/8, 172.16.0.0/12, 100.64.0.0/10, 17.0.0.0/8, 127.0.0.1, localhost, *.local
dns-server = system,119.29.29.29,223.5.5.5
allow-wifi-access = false
ipv6 = false

[Proxy]
# 节点名称 = 协议,服务器地址,服务器端口,encrypt-method=加密协议,password=密码,obfs=混淆类型(http/tls),obfs-host=混淆地址
1 = ss, 1.2.3.4, 443, encrypt-method=aes-128-gcm, password=password
2 = ss, 1.2.3.4, 443, encrypt-method=aes-128-gcm, password=password
3 = ss, 1.2.3.4, 443, encrypt-method=chacha20-ietf-poly1305, password=password, obfs=tls, obfs-host=yunjiasu-cdn.net
4 = ss, 1.2.3.4, 443, encrypt-method=chacha20-ietf-poly1305, password=password, obfs=http, obfs-host=bing.com

[Proxy Group]
# 策略组名称 = 策略组类型,策略组名称或者节点名称
# 节点选项
PROXY = select,AUTO,1,2,3,4
# 视频服务
VIDEO = select,2,3
# 节点延迟自动测试
AUTO = url-test,1,2,3,4,url = http://www.gstatic.com/generate_204

[Rule]
# Local Area Network
DOMAIN-SUFFIX,local,DIRECT
IP-CIDR,192.168.0.0/16,DIRECT
IP-CIDR,10.0.0.0/8,DIRECT
IP-CIDR,172.16.0.0/12,DIRECT
IP-CIDR,127.0.0.0/8,DIRECT
IP-CIDR,100.64.0.0/10,DIRECT

# GeoIP China
GEOIP,CN,DIRECT

# 最终并且 DNS 查询失败时走代理
FINAL,PROXY,dns-failed

所谓白名单模式就是(一般常用)除了中国的都走代理,如上述例子。 并且注意,不单是 FINAL,PROXY 还需要加上 dns-failed 参数,这条参数的意思是当 DNS 查询失败时也走代理。

另外,存在 DNS 污染的域名最好也还是加上规则,而国内域名可以使用 GEOIP,CN,DIRECT 所以可以不用写,但注意不要使用国外 DNS,我曾说过目前环境使用海外 DNS 已无意义,部分恶劣地区的运营商甚至会对国外 DNS 查询请求全都进行抢答你得到的根本不是海外 DNS 给出的结果(这点在小谈网络劫持中已讲)。

其次 DNS 还对网站起到负载均衡的作用,一般大型网站是每个大区域都有服务器比如有应对北京地区的有应对上海地区的,这时 DNS (运营商调优及公共 DNS 的 ECS 特性)可以给出就近地区最优结果,但国外 DNS 普遍没有国内节点造成的结果往往就是你在北京想上 B 站结果国外 DNS 让你使用 B 站在香港的服务器而不是北京的,包括腾讯的公共 DNS 的备用服务器(119.28.28.28)已存在此情况,原因就是此 IP 早前隶属于香港而后转到深圳,但国内一种运营商并未更新路由策略导致还是认为这属于香港 IP 也会造成解析结果跑到香港的情况。

最后,不要使用 ping 去检测 DNS 服务器响应,有些地区运营商(比如长城宽带)对于如 8.8.8.8 的查询结果是 5 ms 当你沾沾自喜以为这个结果「屌炸天」殊不知可能这条查询连省市级都没出,具体可 Trace 此处不再多言。 好了,说了这么多,你现在是否可以根据我最后给出的黑名单或者白名单模板开始制作自己的规则了?

下一篇Surge 使用手册:策略组

Conners Hua

这个家伙很懒,什么都没有留下。

您可能还喜欢...

发表评论

电子邮件地址不会被公开。 必填项已用*标注