一份可直接用的模块
存成 我的分流.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;否则请求会等待至超时,然后保持原样继续处理。