一份可直接用的模块

存成 我的分流.sgmodule,从文件导入。

#!name=我的分流
#!desc=按地区建分组,国内直连,流媒体走指定地区,广告拦截。

[Proxy Group]
# 用正则从全部订阅节点里筛,节点名变了也不用改模块
香港 = url-test, policy-regex-filter=(?i)(香港|hong ?kong|HK|🇭🇰), url=http://www.gstatic.com/generate_204, interval=300
日本 = url-test, policy-regex-filter=(?i)(日本|japan|JP|🇯🇵), url=http://www.gstatic.com/generate_204, interval=300
美国 = url-test, policy-regex-filter=(?i)(美国|united ?states|USA?|🇺🇸), exclude-regex=(?i)(过期|剩余|流量|官网), url=http://www.gstatic.com/generate_204, interval=300

# 手动分组,成员是上面三个分组
流媒体 = select, 香港, 日本, 美国
AI = select, 美国, 日本
国际 = select, 香港, 日本, 美国, DIRECT

[Rule]
# 1. 拦广告(最优先)
GEOSITE,category-ads-all,REJECT

# 2. 局域网和国内直连
GEOIP,private,DIRECT,no-resolve
DOMAIN-SUFFIX,cn,DIRECT
GEOSITE,cn,DIRECT
GEOIP,cn,DIRECT

# 3. AI 服务
GEOSITE,openai,AI
DOMAIN-SUFFIX,anthropic.com,AI
DOMAIN-SUFFIX,claude.ai,AI

# 4. 流媒体
GEOSITE,netflix,流媒体
GEOSITE,youtube,流媒体
DOMAIN-SUFFIX,disneyplus.com,流媒体

# 5. 其余常见境外服务
GEOSITE,google,国际
GEOSITE,telegram,国际
GEOIP,telegram,国际,no-resolve

[Host]
# 强制指定某个域名的解析结果
example.internal = 10.0.0.5

要点:

  • 规则从上到下匹配,广告拦截写在最前,国内直连写在境外服务之前。
  • 出口名(流媒体、AI、国际)必须在 [Proxy Group] 中定义。未定义的名称会使用「默认」出口,且不会显示错误。客户端内置的 默认 / 自动选择 / 直连 无需定义。
  • 域名类的匹配值全部小写。写大写永远不命中。
  • 注释都独占一行。写在规则行尾会被并进出口名。
  • 此示例未配置 FINAL,因此未命中的流量继续使用客户端的默认规则。

常用片段

某个域名走某个出口

[Proxy Group]
新加坡 = url-test, policy-regex-filter=(?i)(新加坡|singapore|SG|🇸🇬), url=http://www.gstatic.com/generate_204, interval=300

[Rule]
DOMAIN-SUFFIX,spotify.com,新加坡
DOMAIN-SUFFIX,scdn.co,新加坡

某个域名强制直连

[Rule]
DOMAIN-SUFFIX,bank.example.com,DIRECT
DOMAIN-SUFFIX,internal.corp,DIRECT

把客户端判成直连的域名改走出口

客户端有一批内置规则会把某些域名判成直连(例如一些厂商在中国大陆的专用服务端点)。 如需让其中某个域名使用代理出口,必须同时配置 [Host] 和 [Rule]。仅配置 [Rule] 时,DNS 可能已经返回中国大陆的真实 IP,随后流量仍会经代理连接该地址,增加不必要的路径。

[Host]
weather-map2.apple.com = server:fakeip

[Rule]
DOMAIN,weather-map2.apple.com,PROXY

server:fakeip 表示分配虚拟 IP,不在本地执行真实解析,并由 [Rule] 决定出口;真实解析 在出口侧完成。[Host] 中指定具体 DNS 的域名则会获得真实 IP。

按应用分流(仅 macOS / Windows)

[Rule]
PROCESS-NAME,Google Chrome,默认
PROCESS-NAME,Google Chrome Helper,默认
PROCESS-NAME,curl,DIRECT

macOS 上一个 .app 常有多个可执行文件(主程序 + 各种 Helper),都要列出来。Windows 上填 chrome.exe 这样的文件名。

默认 是客户端内置的主选择器,等于「走代理」。想指定具体地区,把它换成自己建的分组名。

拦截整个域名的广告

[Rule]
DOMAIN-SUFFIX,doubleclick.net,REJECT
DOMAIN-SUFFIX,googlesyndication.com,REJECT
DOMAIN-KEYWORD,adservice,REJECT
GEOSITE,category-ads-all,REJECT

只拦某条 API 路径

按域名拦会把整个 App 拦死,这时用 URL 改写。需要开解密。

#!name=拦截埋点

[URL Rewrite]
^https:\/\/api\.example\.com\/v\d\/(track|log|report) _ reject-dict

[MITM]
hostname = api.example.com

改 User-Agent

#!name=改 UA

[Header Rewrite]
http-request ^https:\/\/www\.example\.com\/ header-replace User-Agent Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)

[MITM]
hostname = www.example.com

改响应里的 JSON 字段

#!name=改字段

[Body Rewrite]
http-response-jq ^https:\/\/api\.example\.com\/config '.features.ads = false'

[MITM]
hostname = api.example.com

公司内网域名走公司 DNS

内网域名在公网 DNS 上查不到(或查出来是外网地址),指定用内网解析器去查即可。

#!name=公司内网

[Host]
*.corp.example.com = server:10.0.0.53
*.intranet.example.net = server:10.0.0.53

[General]
dns-server = 10.0.0.53, system

[Rule]
DOMAIN-SUFFIX,corp.example.com,DIRECT
DOMAIN-SUFFIX,intranet.example.net,DIRECT

[Host] 那两行让这些域名去问公司 DNS 并拿到真实的内网地址;[General] dns-server 把公司 DNS 放到直连域名解析链的最前面,内网其它 split-horizon 域名也跟着解析对。 [Rule] 两条保证解析出来的内网地址直连,不进代理。

用外部规则集

[Rule]
RULE-SET,https://example.com/lists/reject.list,REJECT
RULE-SET,https://example.com/lists/direct.list,DIRECT
RULE-SET,https://example.com/lists/proxy.list,国际

链接指向的文件是每行 类型,值(没有出口列)的纯规则列表。

一个自己写的响应脚本

模块:

#!name=示例脚本

[Script]
demo = type=http-response, pattern=^https:\/\/api\.example\.com\/user, script-path=https://example.com/demo.js, requires-body=1, timeout=10

[MITM]
hostname = api.example.com

demo.js:

let body = $response.body
try {
  const data = JSON.parse(body)
  data.vip = true
  body = JSON.stringify(data)
} catch (e) {
  console.log("parse failed: " + e)
}
$done({ body })

发生错误时也必须调用 $done;否则请求会等待至超时,然后保持原样继续处理。