在 3x-ui / Xray 服务端配置广告拦截,并兼顾 Netflix 等流媒体解锁
最近我把代理节点统一放在 3x-ui 上管理,同时希望广告拦截尽量放在 VPS 服务端处理,而不是每个客户端单独配置规则。这样无论是 v2rayN、小火箭、OpenClash,还是其他客户端,只要走这个节点,就能共享同一套基础广告过滤规则。
这篇记录一下我在 3x-ui 里配置 Xray 服务端广告拦截的方式,以及一些容易踩坑的地方。
核心思路
3x-ui 底层使用的是 Xray。Xray 可以通过 Routing 规则识别域名,并把命中的流量丢到 blocked 出站。
也就是说:
客户端访问广告域名
-> 流量进入 VPS 的 Xray
-> Xray 通过 sniffing 识别域名
-> 命中广告规则
-> outboundTag = blocked
-> 连接被拒绝
这和 AdGuardHome、浏览器插件、小火箭模块不一样。它不是 DNS 层过滤,也不是 HTTPS MITM,而是基于 Xray 的路由规则做域名级拦截。
第一步:开启入站嗅探
广告规则要生效,Xray 必须知道当前连接访问的是什么域名。对于 HTTPS 流量,Xray 主要依赖 TLS SNI;对于 HTTP,则可以读取 Host。
在 3x-ui 里进入对应入站,比如 VLESS、Hysteria2:
入站列表
-> 编辑入站
-> 嗅探
建议这样设置:
启用:打开
协议:HTTP / TLS / QUIC 全选
仅元数据:关闭
仅路由:打开
排除的 IP:留空
排除的域名:留空
对应 JSON 大概是:
"sniffing": {
"enabled": true,
"destOverride": [
"http",
"tls",
"quic"
],
"routeOnly": true
}
注意,这段不是单独的入站,而是要放在每一个实际代理入站里面。例如 VLESS 入站要开,Hysteria2 入站也要开。
第二步:添加广告拦截路由
在 3x-ui 的 Xray 配置里找到 Routing / 路由规则,加入:
{
"type": "field",
"domain": [
"geosite:category-ads-all"
],
"outboundTag": "blocked"
}
完整示例:
[
{
"type": "field",
"inboundTag": [
"api"
],
"outboundTag": "api"
},
{
"type": "field",
"ip": [
"geoip:private"
],
"outboundTag": "blocked"
},
{
"type": "field",
"protocol": [
"bittorrent"
],
"outboundTag": "blocked"
},
{
"type": "field",
"domain": [
"geosite:category-ads-all"
],
"outboundTag": "blocked"
}
]
这里的 geosite:category-ads-all 是广告域名集合,Xray 会根据 geosite 数据库匹配广告、统计、追踪类域名。
Spotify / YouTube 的额外规则
服务端广告拦截适合处理普通广告域名,但对 Spotify、YouTube 这类 App 内广告效果有限。
原因是它们很多广告和正常内容共用同一批业务域名。如果拦得太狠,可能广告没了,App 也坏了。
可以先加一些低风险域名。
Spotify:
{
"type": "field",
"domain": [
"domain:adeventtracker.spotify.com",
"domain:adstudio.spotify.com",
"domain:ads-fa.spotify.com"
],
"outboundTag": "blocked"
}
YouTube:
{
"type": "field",
"domain": [
"domain:pagead2.googlesyndication.com",
"domain:googleads.g.doubleclick.net",
"domain:static.doubleclick.net",
"domain:tpc.googlesyndication.com",
"domain:www.googleadservices.com",
"domain:adservice.google.com",
"domain:ade.googlesyndication.com"
],
"outboundTag": "blocked"
}
不建议直接拦:
youtube.com
googlevideo.com
ytimg.com
spclient.wg.spotify.com
scdn.co
spotify.com
这些很容易误伤正常播放、登录、推荐、缩略图和歌单加载。
和 Netflix 解锁的关系
广告拦截和 Netflix 解锁不是一回事。
广告拦截主要靠:
geosite 广告域名 -> blocked
Netflix 解锁主要看:
VPS IP 是否被 Netflix 识别为可用地区
节点出口 IP 地区
DNS 解析是否稳定
客户端是否真正走代理
所以广告拦截规则一般不会直接帮助 Netflix 解锁。
如果要测试 Netflix,可以用 OpenClash、v2rayN 或网页工具看当前节点是否支持:
Netflix Full
Netflix Originals Only
Not Available
如果 VPS IP 本身不支持 Netflix,改广告规则也没用,需要换节点、换 IP 或换机房。
推荐配置顺序
我现在比较推荐这样的顺序:
- 每个入站开启 sniffing。
- 添加
geosite:category-ads-all -> blocked。 - 添加少量 Spotify / YouTube 低风险域名。
- 保存并重启 Xray。
- 用客户端测试网页广告、YouTube、Spotify、Netflix 是否正常。
- 如果某个 App 异常,先删掉最近新增的精确域名规则。
注意事项
这种方式不是万能去广告。
它适合:
网页广告
广告 SDK
统计追踪
部分 App 开屏广告
普通广告域名
不太适合:
YouTube 视频片头广告
YouTube 片中广告
Spotify 音频广告
B站、爱奇艺等同域视频广告
因为这些广告很多时候和正常内容走同一个域名,Xray 服务端无法看到 HTTPS 里面的具体请求路径。
如果要更强的广告过滤,通常还需要客户端配合,比如浏览器 uBlock Origin、小火箭模块、专门的客户端规则等。
总结
把广告拦截放在 3x-ui / Xray 服务端的好处是统一、简单、客户端无感。只要客户端走这个 VPS 节点,就能自动获得基础广告域名过滤。
我的最终建议是:
服务端 Xray:做基础域名广告拦截
客户端:处理 YouTube / Spotify 这类复杂广告
Netflix:单独看 VPS IP 和地区解锁情况
这样稳定性最好,也不容易因为过度拦截导致 App 异常。