MiniDHCP 桌面版教程:Windows 便携 DHCP 服务器(原生 GUI)
机房要批量装机,实验室要临时组网,手头没有路由器、没有 Windows Server,怎么办?MiniDHCP 桌面版就是为这种场景准备的:一个 Go 写的单文件 Windows 原生程序,双击就能跑,不用装 Python、不用打开浏览器,点几下鼠标就能给整个网段分配 IP,还支持 PXE 网络引导。本教程讲桌面版的完整操作流程:从首次启动、界面每个区域的用法,到 PXE 装机配置和拿不到 IP 的七步排查。
一、项目简介
MiniDHCP 桌面版(MiniDHCP-GUI_Windows)是 AI-Agent 组织下的开源项目(Go,master 分支),一个原生 Windows 桌面程序,单窗口操作,不用打开浏览器。功能与 Web 版相同,界面照便携 DHCP 服务器的经典布局:服务配置、启动/停止、运行日志、客户端列表、保留地址。程序是 Go + Win32 原生界面编译成的单文件 MiniDHCP.exe,自带管理员 manifest,启动时会弹出 UAC 确认——绑定 UDP 67 端口必须管理员权限。
项目结构如下,源码在 src/ 目录,DHCP 引擎与界面分离:
MiniDHCP-GUI_Windows/
├── MiniDHCP.exe # 桌面版主程序(Go + Win32 原生界面,单文件)
├── Start-MiniDHCP.bat # 启动脚本(自动放行防火墙、前台运行)
├── config.json # 首次运行自动生成,也可直接编辑
├── config.example.json # 配置示例
├── leases.json # 租约持久化文件(勾选“租约保存到磁盘”时生成)
└── src/ # 完整源码(Go 1.26)
├── dhcp/ # DHCP 引擎库
├── cmd/gui/ # 桌面界面
└── cmd/web/ # Web 版界面
二、功能特性
- 单文件便携:解压到任意目录就能跑,不写注册表,不依赖运行库。
- 原生桌面界面:配置、启动、日志、客户端、保留地址都在一个窗口里,不用浏览器。
- 完整 DHCP 服务:DISCOVER → OFFER → REQUEST → ACK 全流程,租期管理、地址冲突检测。
- 租约持久化:勾选后租约存到
leases.json,重启后未过期的租约自动恢复。 - 静态保留地址:按 MAC 给指定设备固定分配 IP。
- PXE 网络引导:TFTP 服务器地址(option 66)+ 启动文件名(option 67),支持网络装机。
- 防火墙一键放行:调用 netsh 添加/删除 UDP 67/68 入站规则。
- 子网定向广播:OFFER 发往子网定向广播地址(如 10.0.0.255),多网卡机器也不会发错网段。
- 实时状态栏:地址池范围、已分配、预分配、冲突、可用、监听端口一目了然。
三、与 Web 版、WinDHCPD 的区别
AI-Agent 组织里有好几个 DHCP 项目,容易混淆,先把定位说清楚:
| 项目 | 语言 | 界面 | 运行依赖 | 适合场景 |
|---|---|---|---|---|
| MiniDHCP 桌面版 | Go | 原生 Win32 窗口 | 无,单文件 | 现场装机、临时组网、单机操作 |
| MiniDHCP Web 版 | Go | 浏览器 Web 面板 | 无,单文件 | 远程管理、多人查看 |
| WinDHCPD | Python + Scapy | Flask Web 面板 | Python 3.8+、Npcap | 多作用域、跨网段 Relay、协议学习 |
一句话总结:要最快上手选桌面版,双击即用;要远程管理选 Web 版;要多网段、跨网段 Relay 选 WinDHCPD。三个项目的 DHCP 引擎行为一致,日常使用上没有功能差距。
四、快速开始:解压即用
4.1 启动程序
- 解压到任意目录(建议单独建个文件夹,如
D:\MiniDHCP)。 - 双击
MiniDHCP.exe(程序自带管理员 manifest,会弹出 UAC 确认——绑定 67 端口必须管理员权限)。 - 也可以双击
Start-MiniDHCP.bat,它会先自动放行防火墙 UDP 67/68 再启动,并且以前台方式运行,报错会留在窗口里,不会一闪而过。
4.2 首次启动:确认配置
首次启动会自动按本机 IP 生成 config.json:地址池默认同网段 .100–.200,网关默认等于本机 IP,DNS 默认 223.5.5.5 / 114.114.114.114,租期 24 小时。注意:有真实路由器时请把默认网关改成路由器 IP,否则客户端拿到错误的网关就上不了外网。
4.3 启动服务并验证
- 确认「服务网卡 IP」是客户端所在网段的那块网卡(多网卡机器重点检查这一项)。
- 确认地址池,点击「启动服务」,状态栏显示「● 服务运行中」。
- 客户端执行
ipconfig /release再ipconfig /renew即可获取地址。
# 客户端验证
ipconfig /release
ipconfig /renew
ipconfig /all
五、界面详解:服务配置区
窗口上半部分是服务配置区,所有参数都在这里改:
- 服务网卡 IP:下拉框,可手动输入。多网卡机器上这是最关键的一项——必须选客户端所在网段的那块网卡,否则 OFFER 会发到错误的网段。
- 子网掩码:一般 255.255.255.0,对应 /24 网段。
- 地址池起止:可分配的 IP 范围,默认同网段 .100–.200。
- 默认网关:发给客户端的网关地址,默认等于本机 IP。有真实路由器时改成路由器 IP。
- DNS:逗号分隔,默认 223.5.5.5 / 114.114.114.114。
- 域名:发给客户端的 DNS 后缀,可选。
- 租约时长:默认 24 小时,流动性大的临时网络可以设短一些。
- TFTP 服务器 / 启动文件名:PXE 引导用,选填,见第八节。
两个重要的勾选项:
- 「按网卡 IP 自动填充默认值」:勾选时,切换网卡会自动填好地址池、网关和掩码,换网段时不用手工重算。
- 「分配前 Ping 检测地址冲突」:分配前 ping 一下,确认没有设备占用才分配,避免把已有人用的 IP 发出去。
- 「租约保存到磁盘」:勾选后租约存到
leases.json,重启后未过期租约会恢复,客户端不用重新获取。
六、界面详解:日志、客户端列表与状态栏
6.1 运行日志
窗口中部是运行日志,记录每次 DISCOVER / OFFER / REQUEST / ACK。「自动滚动」勾选时日志跟随到尾部,取消勾选可以停在原处查看;「清空日志」清除显示。排障时先看这里有没有 REQUEST(见第九节)。
6.2 客户端列表
当前租约一览(IP、MAC、主机名、租期到期),每 2 秒刷新。看到新设备上线,这里会实时出现。
6.3 保留地址(MAC → IP)
给指定设备固定分配 IP:填 MAC 和 IP 后添加,立即保存,重启服务后生效。打印机、服务器、需要端口映射的设备都适合用保留地址。删除保留地址同样立即保存。
6.4 按钮区
- 启动服务 / 停止服务:启动后状态栏显示「● 服务运行中」。
- 保存配置:保存到
config.json;服务运行时保存会自动重启服务。 - 防火墙放行 UDP 67 / 移除放行:调用 netsh 添加/删除入站规则(需管理员权限)。
- 清空冲突名单:清除被客户端 DECLINE 标记为不可用的地址(默认标记 1 小时)。
6.5 底部状态栏
地址池范围 · 已分配 · 预分配(已 OFFER 未确认)· 冲突 · 可用 · 监听端口。扫一眼就知道地址池还剩多少、是不是快满了。
七、配置文件 config.json 详解
config.json 由程序首次启动时自动生成,也可以直接用文本编辑器改(改完重启服务生效)。下面是一份配置示例的结构说明:
{
"server_ip": "192.168.1.1",
"subnet_mask": "255.255.255.0",
"pool_start": "192.168.1.100",
"pool_end": "192.168.1.200",
"gateway": "192.168.1.1",
"dns_primary": "223.5.5.5",
"dns_secondary": "114.114.114.114",
"domain": "",
"lease_hours": 24,
"lease_file": "leases.json",
"ping_check": true,
"reservations": {
"AA:BB:CC:DD:EE:FF": "192.168.1.50"
},
"web_addr": "127.0.0.1:8080"
}
字段含义与界面上的配置项一一对应:server_ip 是服务网卡 IP,subnet_mask 是子网掩码,pool_start / pool_end 是地址池,gateway 是默认网关,dns_primary / dns_secondary 是主备 DNS,domain 是下发的域名后缀(可空),lease_hours 是租期(小时),lease_file 是租约保存文件,ping_check 是分配前 Ping 检测,reservations 是 MAC 到固定 IP 的保留表,web_addr 是 Web 管理面板的监听地址。界面操作和直接改文件两种方式可以混用,界面上的「保存配置」就是写这个文件。
八、PXE 网络引导:TFTP 与启动文件
批量装机时,客户端网卡支持 PXE 启动,可以从网络加载引导文件,不用插 U 盘。MiniDHCP 通过 DHCP option 66(TFTP 服务器)和 option 67(启动文件名)把引导信息发给客户端。
- TFTP 服务器:填 TFTP 服务器的 IP(一般是跑 TFTP 服务的那台机器,通常和 DHCP 服务器是同一台)。
- 启动文件名:填引导文件名,例如
pxelinux.0(BIOS 模式)或bootx64.efi(UEFI 模式),具体名字取决于你的 PXE 环境。
注意:MiniDHCP 本身不提供 TFTP 服务,它只负责在 DHCP 报文中告诉客户端“去哪台 TFTP 服务器、拿哪个文件”。TFTP 服务器需要另外搭建(例如 tftpd-hpa 或 Windows 上的 Tftpd64),并且启动文件要放在 TFTP 根目录下。客户端 BIOS/UEFI 里要把网络启动(Network Boot / PXE)调到启动顺序的第一位。
九、常见问题:客户端拿不到 IP,按这个顺序查
这是最实用的部分,照顺序排查,不要跳步:
- 1. 先看日志有没有 REQUEST:如果只有 DISCOVER → OFFER 反复出现、没有 REQUEST,说明 OFFER 没到客户端。常见原因是服务器有多块网卡,OFFER 的广播走了默认路由的网卡、发到了错误的网段。本程序发的是子网定向广播(如 10.0.0.255),日志里 OFFER 后面的
via 10.0.0.255:68就是实际发往的地址——如果 via 的还是别的网段,检查「服务网卡 IP」是不是填了客户端所在网段的网卡地址。 - 2. 服务是不是在运行:状态栏是不是「服务运行中」,日志里有没有 DISCOVER。
- 3. 防火墙:确认放行了 UDP 67/68(点「防火墙放行 UDP 67」;客户端的防火墙也要放行 UDP 68,Windows 默认有 DHCP 客户端规则,改过防火墙策略的机器要检查)。
- 4. 客户端和服务器是不是在同一网段/同一广播域:DHCP 靠广播发现,跨 VLAN/跨路由器收不到(除非配了 DHCP 中继)。客户端是虚拟机时,确认网卡是桥接到服务器 10.0.0.x 那个网口上,而不是 NAT 模式。
- 5. 客户端
ipconfig /all看是不是 169.254.x.x:是的话就是没拿到 DHCP(APIPA 地址),按上面几条排查;同时在客户端跑ipconfig /release再ipconfig /renew重试。 - 6. 网段里是不是还有别的 DHCP 服务器在抢答:先停掉它。
- 7. 启动失败报 "address already in use":67 端口已被占用(可能已有 DHCP 服务或 ICS 在跑),先停掉对方。
十、从源码编译
想改功能或自己编译,源码在 src/ 目录(Go 1.26,dhcp/ 引擎库 + cmd/gui/ 桌面界面 + cmd/web/ Web 版界面)。重新编译桌面版:
# 需要先用 rsrc 把 MiniDHCP.manifest 生成 rsrc.syso(见 src/cmd/gui/README 说明)
GOOS=windows go build -o MiniDHCP.exe ./cmd/gui/
仓库里还带了单元测试(dhcp/dhcp_test.go、offer_test.go、server_test.go 和 Web 版的 web_test.go),改完引擎后可以先跑测试再编译。注意:编译产物是 Windows 程序,在 Linux 上交叉编译时要设 GOOS=windows。
十一、安全提醒与运维建议
- 同一网段只能有一个 DHCP 服务器。别在办公网/生产网直接跑,否则会抢走其他设备的地址分配,出问题先停掉本程序。
- 先在隔离网络测试:第一次使用先接一台测试客户端,确认地址、网关、DNS 都正确再扩大范围。
- 网关填对:有真实路由器时默认网关必须是路由器 IP,否则客户端能上内网但上不了外网。
- 保留地址提前规划:打印机、服务器等固定设备先做好保留地址,再开放动态池。
- 定期看状态栏:地址池快满时(可用为 0),新设备就拿不到地址了,及时扩大地址池或缩短租期。
- 备份 config.json 和 leases.json:换机器部署时直接复制这两个文件,配置和租约都在。
十二、总结
MiniDHCP 桌面版把 DHCP 服务器做成了一个双击即用的 Windows 程序:不用装运行环境、不用开浏览器、不用记命令,配置、启动、日志、客户端、保留地址全在一个窗口里。它的核心优势是快——从解压到客户端拿到 IP,熟练的话三分钟;子网定向广播和分配前 Ping 检测这两个细节,又帮你躲掉了多网卡发错网段、地址冲突这两个最常见的坑。适合的场景很明确:机房批量装机、实验室临时组网、现场调试。记住两条红线:同一网段只能有一个 DHCP 服务器,以及有路由器时网关要填路由器 IP,其他的照着界面点就行。







