# 便携 DHCP 服务器 (Portable DHCP Server) 一个运行在 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生成