AI摘要
最近折腾网站广告的时候,遇到一个很奇怪的问题:
网站里的 Google AdSense 广告位有时候可以正常显示,但是点击广告跳转时打不开;而开启 OpenClash 后,广告相关请求又会直接报错,浏览器控制台里能看到:
net::ERR_CONNECTION_CLOSED浏览器页面也会提示:
无法访问此网站
www.googleadservices.com 意外终止了连接
ERR_CONNECTION_CLOSED一开始我以为是网页代码、广告代码或者 AdSense 本身的问题,后来排查了一圈才发现,问题主要出在 OpenClash 的规则、DNS 和广告拦截链路上。
这篇文章记录一下我的排查过程。
一、问题现象
我的网站接入了 Google AdSense / Google Ads 广告。
在不同网络状态下表现不太一样:
开启 OpenClash 时
- 广告请求可能直接失败;
- 控制台出现
ERR_CONNECTION_CLOSED; - 部分广告位不显示,或者显示异常。
关闭 OpenClash 后
- 广告有时可以显示;
- 但是点击广告跳转到
www.googleadservices.com时打不开; - 浏览器提示连接被关闭。
截图里的典型错误是:
www.googleadservices.com 意外终止了连接
ERR_CONNECTION_CLOSED这里基本可以确定,问题不是单纯的前端代码错误,而是广告相关域名在网络层面被断开了连接。
二、涉及到的 Google 广告相关域名
排查过程中,常见的相关域名有这些:
googleads.g.doubleclick.net
adservice.google.com
googleadservices.com
www.googleadservices.com
ad.doubleclick.net
pagead2.googlesyndication.com
tpc.googlesyndication.com
googlesyndication.com
googletagservices.com
googletagmanager.com这些域名大致可以分成几类:
广告加载:
pagead2.googlesyndication.com
tpc.googlesyndication.com
googleads.g.doubleclick.net
广告展示 / 统计:
googlesyndication.com
googletagservices.com
googletagmanager.com
doubleclick.net
广告点击跳转:
googleadservices.com
www.googleadservices.com
adservice.google.com其中我这里最明显的问题是:
www.googleadservices.com广告能显示,但是点不开,最后就是卡在这个域名上。
三、我一开始放错了位置
一开始我把这些域名填到了 OpenClash 的:
绕过指定区域 IPv4 黑名单里面。
类似这样:
googleads.g.doubleclick.net
adservice.google.com
googleadservices.com
ad.doubleclick.net但是后来发现,这个位置并不是用来写 Clash 规则的。
这个位置不是 rules 规则区,也不是广告白名单,更不是代理规则区。
它主要是配合 OpenClash 的“绕过指定区域 IP”之类功能使用的,不适合用来处理 Google Ads 这种域名走代理 / 直连的问题。
所以,类似下面这种规则,不能写在那里:
- DOMAIN,www.googleadservices.com,Proxy
- DOMAIN-SUFFIX,doubleclick.net,Proxy正确位置应该是 OpenClash 的:
覆写设置 / 自定义规则 / Rules或者类似名字的 rules: 配置区域。
四、Clash / Mihomo 的规则顺序很重要
Clash / Mihomo 的规则是从上往下匹配的。
也就是说,谁写在前面,谁优先生效。
例如:
rules:
- DOMAIN-SUFFIX,googleadservices.com,Proxy
- DOMAIN-SUFFIX,googleadservices.com,REJECT这种情况下,googleadservices.com 会先命中 Proxy,不会再继续往下匹配 REJECT。
但是如果顺序反过来:
rules:
- DOMAIN-SUFFIX,googleadservices.com,REJECT
- DOMAIN-SUFFIX,googleadservices.com,Proxy那它就会直接被拒绝,后面的 Proxy 根本不会生效。
所以 Google 广告相关规则必须放在 rules: 最上方,放在这些规则之前:
- GEOSITE,category-ads-all,REJECT
- RULE-SET,ads,REJECT
- RULE-SET,reject,REJECT
- MATCH,...否则很容易被广告过滤规则提前拦截。
五、不要写错规则格式
我之前看到一些过滤器里会有这种格式:
domain:googleads.g.doubleclick.net,注意,这不是 Clash / Mihomo 的 rules 写法。
Clash 里应该这样写:
- DOMAIN,googleads.g.doubleclick.net,Proxy
- DOMAIN-SUFFIX,doubleclick.net,Proxy两种常用规则区别如下:
- DOMAIN,www.googleadservices.com,Proxy表示精确匹配这个域名。
- DOMAIN-SUFFIX,googleadservices.com,Proxy表示匹配整个后缀,包括:
googleadservices.com
www.googleadservices.com一般来说,广告点击跳转域名可以同时写精确域名和后缀域名,避免某些情况下没有命中。
六、不要粗暴处理整个 google.com
一开始我也想过直接加:
- DOMAIN-SUFFIX,google.com,Proxy或者:
- DOMAIN-SUFFIX,google.com,DIRECT但这个做法太粗暴。
因为 google.com 涉及的服务太多了,比如搜索、登录、API、字体、验证码、统计、广告跳转等。
我的需求只是解决 Google Ads / AdSense 相关域名的问题,不想让整个 Google 都被影响。
所以这篇文章里的规则只针对广告相关域名,不处理整个:
google.com七、DIRECT 还是 Proxy?
这里要根据实际网络环境判断。
我这里的问题是:
www.googleadservices.com
ERR_CONNECTION_CLOSED也就是说,www.googleadservices.com 直连时会被断开。
这种情况下,它就不应该走 DIRECT,而应该走代理。
之前我可用的规则是这样的:
rules:
- DOMAIN,pagead2.googlesyndication.com,DIRECT
- DOMAIN,tpc.googlesyndication.com,DIRECT
- DOMAIN,googleads.g.doubleclick.net,DIRECT
- DOMAIN-SUFFIX,doubleclick.net,DIRECT
- DOMAIN-SUFFIX,googleadservices.com,DIRECT
- DOMAIN-SUFFIX,googlesyndication.com,DIRECT
- DOMAIN-SUFFIX,googletagservices.com,DIRECT
- DOMAIN-SUFFIX,googletagmanager.com,DIRECT这套规则可以让一部分广告展示链路直连,但是如果 www.googleadservices.com 直连打不开,那点击跳转仍然会失败。
所以更适合我的写法是:广告相关域名走代理。
八、推荐规则示例
假设你的代理策略组叫:
Proxy那么可以在 OpenClash 自定义规则的 rules: 最上方加入:
rules:
- DOMAIN,www.googleadservices.com,Proxy
- DOMAIN,googleadservices.com,Proxy
- DOMAIN,adservice.google.com,Proxy
- DOMAIN,googleads.g.doubleclick.net,Proxy
- DOMAIN,pagead2.googlesyndication.com,Proxy
- DOMAIN,tpc.googlesyndication.com,Proxy
- DOMAIN-SUFFIX,googleadservices.com,Proxy
- DOMAIN-SUFFIX,doubleclick.net,Proxy
- DOMAIN-SUFFIX,googlesyndication.com,Proxy
- DOMAIN-SUFFIX,googletagservices.com,Proxy
- DOMAIN-SUFFIX,googletagmanager.com,Proxy注意,Proxy 必须是你配置里真实存在的策略组名称。
有些人的策略组不叫 Proxy,而是叫:
节点选择
🚀 节点选择
国外流量
手动选择
GLOBAL那就要改成自己的策略组名称。
比如你的策略组叫:
🚀 节点选择那规则应该写成:
rules:
- DOMAIN,www.googleadservices.com,🚀 节点选择
- DOMAIN,googleadservices.com,🚀 节点选择
- DOMAIN,adservice.google.com,🚀 节点选择
- DOMAIN,googleads.g.doubleclick.net,🚀 节点选择
- DOMAIN,pagead2.googlesyndication.com,🚀 节点选择
- DOMAIN,tpc.googlesyndication.com,🚀 节点选择
- DOMAIN-SUFFIX,googleadservices.com,🚀 节点选择
- DOMAIN-SUFFIX,doubleclick.net,🚀 节点选择
- DOMAIN-SUFFIX,googlesyndication.com,🚀 节点选择
- DOMAIN-SUFFIX,googletagservices.com,🚀 节点选择
- DOMAIN-SUFFIX,googletagmanager.com,🚀 节点选择不要照抄 Proxy 这个名字,除非你的配置里真的有这个策略组。
九、完整配置位置示例
我的 OpenClash 自定义规则区域大概是这种结构:
rule-providers:
## google:
## type: http
## path: ./rule1.yaml
## url: "https://raw.githubusercontent.com/../Google.yaml"
## interval: 600
## proxy: DIRECT
## behavior: classical
## format: yaml
## size-limit: 0
## header:
## User-Agent:
## - "mihomo/1.18.3"
## Authorization:
## - 'token 1231231'
## payload:
## - 'DOMAIN-SUFFIX,google.com'
rules:
- DOMAIN,www.googleadservices.com,Proxy
- DOMAIN,googleadservices.com,Proxy
- DOMAIN,adservice.google.com,Proxy
- DOMAIN,googleads.g.doubleclick.net,Proxy
- DOMAIN,pagead2.googlesyndication.com,Proxy
- DOMAIN,tpc.googlesyndication.com,Proxy
- DOMAIN-SUFFIX,googleadservices.com,Proxy
- DOMAIN-SUFFIX,doubleclick.net,Proxy
- DOMAIN-SUFFIX,googlesyndication.com,Proxy
- DOMAIN-SUFFIX,googletagservices.com,Proxy
- DOMAIN-SUFFIX,googletagmanager.com,Proxy
##- PROCESS-NAME,curl,DIRECT #匹配路由自身进程(curl直连)
##- DOMAIN-SUFFIX,google.com,Proxy #匹配域名后缀
##- DOMAIN-KEYWORD,google,Proxy #匹配域名关键字注意:
rules:下面这些规则不要加 ##。
因为 ## 开头的是注释,不会生效。
十、保存后重启服务
规则保存后,建议重启 OpenClash 和 dnsmasq:
/etc/init.d/openclash restart
/etc/init.d/dnsmasq restart然后浏览器强制刷新:
Ctrl + F5也可以直接用无痕窗口测试,避免浏览器缓存和扩展影响判断。
十一、查看 OpenClash 连接日志
配置完以后,不要只看浏览器页面,最重要的是看 OpenClash 连接日志。
在连接日志里搜索:
googleadservices
www.googleadservices.com
doubleclick
googlesyndication
pagead2
adservice.google.com正常情况下,这些域名应该命中你的代理策略组,比如:
Proxy或者:
🚀 节点选择不应该是:
REJECT
REJECT-DROP
Block
广告拦截
黑名单
DIRECT如果你希望它走代理,但日志里显示 DIRECT,说明规则写错了,或者被更前面的规则命中了。
如果日志里显示 REJECT,说明它仍然被广告规则拦截,通常是因为你的规则没有放在最前面,或者有其他广告过滤模块提前处理了。
十二、还要检查 DNS 和浏览器插件
如果 OpenClash 日志里已经显示走代理,但浏览器还是打不开,就要继续检查电脑和浏览器侧。
常见影响项有:
AdGuard
uBlock Origin
AdBlock
油猴去广告脚本
浏览器安全 DNS
Windows hosts
杀毒软件网络防护
系统代理尤其是浏览器插件,有时候即使路由器规则已经放行,插件仍然会把广告请求拦掉。
测试时建议:
- 开无痕模式;
- 临时禁用广告拦截插件;
- 关闭浏览器安全 DNS;
- 清理系统 DNS 缓存。
Windows 可以执行:
ipconfig /flushdns然后重新打开网页测试。
十三、如果还是不生效,重点查这几个地方
如果规则写了还是不生效,可以按这个顺序排查:
1. 策略组名字是否正确
比如你写的是:
- DOMAIN,www.googleadservices.com,Proxy但是你的配置里根本没有 Proxy 这个策略组,那规则自然不会按预期工作。
需要去配置文件里找:
proxy-groups:看下面真实的 name 是什么。
2. 规则是否真的在最上方
广告相关规则一定要放在所有广告拦截规则前面。
如果前面已经有:
- GEOSITE,category-ads-all,REJECT
- RULE-SET,ads,REJECT那后面再写代理规则就晚了。
3. 是否还有 DNS 广告过滤
有些人 OpenClash 之外还用了:
AdGuard Home
SmartDNS 去广告
anti-AD hosts
NextDNS
AdGuard DNS
浏览器安全 DNS这些都会影响广告域名解析和连接。
如果 DNS 层已经把域名污染、拦截或返回了错误 IP,Clash 规则可能根本没有机会正常处理。
4. 浏览器扩展是否拦截
尤其是:
uBlock Origin
AdGuard
AdBlock
Tampermonkey 去广告脚本这些插件会直接拦广告请求,导致你误以为是 OpenClash 的问题。
十四、我的最终理解
这次问题的核心不是“Google 广告不能用”,而是:
Google 广告展示链路和点击跳转链路被 OpenClash / DNS / 去广告规则错误处理了。其中展示相关域名和点击相关域名不完全一样。
广告能显示,不代表点击链路一定正常。
我这里最关键的域名是:
www.googleadservices.com如果这个域名直连会 ERR_CONNECTION_CLOSED,那它就应该走代理,而不是继续强制 DIRECT。
同时也不建议粗暴地把整个:
google.com全部代理或全部直连。
更稳妥的方式是只处理 Google Ads / AdSense / DoubleClick 相关域名。
十五、最后提醒
这篇文章只是记录 OpenClash 环境下 Google AdSense 广告请求被错误拦截时的排查过程。
不是教人刷广告,也不是建议点击自己的广告。
自己的广告不要乱点,否则可能触发 Google AdSense 的无效点击风控,严重的话会影响账号。
我们要解决的是网络链路问题,不是人为制造点击。
总结
如果你也遇到:
Google AdSense 广告能显示,但点击打不开
www.googleadservices.com ERR_CONNECTION_CLOSED
OpenClash 开启后广告请求失败可以重点检查:
- 规则是不是写在
rules:区域; - 有没有误写到“绕过指定区域 IPv4 黑名单”;
- Clash 规则格式是否正确;
- 广告相关规则是否放在最前面;
www.googleadservices.com是否应该走代理;- 策略组名称是否正确;
- 是否还有 DNS 或浏览器插件在拦截广告请求。
我这里最终的思路就是:
不要全局处理 google.com,只单独处理 Google Ads 相关域名。
广告点击跳转域名如果直连断开,就让它走代理。这样既不会影响整个 Google 服务,也能更精准地解决 AdSense 广告展示和点击跳转的问题。