AdGuard Home是一个用于屏蔽广告和追踪的软件,设置好后,它就可以覆盖家庭网络内的所有设备,而不需要在每个设备上安装软件。
它的原理是作为一个DNS服务器,将追踪域名重定向到一个“黑洞”,从而阻止设备连接到那些服务器。
因为其自带Dashboard管理面板,且拥有很漂亮的统计和图表,还能很方便的搜索历史DNS记录,所以不管是否有屏蔽广告的需求,都推荐使用ADG Home来作为软路由的根入口来接管DNS,方便查看和统计...
graph LR
A[设备]-->B["Dnsmasq(:53)"]
subgraph 软路由
B-->|重定向| C["ADG Home(:3053)"]
end
C-->|转发| D["上游公共DNS服务器"]
Dnsmasq仍然保持是整个软路由的DNS入口,在ADG Home里,设置它的DNS服务监听端口为3053,然后指定重定向53端口到3053端口,并且配置上游公共DNS服务器。 在ADG Home后面也可以是Open Clash等软件,我这里深造功能由旁路由负责了,所以是公共DNS服务器。
graph LR
A[设备]--> Z[主路由] --> B["ADG Home(:53)"]
subgraph 软路由
B-->|转发| C["Dnsmasq(:5553)"]
C-->|转发| D["Open Clash(:7874)"]
end
D-->|转发| E["上游DNS服务器(主路由:53)"]
与主路由不同,这里需要让Dnsmasq让位(修改它的监听端口为5553),让ADG Home接管53端口,成为整个软路由的DNS服务入口。然后依次向上转发给Dnsmasq和Open Clash,Open Clash的上游服务器建议指定为主路由的DNS服务器,这样就串起来的。
这么设计主要有以下几点原因和依据:
Dnsmasq是OpenWRT默认的DNS和DHCP服务器,与AdGuard Home的功能是冗余的,理论上是直接可以使用AdGuard Home来代替它的。但是,软路由内的很多应用,会依赖Dnsmasq,所以建议保留,让它担任透明转发的角色。
原因是,AdGuard Home的统计功能,可以识别各个客户端,如果它不是入口,而是作为Dnsmasq的上游,那么客户端就统计不出来了,全部都会localhost。
作为根入栈,方法有两种:
打开ADG Home,点击更新核心版本,可能会有异常,多试几次。
监听端口重定向
先别管,设置网页管理端口为3000
,然后勾选启用,会显示AdGuardHome 运行中 未重定向
,然后点击端口3000按钮,进入管理面板。
第一次进入会走初始化流程,面板管理端口填3000
,DNS监听端口填3053
。
选择设置——>DNS设置——>上游 DNS 服务器,添加公共DNS服务。
建议把运营商的添加进去(一般运营商的DNS速度都很快),再加几个国内的常用DNS服务器。
样例:
218.2.2.2 218.4.4.4 223.5.5.5 119.29.29.29 114.114.114.114
回到OpenWRT
,3053重定向
那里,选择重定向53端口到AdGuardHome
,然后保存并应用,等待顶部显示为AdGuardHome 运行中 已重定向
。
保存并应用,回到面板可查看是否有DNS请求进入。
bind_host: 0.0.0.0 bind_port: 3000 users: - name: root password: *** auth_attempts: 5 block_auth_min: 15 http_proxy: "" language: "" theme: auto debug_pprof: false web_session_ttl: 720 dns: bind_hosts: - 0.0.0.0 port: 3053 anonymize_client_ip: false protection_enabled: true blocking_mode: default blocking_ipv4: "" blocking_ipv6: "" blocked_response_ttl: 10 protection_disabled_until: null parental_block_host: family-block.dns.adguard.com safebrowsing_block_host: standard-block.dns.adguard.com ratelimit: 50 ratelimit_whitelist: [] refuse_any: true upstream_dns: - 218.2.2.2 - 218.4.4.4 - 223.5.5.5 - 119.29.29.29 - 114.114.114.114 upstream_dns_file: "" bootstrap_dns: - 218.2.2.2 - 218.4.4.4 all_servers: false fastest_addr: true fastest_timeout: 1s allowed_clients: [] disallowed_clients: [] blocked_hosts: - version.bind - id.server - hostname.bind trusted_proxies: - 127.0.0.0/8 - ::1/128 cache_size: 4194304 cache_ttl_min: 0 cache_ttl_max: 0 cache_optimistic: true bogus_nxdomain: [] aaaa_disabled: false enable_dnssec: false edns_client_subnet: custom_ip: "" enabled: false use_custom: false max_goroutines: 300 handle_ddr: true ipset: [] ipset_file: "" bootstrap_prefer_ipv6: false filtering_enabled: true filters_update_interval: 24 parental_enabled: false safebrowsing_enabled: false safebrowsing_cache_size: 1048576 safesearch_cache_size: 1048576 parental_cache_size: 1048576 cache_time: 30 safe_search: enabled: false bing: true duckduckgo: true google: true pixabay: true yandex: true youtube: true rewrites: - domain: test.com answer: blog.zai7lou.ml blocked_services: [] upstream_timeout: 10s private_networks: [] use_private_ptr_resolvers: true local_ptr_upstreams: [] use_dns64: false dns64_prefixes: [] serve_http3: false use_http3_upstreams: false tls: enabled: false server_name: "" force_https: false port_https: 443 port_dns_over_tls: 853 port_dns_over_quic: 853 port_dnscrypt: 0 dnscrypt_config_file: "" allow_unencrypted_doh: false certificate_chain: "" private_key: "" certificate_path: "" private_key_path: "" strict_sni_check: false querylog: ignored: [] interval: 168h size_memory: 1000 enabled: true file_enabled: true statistics: ignored: [] interval: 24h enabled: true filters: - enabled: false url: https://adguardteam.github.io/HostlistsRegistry/assets/filter_1.txt name: AdGuard DNS filter id: 1 - enabled: false url: https://adguardteam.github.io/HostlistsRegistry/assets/filter_2.txt name: AdAway Default Blocklist id: 2 whitelist_filters: [] user_rules: [] dhcp: enabled: false interface_name: "" local_domain_name: lan dhcpv4: gateway_ip: "" subnet_mask: "" range_start: "" range_end: "" lease_duration: 86400 icmp_timeout_msec: 1000 options: [] dhcpv6: range_start: "" lease_duration: 86400 ra_slaac_only: false ra_allow_slaac: false clients: runtime_sources: whois: true arp: true rdns: true dhcp: true hosts: true persistent: [] log_file: "" log_max_backups: 0 log_max_size: 100 log_max_age: 3 log_compress: false log_localtime: false verbose: false os: group: "" user: "" rlimit_nofile: 0 schema_version: 20
打开ADG Home,点击更新核心版本,可能会有异常,多试几次。
选择网络——>DHCP/DNS——>高级设置,修改DNS 服务器端口
为5553
,让出53端口给ADG Home用。
同上
第一次进入会走初始化流程,面板管理端口填3000
,DNS监听端口填53
。
设置——>DNS设置——>上游 DNS 服务器,添加公共DNS服务,填127.0.0.1:5553
,让Dnsmasq作为上游DNS服务器。
打开OpenClash——>插件设置——>DNS设置,本地DNS劫持
选择使用 Dnsmasq 转发
保存并应用,配置完可以回到Dnsmasq
页面验证,DNS转发
选项会被改成127.0.0.1#7874
。
改为主路由192.168.0.1
。
参考配置:
dns: enable: true # 开启DNS服务 ipv6: false # IPV6解析开关;如果为false,将返回ipv6结果为空 enhanced-mode: fake-ip # 模式:redir-host或fake-ip listen: 0.0.0.0:53 # DNS监听地址 default-nameserver: # 解析非IP的dns用的dns服务器,只支持纯IP - 114.114.114.114 - 223.5.5.5 # - 119.29.29.29 # - 8.8.8.8 fake-ip-range: 198.18.0.1/16 # Fake-IP解析地址池 fake-ip-filter: # 不进行Fake IP的域名 - "*.lan" - localhost.ptlogin2.qq.com - "+.srv.nintendo.net" - "+.stun.playstation.net" - "+.msftconnecttest.com" - "+.msftncsi.com" - "+.xboxlive.com" - "msftconnecttest.com" - "xbox.*.microsoft.com" - "*.battlenet.com.cn" - "*.battlenet.com" - "*.blzstatic.cn" - "*.battle.net" - "*.mcdn.bilivideo.cn" nameserver: # 默认DNS服务器,支持udp/tcp/dot/doh/doq - 192.168.0.1 # - dhcp://en0 # - 119.29.29.29 # - 223.5.5.5 # - 114.114.114.114 fallback: # 解析国外域名的DNS服务器,如果符合fallback-filter,nameserver解析结果会被抛弃,最后选择fallback的解析结果 - https://doh.pub/dns-query - https://dns.alidns.com/dns-query # - 'tcp://1.1.1.1' # - 'tcp://8.8.8.8' # - 'tcp://9.9.9.9' fallback-filter: # 配置 fallback 使用条件 geoip: true # 配置是否使用 geoip geoip-code: CN # 不使用,当 nameserver 域名的 IP 查询 geoip 库为 CN 时,不使用 fallback 中的 DNS 查询结果 geosite: # 使用 - gfw ipcidr: # 使用,在这个网段内的 IP 地址会被考虑为被污染的 IP - 240.0.0.0/4 domain: # 使用,这些域名被视为已污染,匹配到这些域名,会直接使用fallback解析,不去使用nameserver - "+.google.com" - "+.facebook.com" - "+.youtube.com" - "+.tiktok.com"
注意重定向53端口到AdGuardHome
保持选择无
,因为已经在监听53端口,不需要转发和重定向了。
保存并应用,回到面板可查看是否有DNS请求进入。
bind_host: 0.0.0.0 bind_port: 3000 users: - name: root password: *** auth_attempts: 5 block_auth_min: 15 http_proxy: "" language: "" theme: auto debug_pprof: false web_session_ttl: 720 dns: bind_hosts: - 0.0.0.0 port: 53 anonymize_client_ip: false protection_enabled: true blocking_mode: default blocking_ipv4: "" blocking_ipv6: "" blocked_response_ttl: 10 protection_disabled_until: null parental_block_host: family-block.dns.adguard.com safebrowsing_block_host: standard-block.dns.adguard.com ratelimit: 20 ratelimit_whitelist: [] refuse_any: true upstream_dns: - 127.0.0.1:5553 upstream_dns_file: "" bootstrap_dns: - 9.9.9.10 - 149.112.112.10 - 2620:fe::10 - 2620:fe::fe:10 all_servers: true fastest_addr: false fastest_timeout: 1s allowed_clients: [] disallowed_clients: [] blocked_hosts: - version.bind - id.server - hostname.bind trusted_proxies: - 127.0.0.0/8 - ::1/128 cache_size: 0 cache_ttl_min: 0 cache_ttl_max: 0 cache_optimistic: false bogus_nxdomain: [] aaaa_disabled: false enable_dnssec: false edns_client_subnet: custom_ip: "" enabled: false use_custom: false max_goroutines: 300 handle_ddr: true ipset: [] ipset_file: "" bootstrap_prefer_ipv6: false filtering_enabled: true filters_update_interval: 24 parental_enabled: false safebrowsing_enabled: false safebrowsing_cache_size: 1048576 safesearch_cache_size: 1048576 parental_cache_size: 1048576 cache_time: 30 safe_search: enabled: false bing: true duckduckgo: true google: true pixabay: true yandex: true youtube: true rewrites: - domain: cn.bing.com answer: bing.com blocked_services: [] upstream_timeout: 10s private_networks: [] use_private_ptr_resolvers: true local_ptr_upstreams: [] use_dns64: false dns64_prefixes: [] serve_http3: false use_http3_upstreams: false tls: enabled: false server_name: "" force_https: false port_https: 443 port_dns_over_tls: 853 port_dns_over_quic: 853 port_dnscrypt: 0 dnscrypt_config_file: "" allow_unencrypted_doh: false certificate_chain: "" private_key: "" certificate_path: "" private_key_path: "" strict_sni_check: false querylog: ignored: [] interval: 2160h size_memory: 1000 enabled: true file_enabled: true statistics: ignored: [] interval: 24h enabled: true filters: - enabled: false url: https://adguardteam.github.io/HostlistsRegistry/assets/filter_1.txt name: AdGuard DNS filter id: 1 - enabled: false url: https://adguardteam.github.io/HostlistsRegistry/assets/filter_2.txt name: AdAway Default Blocklist id: 2 whitelist_filters: [] user_rules: - '||o1098464.ingest.sentry.io^$important' - '#||cn.bing.com^$important' - "" dhcp: enabled: false interface_name: "" local_domain_name: lan dhcpv4: gateway_ip: "" subnet_mask: "" range_start: "" range_end: "" lease_duration: 86400 icmp_timeout_msec: 1000 options: [] dhcpv6: range_start: "" lease_duration: 86400 ra_slaac_only: false ra_allow_slaac: false clients: runtime_sources: whois: true arp: true rdns: true dhcp: true hosts: true persistent: [] log_file: "" log_max_backups: 0 log_max_size: 100 log_max_age: 3 log_compress: false log_localtime: false verbose: false os: group: "" user: "" rlimit_nofile: 0 schema_version: 20
graph TD
A[客户端欲请求域名] --> |1|B[客户端发起DNS请求拿IP] --> |2|C["DNS请求进入旁路由的ADG Home"] -->|3| D[进入Dnsmasq] -->|4| E[进入Clash]
E -->|5.返回Fake IP|D -->|6.返回|C-->|7.返回|B-->|8.返回|A
A-->|9|O[使用IP发起TCP/IP请求]-->P[请求被Clash拦截到]-->Q[根据Fake IP拿到之前的真实域名] --> R["根据域名匹配路由规则,发现国内,需要直连"] --> S["向上游(主路由)发起DNS解析"]-->|DNS|T[拿到真实IP]-->U[发起真正的TCP/IP请求]
graph TD
A[客户端欲请求域名] --> |1|B[客户端发起DNS请求拿IP] --> |2|C["DNS请求进入旁路由的ADG Home"] -->|3| D[进入Dnsmasq] -->|4| E[进入Clash]
E -->|5.返回Fake IP|D -->|6.返回|C-->|7.返回|B-->|8.返回|A
A-->|9|O[使用IP发起TCP/IP请求]-->P[请求被Clash拦截到]-->Q[根据Fake IP拿到之前的真实域名] --> R["根据域名匹配路由规则,发现国外,需要深造"] --> U["将请求使用指定协议封装后,发往节点服务器,由节点服务器执行DNS"]
如果你的OpenWRT里由这个,并且DNS按照上述配置异常,可以尝试关闭它。
可能会发生在小内存的路由器上,可以修改ADG Home的工作目录,改到有剩余空间的分区下(一般是/tmp下)
本文作者:Ray
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
特别感谢:alicenetworks