|
基于PVE虚拟化环境的部署方案,详解 ImmortalWrt (Open克拉斯)与 AdGuard Home 如何无缝协作,兼顾海淘上网与广告拦截。
一、前言
本人也是小白一名,最近无聊想着折腾软路由,也是磕磕碰碰踩了很多坑,网上包括论坛也有很多教程,但是很多图片要么是版本更新太快已经不适合最新的版本,要么是细节很模糊,我也是刚刚折腾完毕,本着人人为我,我为人人的精神,发一份我自己的教程,也是抛砖引玉,请各位大神指正。
 希望达成目标:
- ✅ 广告拦截:所有设备的广告域名优先被 AdGuard 拦截,无需转发到 Open克拉斯
- ✅ 智能分流:非广告域名按规则分流——国内域名(百度、豆包等)直连,海外域名(谷歌等)走代理
- ✅ 强制生效:确保所有 DNS 查询无法绕过该流程,避免分流失效或广告漏拦
- ✅ 兼容 Fake-IP:Open克拉斯 启用 Fake-IP 模式时,AdGuard 仍能正常拦截广告
二、硬件与软件环境
先说说我自己的系统构架,硬件:康耐信8505+32G内存+1T硬盘,软件:PVE 9.0,VM:immortalwrt、fnos,LXC:Adguard、小型docker(各自独立)
2.1 网络拓扑结构(PVE虚拟化环境)
- 最上层:PVE 主机(LAN 网段:192.168.0.0/24)
- 虚拟机 [VM: ImmortalWrt]
- IP 地址:192.168.0.x(网关地址:192.168.0.1)
- 网络特性:直通网口直连光猫,负责路由转发
- 运行组件:Open克拉斯(实现智能分流)
- 容器 [LXC: AdGuard]
- IP 地址:192.168.0.110
- 运行组件:AdGuard Home(专注广告拦截)
- 客户端设备:均接入 192.168.0.0/24 网段,通过 DHCP 获取网络配置,这里特别说明一下,外接了一个无线路由器(192.168.0.166)采用桥接lan对lan只负责无线wifi,我家里的所有设备均通过无线路由器的wifi联网。
2.2 核心组件说明组件 | 配置详情 | | 虚拟化平台 | Proxmox VE(PVE),管理所有虚拟机和容器 | | 路由系统 | ImmortalWrt(VM 虚拟机),作为网关(192.168.0.1),默认 DNS/DHCP 由 dnsmasq 管理(可以设置静态IP绑定MAC,并通过防火墙规则实现白名单上网及指定IP定时封网解封控制小孩上网) | | 广告拦截 | AdGuard Home(LXC 容器),IP:192.168.0.110,负责广告域名过滤 | | 分流工具 | Open克拉斯(运行于 ImmortalWrt 中),实现域名智能分流 | | 网络流程 | 设备 → ImmortalWrt(网关)→ AdGuard → Open克拉斯 → AdGuard → 互联网
| | Open克拉斯 模式 | Fake-IP 模式(解析返回 198.18.x.x 网段假 IP) |
为什么没有在immortalwrt直接配置adguard,主要是之前搞在一起踩了很多坑,逻辑也很混乱或者说之前太菜理解不透,我关于软路由、PVE、Linux所有的知识都是现学现卖,现在有了AI,所以很多以前搞不了的东西通过与AI对话也可以完成了,包括目前的整个配置都是不断的在和AI对话、测试中慢慢理解和完善的,比如为什么我现在会一个LXC只部署一个docker,就是因为之前混在一起,调试某一个程序结果把其他的程序也搞崩了,现在都单独隔离就不存在这个问题,当然资源占用也会浪费,不过对于我这套硬件应该是问题不大,总之,菜有菜的玩法,大佬们可以无视。
三、详细配置步骤3.1 基础前提:DHCP 强制下发 DNS 到 AdGuard
先看immortalwrt系统概况
进入网络----接口----lan----编辑
高级设置----添加指定DNS(Adguard的IP192.168.0.110)
另外我把IPv6相关的设置都禁用了,我这里用不了IPv6,大家自行设置
DHCP服务器----高级设置----DHCP选项添加两条,也是保证
6,192.168.0.110 → Option 6 = DNS 服务器 = 192.168.0.110(AdGuard Home)3,192.168.0.1 → Option 3 = 默认网关 = 192.168.0.1(Immortalwrt)
再进入DHCP/DNS设置,添加DNS转发到127.0.0.1#7874(这里是本机)
静态IP绑定MAC可以参考,再配合防火墙的通信规则实现白名单上网,利用脚本实现定时封禁IP及解封控制小孩上网。
3.2 Open克拉斯 配置:本地 DNS 劫持 + Fake-IP 模式
模式选择Fake-IP增强模式
DNS设置选择 本地DNS劫持(使用 Dnsmasq 转发)确保让Open克拉斯接管DNS
覆写设置----DNS设置(重点)
Nameserver-Policy 添加
- # 国内站点 → 国内 DNS(最快、不污染)
- "geosite:cn": [https://doh.pub/dns-query, 114.114.114.114, 223.5.5.5]
- # 歪果站点 → 可信 DoH
- "geosite:geolocation-!cn": [tls://8.8.4.4, https://1.0.0.1/dns-query]
复制代码
规则匹配对象上游 DNS协议作用
geosite:cn所有国内域名(如 baidu.com、taobao.com)① DoH 腾讯公共 ② 114DNS ③ 阿里DNSHTTPS + 明文防污染 + 低延迟
geosite:geolocation-!cn所有非中国大陆域名(如 google.com、youtube.com)① Google DoT ② Cloudflare DoHTLS + HTTPS防封锁 + 加密传输
下方的nameserver、fallback、default-nameserver我分别保留了2组,功能其实用AI查询就知道了
配置项详细作用举个例子
nameserver-policy最高优先级 按 域名规则 匹配,强制走指定 DNSgeosite:cn → 走 114.114.114.114 youtube.com → 走 1.1.1.1
nameserver主 DNS 列表 未匹配 nameserver-policy 的域名走这里baidu.com 没写规则 → 走 nameserver 里的 doh.pub
fallback污染检测 + 备用 当 nameserver 返回“可疑 IP”(如 0.0.0.0、假 IP)时,自动切换到 fallback 重新解析youtube.com 被 114DNS 污染 → 自动用 1.1.1.1 再查一次
default-nameserver冷启动 DNS 只用来解析 nameserver 和 fallback 本身的域名 不处理任何用户查询Open克拉斯 启动时要解析 doh.pub → 用 default-nameserver 查它的 IP
还有一个地方,如果网络内有某个IP你不希望走Open克拉斯的代理通道,比如不想让他访问被墙的网站,可以在覆写设置----规则设置----自定义规则添加
3.3 AdGuard 配置:上游 DNS 指向 Open克拉斯
实际上前面的逻辑跑通了,到这里就很简单了,直接进入「设置 → DNS → 上游 DNS 服务器」,只需要保留一个192.168.0.1:7874(Open克拉斯 监听端口)
四、效果验证
场景1:广告域名(如 googleads.g.doubleclick.net)【AdGuard 日志】
请求:googleads.g.doubleclick.net(类型:A/HTTPS)
状态:已拦截
规则:||doubleclick.net^(广告拦截规则)
响应:A: 0.0.0.0(拦截返回)
耗时:0.06 毫秒
流程:设备 → AdGuard(LXC容器直接拦截)→ 无后续请求(未到达 Open克拉斯) 结论:广告域名被 AdGuard 优先拦截,无需占用 Open克拉斯 资源
场景2:国内域名(如 www.baidu.com、www.doubao.com)【AdGuard 日志】
请求:www.doubao.com(类型:A)
状态:已处理
DNS 服务器:192.168.0.1:7874(Open克拉斯)
响应:A: 198.18.0.29(Fake-IP)
耗时:0.56 毫秒
【本地 tracert 验证】
tracert www.baidu.com
1 → 192.168.0.1(ImmortalWrt 网关)
2 → 192.168.1.1(光猫)
3 → 171.113.126.1(国内运营商网关)
...
最终 → 183.2.172.17(百度国内服务器)
流程:设备 → AdGuard(LXC未拦截)→ Open克拉斯(VM分流为DIRECT)→ 国内运营商网络 → 目标服务器 结论:国内域名成功直连,路由路径均为国内IP地址,分流生效
场景3:海外域名(如 www.google.com)【AdGuard 日志】
请求:www.google.com(类型:A)
状态:已处理
DNS 服务器:192.168.0.1:7874(Open克拉斯)
响应:A: 198.18.0.31(Fake-IP)
耗时:0.62 毫秒
【本地 tracert 验证】
tracert www.google.com
1 → 192.168.0.1(ImmortalWrt 网关)
2 → 192.168.0.1 报告:无法访问目标协议
流程:设备 → AdGuard(LXC未拦截)→ Open克拉斯(VM分流为PROXY)→ 代理IP地址 → 谷歌服务器 结论:Fake-IP 模式下,tracert 无法跟踪真实路径(假 IP 被 Open克拉斯 接管),浏览器可正常访问谷歌,代理生效
有错误也请大佬指正
|