AdGuard Home 内置 DHCP 服务器测试指南:VirtualBox 隔离网络与 DHCPTest 快速验证全流程
AdGuard Home 内置 DHCP 服务器测试指南VirtualBox 隔离网络与 DHCPTest 快速验证全流程【免费下载链接】AdGuardHomeNetwork-wide ads trackers blocking DNS server项目地址: https://gitcode.com/gh_mirrors/ad/AdGuardHomeAdGuard Home 不仅是网络级 DNS 广告拦截器还内置了支持 IPv4/IPv6 的 DHCP 服务器可在同一台设备上完成地址分配与 DNS 解析的联动。本文以仓库中 internal/dhcpd/README.md 为骨架完整讲解两套经过验证的测试方案——基于 VirtualBox Host-Only 网络的隔离环境测试以及基于 DHCPTest 工具的 DISCOVER-OFFER 报文级快速验证并结合internal/dhcpd包源码逐项剖析AdGuardHome.yaml中 DHCP 配置参数的含义与生效机制。读完本文你将能够独立搭建 DHCP 测试环境、编写可运行的配置并理解 DHCPv4/DHCPv6 消息处理与租约分配的底层实现。DHCP 服务器在 AdGuard Home 中的定位AdGuard Home 的 DHCP 服务器由 internal/dhcpd 包实现它同时管理 DHCPv4 与 DHCPv6 两套服务并对外暴露一组/control/dhcp/*的 HTTP API注册于 http_unix.go。从 dhcpd.go 的Create函数可以看到服务启动时会同时创建 v4 与 v6 两个子服务dhcpd.go若两者均未启用则会报错neither dhcpv4 nor dhcpv6 srv is configured。值得强调的是DHCP 服务与 DNS 功能是深度联动的DHCP 分配的租约含主机名会回写到 DNS 解析层例如通过HostByIP、IPByHost接口实现「主机名 → IP」的反查从而让局域网内设备可以通过myhost.lan这样的本地域名被解析对应配置项local_domain_name见 config.go。这解释了为什么测试时看到dhcpv4: listening日志意味着整套服务链路已经就绪。测试方案一VirtualBox 隔离网络环境在真实局域网中测试 DHCP 会干扰其他设备使用 VirtualBox 的 Host-Only仅主机网络可以构造一个与外部完全隔离、可随意刷新的实验网络。这也是 README 推荐的正式测试路径。前置条件一台运行 Linux 的 AdGuard Home 主机虚拟机亦可已安装 VirtualBox一台客户机虚拟机guest OS 不限Linux/Windows 均可。配置 VirtualBox创建 Host-Only 网络。安装 VirtualBox 后执行VBoxManage hostonlyif create该命令会创建一个名为vboxnet0通常如此的虚拟网卡。可用ip a命令确认其状态与 IP默认网段通常为192.168.56.0/24。也可以在图形界面完成同样的操作File → Host Network Manager中新建 Host-Only 网络。将虚拟机接入该网络在VM Settings → Network → Host-only Adapter中选择刚创建的 Host-Only 适配器。启动虚拟机并安装操作系统将客户机的网络接口配置为「使用 DHCP 自动获取 IP」。客户机启动后便会向网络中的 DHCP 服务器发送请求。查看客户机当前 IPLinux 上执行ip aWindows 上执行ipconfig。强制客户机重新申请地址Linux 上使用dhclient如dhclient -r dhclient或按发行版使用systemctl restart networkingWindows 上使用ipconfig /release后再ipconfig /renew。这一操作可用于反复验证租约分配与续租流程。配置 AdGuard Home 服务器端编辑 AdGuard Home 的配置文件AdGuardHome.yaml写入以下 DHCP 配置块这是 README 给出的完整示例网段与上一步的vboxnet0默认网段对应dhcp: enabled: true interface_name: vboxnet0 local_domain_name: lan dhcpv4: gateway_ip: 192.168.56.1 subnet_mask: 255.255.255.0 range_start: 192.168.56.2 range_end: 192.168.56.2 lease_duration: 86400 icmp_timeout_msec: 1000 options: [] dhcpv6: range_start: 2001::1 lease_duration: 86400 ra_slaac_only: false ra_allow_slaac: false注意示例中range_start与range_end均为192.168.56.2即地址池只有一个地址适合单客户机的最小验证生产环境应给出连续地址段。启动服务器并验证./AdGuardHome -v-v为 verbose 日志模式。当 DHCP 服务成功绑定网卡并开始监听时日志中会出现 README 指定的标志性输出[info] dhcpv4: listening对应日志在源码中位于 v4_unix.golog.Info(dhcpv4: listening)其前提是配置中dhcpv4已启用且配置校验通过指定的interface_name存在于系统中net.InterfaceByName见 v4_unix.go网卡上存在可用的 IPv4 地址aghnet.IfaceDNSIPAddrs见 v4_unix.go该地址随后会被用作返回给客户端的 DNS 服务器地址。随后在客户机上执行ip aLinux或ipconfigWindows应能看到从地址池192.168.56.2分配的 IP以及下发的网关、子网掩码、DNS 等参数。测试方案二DHCPTest 工具快速验证如果只是想在协议报文层面快速确认 DHCP 服务是否工作可以使用社区通用的 DHCPTest 测试工具CyberShadow/dhcptest。该工具可向目标 DHCP 服务器发送模拟的 DHCPDISCOVER 报文并观察是否收到 DHCPOFFER 响应。前置条件获取 DHCPTest 测试工具dhcptest并确保其可执行。执行快速测试README 指出DHCP 服务器可以在交互式interactive模式下测试 DISCOVER-OFFER 报文交换。具体做法是确认 AdGuard Home 的 DHCP 服务已启动参考上文日志验证在另一台与 DHCP 服务器处于同一网段的机器上运行 DHCPTest观察工具输出正常情况下服务器应回以 DHCPOFFER 报文其中携带建议的 IP 地址、租约时长等选项对应源码中handleDiscover里resp.UpdateOption(dhcpv4.OptMessageType(dhcpv4.MessageTypeOffer))的分支见 v4_unix.go。该方案适合在 CI、脚本或无法启动完整虚拟机时做冒烟测试只要 DISCOVER 能拿到 OFFER就说明 UDP 端口 67 监听、租约分配逻辑与配置校验均已正常工作。配置参数深度解析README 给出的 YAML 示例覆盖了 DHCP 的全部核心配置项。结合 config.go 中的结构体定义可以逐项理解其语义与源码级影响。顶层dhcp配置参数类型默认行为说明enabledboolfalse总开关。dhcpd.go的Create中若总开关关闭但任一子服务未启用会直接报错interface_namestring—监听网卡名如vboxnet0、eth0。服务启动时按此名称查找网卡见 v4_unix.golocal_domain_namestring—本地域名后缀。例如客户端主机名myhost配合lan可解析为myhost.lan见 config.godhcpv4配置对应V4ServerConf见 config.go参数类型默认值说明gateway_ipIPv4—网关地址。Validate会以它与subnet_mask计算子网前缀与广播地址aghnet.BroadcastFromPref见 config.gosubnet_maskIPv4—子网掩码如255.255.255.0用于计算分配子网范围range_start/range_endIPv4—动态租约地址池的首末地址。校验规则网关 IP 不得落在地址池内且地址池必须完全位于子网内否则报错见 config.golease_durationuint32秒864001 天租约时长。配置为 0 时使用默认值见 v4_unix.go 与DefaultDHCPLeaseTTLdhcpd.goicmp_timeout_msecuint32毫秒1000IP 冲突检测分配地址前向目标发 ICMP 探测超时内无回包才认为地址可用设为 0 关闭检测。见addrAvailablev4_unix.go与DefaultDHCPTimeoutICMPdhcpd.gooptionsstring 数组[]自定义 DHCPv4 选项。支持两种语法DEC_CODE hex HEX_DATA任意十六进制数据与DEC_CODE ip IP_ADDRIP 数据仅支持单 IP见 config.godhcpv6配置对应V6ServerConf见 config.go参数类型默认值说明range_startIPv6—动态租约起始地址最后一个允许的地址以0xff字节结尾即地址范围从range_start到同前缀末位0xff判定逻辑见ip6InRangev6_unix.golease_durationuint32秒86400租约时长为 0 时使用默认值v6_unix.gora_slaac_onlyboolfalse仅发送无 M/O 标志的 ICMPv6 路由器通告RA强制客户端使用 SLAAC 而非 DHCPv6 分配地址为 true 时 DHCPv6 服务本身不会启动见 v6_unix.gora_allow_slaacboolfalse在 RA 报文中携带 M/O 标志允许 SLAAC 与 DHCPv6 并存此外DHCPv6 服务会通过configureDNSIPAddrs获取网卡上的 IPv6 地址作为下发给客户端的 DNS 服务器v6_unix.go并初始化 RA 模块周期性发送路由器通告ra.packetSendPeriod 1 * time.Second见 v6_unix.go。底层机制租约分配与消息处理理解测试结果的正确性还需要知道 DHCP 服务内部如何工作。DHCPv4 消息流。packetHandler接受 DISCOVER、REQUEST、DECLINE、RELEASE 四类报文v4_unix.go其中 REQUEST 会根据是否携带 server identifier 选项自动区分 SELECTING、INIT-REBOOT、RENEWING/REBINDING 三种客户端状态handleByRequestType见 v4_unix.go。分配地址时先通过位图leasedOffsets在地址池内找空闲地址池满则回收最早过期的动态租约reserveLease见 v4_unix.go随后用 ICMP 冲突检测addrAvailable确认地址确实空闲。DHCPv6 消息流。对应process与packetHandlerv6_unix.go处理 Solicit/Request/Confirm/Renew/Rebind/Release 等消息校验 ClientID、ServerID 策略与 IA 地址并返回含 IA_NA、DNS 服务器与状态码的 Reply支持 Rapid Commit 快速提交。测试时可重点观察这些日志以-v运行时默认开启 debug 级 DHCP 日志。租约持久化与静态租约。租约数据库保存在工作目录下的文件中dbFilePath由DataDir拼接而来见 dhcpd.go服务启动时加载dbLoad租约变更时通过notify回调触发落盘。除动态租约外还支持静态租约MAC 与 IP 绑定相关操作可经由 HTTP API 完成。通过 HTTP API 进一步验证除日志与客户端观察外仓库还提供了一组 REST 端点注册于 http_unix.go用于交互式验证方法与路径用途GET /control/dhcp/status查询 DHCP 服务状态与当前租约GET /control/dhcp/interfaces列出可用网卡及地址便于确认interface_namePOST /control/dhcp/set_config动态修改并重启 DHCP 配置POST /control/dhcp/find_active_dhcp探测指定网卡上是否已存在其他 DHCP 服务器POST /control/dhcp/add_static_lease添加静态租约POST /control/dhcp/remove_static_lease移除静态租约POST /control/dhcp/update_static_lease更新静态租约POST /control/dhcp/reset/reset_leases停止服务 / 重置租约例如测试时若客户机迟迟拿不到地址可先调用find_active_dhcp检查网段内是否已有别的 DHCP 服务抢占再通过status查看当前租约表是否已有分配记录。测试中的常见问题与排查建议日志未出现dhcpv4: listening优先确认interface_name拼写与ip a输出一致检查gateway_ip是否落入地址池源码会直接报错拒绝启动确认 v4/v6 至少启用其一否则Create会返回neither dhcpv4 nor dhcpv6 srv is configured。客户机拿不到地址在客户机上使用dhclientLinux或ipconfig /release后ipconfig /renewWindows强制重新申请确认虚拟网卡确实接入了 Host-Only 网络而非 NAT。地址池只有一个地址README 的最小示例range_start与range_end相同多台客户机同时测试时会被视为地址耗尽源码日志dhcpv4: no more ip addresses见 v4_unix.go请按需扩大范围。IPv6 场景若使用 SLAAC 优先的网络注意ra_slaac_only为 true 时 DHCPv6 不会监听v6_unix.go此时地址由无状态 SLAAC 分配属预期行为。以上两个测试方案与配置示例均来自 internal/dhcpd/README.md其背后的参数校验、地址分配与消息处理逻辑可在 config.go、dhcpd.go、v4_unix.go 与 v6_unix.go 中逐行验证。【免费下载链接】AdGuardHomeNetwork-wide ads trackers blocking DNS server项目地址: https://gitcode.com/gh_mirrors/ad/AdGuardHome创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

React Hook Form(react-hook-form)快速上手指南:基于 Hooks 的表单状态管理与验证(Web + React Native)

React Hook Form(react-hook-form)快速上手指南:基于 Hooks 的表单状态管理与验证(Web + React Native)

React Hook Form(react-hook-form)快速上手指南:基于 Hooks 的表单状态管理与验证(Web React Native) 【免费下载链接】react-hook-form 📋 React Hooks for form state management and validation (Web …

2026/9/23 7:09:25 阅读更多 →
Academic Research Skills 快速模式完整指南:30 分钟产出带可核验引用的研究简报

Academic Research Skills 快速模式完整指南:30 分钟产出带可核验引用的研究简报

Academic Research Skills 快速模式完整指南:30 分钟产出带可核验引用的研究简报 【免费下载链接】academic-research-skills Academic Research Skills for Claude Code: research → write → review → revise → finalize 项目地址: https://gitcode.com/GitH…

2026/9/21 12:16:09 阅读更多 →
机械拆装与结构分析PPT自动化生成:从流程拆解到python-pptx实践

机械拆装与结构分析PPT自动化生成:从流程拆解到python-pptx实践

简介:《机械拆装与结构分析》是一份面向机械工程专业学生与实训教师的PPT课件,聚焦减速器拆装与结构分析实验,适用于机械设计、维修及管理等方向的教学实操场景。课件围绕JZQ-250型二级展开式圆柱齿轮减速器和教学用单级圆柱齿轮减速器&#…

2026/9/22 6:28:01 阅读更多 →

最新新闻

5个维度一文搞懂游戏评测体系避坑指南

5个维度一文搞懂游戏评测体系避坑指南

5个维度一文搞懂游戏评测体系避坑指南 官方文档太长抓不住重点,这是做技术选型的常态。你想搞懂【游戏评测】背后的数据架构,翻遍 MDN Web Docs…

2026/9/23 7:09:49 阅读更多 →
Skill Seekers 完整指南:把文档、GitHub 仓库与 PDF 一键转化为可用的 AI Skill

Skill Seekers 完整指南:把文档、GitHub 仓库与 PDF 一键转化为可用的 AI Skill

Skill Seekers 完整指南:把文档、GitHub 仓库与 PDF 一键转化为可用的 AI Skill 【免费下载链接】Skill_Seekers Convert documentation websites, GitHub repositories, and PDFs into Claude AI skills with automatic conflict detection 项目地址: https://gi…

2026/9/23 7:09:49 阅读更多 →
基于NE5532运放的前馈式主动降噪耳机DIY:电路设计与调试全流程

基于NE5532运放的前馈式主动降噪耳机DIY:电路设计与调试全流程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/23 7:09:49 阅读更多 →
OpenZFS ZFS Test Suite 完全指南:构建、运行与自定义测试用例实战

OpenZFS ZFS Test Suite 完全指南:构建、运行与自定义测试用例实战

操作系统 【免费下载链接】zfs OpenZFS on Linux and FreeBSD 项目地址: https://gitcode.com/gh_mirrors/zf/zfs 点击查看 免费下载 导读 ZFS Test Suite(ZTS)是 OpenZFS 项目自带的端到端测试框架,覆盖 zfs/zpool 命令行、ARC…

2026/9/23 7:09:49 阅读更多 →
一文搞懂诺基亚7210高频面试题:别再瞎背了

一文搞懂诺基亚7210高频面试题:别再瞎背了

一文搞懂诺基亚7210高频面试题:别再瞎背了 看了一堆教程还是不会写项目?是不是觉得那些高大上的架构理论离自己太远,手一抖代码就崩?别慌,今天咱们不整虚的,直接 一文搞懂…

2026/9/23 7:09:49 阅读更多 →
标准IO与系统IO:从缓冲机制到性能优化的全面解析

标准IO与系统IO:从缓冲机制到性能优化的全面解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/23 7:08:48 阅读更多 →

日新闻

3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A…

2026/9/23 0:00:23 阅读更多 →
2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我

2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我

2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我 刚把开发环境的显示器从1080P换到2K,跑老项目直接报错,版本升级后 API…

2026/9/23 0:01:25 阅读更多 →
3步搞定美眉图实战项目,告别官方文档抓不住重点

3步搞定美眉图实战项目,告别官方文档抓不住重点

3步搞定美眉图实战项目,告别官方文档抓不住重点 官方文档翻了三遍还是云里雾里?别急,美眉图在实战项目中常被用来做数据可视化,但它的原理比你想的简单。今天咱们直接上手,用一个完整的小项目把美眉图跑通,不再死磕那些冗长的理论说明。…

2026/9/23 0:01:25 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/23 4:55:02 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/23 4:49:06 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/22 8:51:04 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/21 15:36:51 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/21 15:36:51 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/22 2:43:42 阅读更多 →