便携 DHCP 服务器 v1.0: 单文件 DHCP 引擎 + tkinter GUI

- 完整 DHCP 流程: DISCOVER/OFFER/REQUEST/ACK/NAK/DECLINE/RELEASE/INFORM
- 租约管理: 搜索/筛选/详情栏/解除/批量清除/CSV导出
- 保留地址: MAC→IP 绑定、独立租期、在线状态、导入导出
- 静态绑定/PXE 支持/冲突检测/租约持久化/防火墙一键放行
- 协议自检 25 项 + GUI 冒烟 21 项全部通过
This commit is contained in:
xuejin.wang
2026-10-08 15:35:20 +08:00
commit a2a1f36092
4 changed files with 2255 additions and 0 deletions
+14
View File
@@ -0,0 +1,14 @@
# 运行时生成的本地数据(不进版本库)
dhcp_config.json
dhcp_leases.json
__pycache__/
# 打包产物(体积大, 不入 git)
*.exe
dist/
build/
*.spec
# 系统杂项
Thumbs.db
desktop.ini
+2090
View File
File diff suppressed because it is too large Load Diff
+118
View File
@@ -0,0 +1,118 @@
# 便携 DHCP 服务器 使用说明
一个运行在 Windows 电脑上的轻量 DHCP 服务器(单文件、免安装、图形界面),
用于给局域网里的测试设备临时分配 IP:开发板、IP 摄像头、交换机、PXE 网络启动等。
## 一、环境要求(二选一)
- **直接用 exe(推荐)**:Windows 7 及以上,双击即用,无需安装任何东西
- **源码方式**:需 Python 3.10+(仅用标准库,无需第三方包)
安装时勾选 **Add python.exe to PATH**
## 二、快速开始
1. 双击 **`便携DHCP服务器.exe`**(首次启动约需几秒自解压,属正常现象)
或源码方式:双击 `启动DHCP服务器.bat`
2. 确认「服务网卡 IP」是接入测试网络的网卡地址(可点「刷新本机IP」)
3. 设置地址池,例如 `192.168.10.100 ~ 192.168.10.200`
4. 点击 **▶ 启动服务**
5. 把待分配 IP 的设备接进同一个交换机/Wi-Fi,设为自动获取 IP 即可
> 排错:窗口一闪而过时,在命令行手动运行 `python dhcp_server_app.py` 查看报错。
> 自检:`python dhcp_server_app.py --selftest` 可验证协议引擎是否正常。
## 三、三大管理界面
**客户端列表**:顶部搜索框可按 IP / MAC / 主机名 / 备注实时过滤;状态下拉可只看
已分配 / 预分配 / 已过期。选中任意行,下方详情栏显示该客户端完整信息;
右键弹出快捷菜单(复制、解除租约、设为保留地址)。
**租约管理**:列表工具栏提供「解除选中租约」「清空过期租约」「清空全部租约」,
均带确认弹窗。解除租约后该设备下次续租会被拒绝并重新申请地址。
**保留地址(MAC→IP)**:点「新增保留地址」填写 MAC、固定 IP、备注和可选的
独立租约时长;立即生效无需重启服务。「在线状态」列实时显示该设备是否在线。
在客户端列表中选中某行点「设为保留地址」,可把当前分配的 IP 直接固定给该设备。
支持导入 / 导出 CSV,方便批量维护。
## 四、首次使用必看:防火墙
客户端的 DHCP 请求是发往本机 **UDP 67** 的入站流量,默认会被 Windows 防火墙拦截。
- 右键 `启动DHCP服务器.bat` → **以管理员身份运行**
- 在程序里点击 **「防火墙放行 UDP 67」**(会弹窗确认)
- 之后日常使用无需再管(也可随时点「移除放行」撤销)
对应的手动命令(管理员):
```
netsh advfirewall firewall add rule name="PortableDhcpServer-UDP67" dir=in action=allow protocol=UDP localport=67 profile=any
netsh advfirewall firewall delete rule name="PortableDhcpServer-UDP67"
```
## 五、功能说明
| 功能 | 说明 |
| --- | --- |
| 地址池 | 起始~结束范围内的顺序分配;自动跳过网关、本机 IP、网络号、广播地址 |
| 客户端列表 | 实时查看 IP / MAC / 主机名 / 状态 / 来源 / 租约到期 / 剩余有效期 / 备注 / 最近活动;支持关键字搜索与状态筛选;选中行在下方显示完整详情 |
| 租约管理 | 解除选中租约、一键清除全部过期租约、清空全部租约;到期自动回收;同一设备尽量保持原 IP;停止服务时保存到磁盘 |
| 保留地址 | 按 MAC 固定 IP(即 DHCP 保留地址);支持备注和**单独自定义租约时长**;显示在线/离线/从未上线状态;可编辑、导入/导出 CSV、从客户端列表一键转为保留 |
| 客户端操作 | 右键菜单:复制 MAC / 复制 IP / 解除租约 / 设为保留地址;双击 MAC 复制到剪贴板 |
| 冲突检测 | 分配前先 Ping 候选地址,占用或已被 DECLINE 的地址自动跳过并记入冲突名单 |
| 导出 CSV | 客户端列表、保留地址均可导出为 Excel 可读的 CSV |
| PXE 支持 | 填写 TFTP 服务器(option 66) 和启动文件名(option 67) 即可用于网络启动 |
## 六、常见问题
**1. 启动失败:端口被占用(10013/10048)**
通常是系统开启了「Internet 连接共享 / 移动热点」,其内置 DHCP 分配器占了 UDP 67。
用管理员运行 `net stop SharedAccess` 关闭,或
`netstat -ano -p udp | findstr :67` 查看占用进程。
**2. 客户端拿不到 IP**
- 防火墙没放行(见第四节)
- 设备和电脑不在同一个二层网络(DHCP 依赖广播,不能跨路由器/跨 VPN)
- 网段填错:地址池必须与网卡 IP 同网段
**3. 多网卡电脑**
服务监听所有网卡的 UDP 67,但「服务网卡 IP」决定下发的网关/子网参数。
插着 VPN 或虚拟网卡时请选对网卡,建议只保留接测试网的网卡。
**4. 和路由器的 DHCP 冲突?**
同一网段只能有一个 DHCP 服务器,否则客户端会随机拿到二者之一。
要么关闭路由器 DHCP,要么把电脑接到独立交换机做纯测试网。
## 七、文件说明
| 文件 | 作用 |
| --- | --- |
| `便携DHCP服务器.exe` | **独立可执行程序**,免 Python,可单独拷贝到其他电脑使用 |
| `dhcp_server_app.py` | 主程序源码(引擎 + 界面) |
| `启动DHCP服务器.bat` | 源码方式一键启动(需装 Python) |
| `dhcp_config.json` | 点「保存配置」后生成的配置文件(exe 生成时保存在其所在目录) |
| `dhcp_leases.json` | 运行时自动生成的租约记录(可删除,删除后重新分配) |
> exe 使用提示:配置与租约文件保存在 exe **同一目录**,拷贝 exe 时同目录
> 的这两个 json 可一并拷贝以保留配置。首次运行若 Windows SmartScreen 提示
> "已保护你的电脑",点「更多信息」→「仍要运行」即可(自打包程序未签名属正常现象)。
## 八、重新打包 exe(可选)
当前 `便携DHCP服务器.exe` 已打包完成。修改源码后如需重新打包:
```
python -m venv .temp\dhcppkg
.temp\dhcppkg\Scripts\python.exe -m pip install pyinstaller
.temp\dhcppkg\Scripts\pyinstaller.exe --onefile --windowed --name 便携DHCP服务器 dhcp_server_app.py
```
生成的 `dist\便携DHCP服务器.exe` 可单独拷贝使用。
## 九、使用须知
- 本工具面向**测试/实验网络**,请勿接入生产网络与正式 DHCP 服务混用
- DHCP 基于 UDP 广播,仅适用于与电脑**同一物理网段**的设备
- 程序不做鉴权,同一网段内任何设备都能申请到地址,注意使用场景
> AI生成
+33
View File
@@ -0,0 +1,33 @@
@echo off
rem ============================================
rem 便携 DHCP 服务器 - 一键启动器
rem 如需添加防火墙规则, 请右键本文件选择
rem "以管理员身份运行", 再在程序里点击"防火墙放行"
rem ============================================
cd /d "%~dp0"
where pythonw >nul 2>nul
if not errorlevel 1 (
start "" pythonw "dhcp_server_app.py"
exit /b 0
)
where python >nul 2>nul
if not errorlevel 1 (
start "" python "dhcp_server_app.py"
exit /b 0
)
where py >nul 2>nul
if not errorlevel 1 (
start "" py "dhcp_server_app.py"
exit /b 0
)
echo [提示] 未检测到 Python。
echo 请先安装 Python 3.10 或更高版本(安装时勾选 "Add python.exe to PATH"):
echo https://www.python.org/downloads/
echo.
echo 排错提示: 如启动后窗口一闪而过, 请在命令行手动运行
echo python dhcp_server_app.py
echo 即可看到具体报错信息。
echo.
pause