编辑
2023-07-02
网络知识
00
请注意,本文编写于 512 天前,最后修改于 209 天前,其中某些信息可能已经过时。

目录

目标
主路由
旁路由
依据
Dnsmasq尽量保留
AdGuard Home要作为整个软路由的DNS入栈
主路由设置
更新核心版本
设置网页管理端口并访问
面板内配置
初始化
添加上游DNS服务器
开启53端口重定向
配置样例
旁路由
更新ADG Home核心版本
修改Dnsmasq的监听端口
设置ADG Home网页管理端口并访问
面板内配置
初始化
添加上游DNS服务器
Open Clash设置本地DNS劫持
配置Open Clash的上游DNS
重新运行
配置样例
在Fake IP模式下,DNS和TCP的流向
国内域名
国外域名
可能遇到的问题
尝试关闭Dnsmasq的重定向客户端DNS功能
ADG Home提示空间不足
Refers

AdGuard Home是一个用于屏蔽广告和追踪的软件,设置好后,它就可以覆盖家庭网络内的所有设备,而不需要在每个设备上安装软件。

它的原理是作为一个DNS服务器,将追踪域名重定向到一个“黑洞”,从而阻止设备连接到那些服务器。

因为其自带Dashboard管理面板,且拥有很漂亮的统计和图表,还能很方便的搜索历史DNS记录,所以不管是否有屏蔽广告的需求,都推荐使用ADG Home来作为软路由的根入口来接管DNS,方便查看和统计...

image.png

目标

主路由

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尽量保留

Dnsmasq是OpenWRT默认的DNS和DHCP服务器,与AdGuard Home的功能是冗余的,理论上是直接可以使用AdGuard Home来代替它的。但是,软路由内的很多应用,会依赖Dnsmasq,所以建议保留,让它担任透明转发的角色。

AdGuard Home要作为整个软路由的DNS入栈

原因是,AdGuard Home的统计功能,可以识别各个客户端,如果它不是入口,而是作为Dnsmasq的上游,那么客户端就统计不出来了,全部都会localhost。

image.png

作为根入栈,方法有两种:

  • 不改Dnsmasq,在AdGuard Home里设置53端口重定向,如上述主路由
  • 修改Dnsmasq监听端口,让出53端口给AdGuard Home监听,如上述旁路由

主路由设置

更新核心版本

打开ADG Home,点击更新核心版本,可能会有异常,多试几次。

设置网页管理端口并访问

监听端口重定向先别管,设置网页管理端口为3000,然后勾选启用,会显示AdGuardHome 运行中 未重定向,然后点击端口3000按钮,进入管理面板。

面板内配置

初始化

第一次进入会走初始化流程,面板管理端口填3000,DNS监听端口填3053

添加上游DNS服务器

选择设置——>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

开启53端口重定向

回到OpenWRT3053重定向那里,选择重定向53端口到AdGuardHome,然后保存并应用,等待顶部显示为AdGuardHome 运行中 已重定向

image.png

保存并应用,回到面板可查看是否有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核心版本

打开ADG Home,点击更新核心版本,可能会有异常,多试几次。

修改Dnsmasq的监听端口

选择网络——>DHCP/DNS——>高级设置,修改DNS 服务器端口5553,让出53端口给ADG Home用。

设置ADG Home网页管理端口并访问

同上

面板内配置

初始化

第一次进入会走初始化流程,面板管理端口填3000,DNS监听端口填53

添加上游DNS服务器

设置——>DNS设置——>上游 DNS 服务器,添加公共DNS服务,填127.0.0.1:5553,让Dnsmasq作为上游DNS服务器。

Open Clash设置本地DNS劫持

打开OpenClash——>插件设置——>DNS设置,本地DNS劫持选择使用 Dnsmasq 转发

image.png

保存并应用,配置完可以回到Dnsmasq页面验证,DNS转发选项会被改成127.0.0.1#7874

配置Open Clash的上游DNS

改为主路由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端口,不需要转发和重定向了。

image.png

保存并应用,回到面板可查看是否有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

在Fake IP模式下,DNS和TCP的流向

国内域名

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"]

可能遇到的问题

尝试关闭Dnsmasq的重定向客户端DNS功能

如果你的OpenWRT里由这个,并且DNS按照上述配置异常,可以尝试关闭它。

image.png

ADG Home提示空间不足

可能会发生在小内存的路由器上,可以修改ADG Home的工作目录,改到有剩余空间的分区下(一般是/tmp下)

Refers

如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:Ray

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

特别感谢:alicenetworks