便携 DHCP 服务器教程:Windows 单文件图形界面的局域网 DHCP 实战

手头有一台开发板、一台 IP 摄像头或者一台要 PXE 装机的裸机,插上网线却拿不到 IP——办公室路由器不在这个网段、测试网里根本没有 DHCP 服务器,这种场景做嵌入式和网络实验的人一定不陌生。便携 DHCP 服务器(仓库 AI-Agent/dhcp-server-win)就是为这种场合准备的:一台 Windows 电脑、一个单文件 exe、双击即用,不用装任何东西,就能在局域网里临时提供 DHCP 服务。本文从快速上手到 PXE 启动、从租约管理到重新打包完整讲一遍。

一、项目简介

便携 DHCP 服务器(Portable DHCP Server)是一个运行在 Windows 电脑上的轻量 DHCP 服务器:单文件、免安装、带图形界面,专门用于给局域网里的测试设备临时分配 IP。目标设备包括开发板、IP 摄像头、交换机、PXE 网络启动的裸机等——这些设备通常没有办法手动配 IP,或者批量配 IP 的工作量太大,插上网线自动获取是最省事的方式。

技术上它完全基于 Python 标准库实现(dhcp_server_app.py 一个文件包含协议引擎和图形界面),不需要任何第三方包;发布形态是用 PyInstaller 打包成的单文件 exe(便携DHCP服务器.exe),拷贝到任何一台 Windows 7 及以上电脑上双击就能用。配置和租约分别存在同目录的两个 JSON 文件里(dhcp_config.json、dhcp_leases.json),换电脑时连同 exe 一起拷走就能保留配置。

dhcp-server-win/
├── 便携DHCP服务器.exe      # 独立可执行程序(发布形态,免 Python)
├── dhcp_server_app.py      # 主程序源码(引擎 + 界面)
├── 启动DHCP服务器.bat      # 源码方式一键启动(需装 Python)
├── dhcp_config.json        # 点「保存配置」后生成(运行时)
└── dhcp_leases.json        # 运行时自动生成的租约记录(运行时)

二、功能特性一览

功能说明
地址池起始~结束范围内的顺序分配;自动跳过网关、本机 IP、网络号、广播地址
客户端列表实时查看 IP / MAC / 主机名 / 状态 / 来源 / 租约到期 / 剩余有效期 / 备注 / 最近活动;支持关键字搜索与状态筛选;选中行下方显示完整详情
租约管理解除选中租约、一键清除全部过期租约、清空全部租约;到期自动回收;同一设备尽量保持原 IP;停止服务时保存到磁盘
保留地址按 MAC 固定 IP;支持备注和单独自定义租约时长;显示在线/离线/从未上线状态;可编辑、导入/导出 CSV、从客户端列表一键转为保留
客户端操作右键菜单:复制 MAC / 复制 IP / 解除租约 / 设为保留地址;双击 MAC 复制到剪贴板
冲突检测分配前先 Ping 候选地址,占用或已被 DECLINE 的地址自动跳过并记入冲突名单
导出 CSV客户端列表、保留地址均可导出为 Excel 可读的 CSV
PXE 支持填 TFTP 服务器(option 66)和启动文件名(option 67)即可用于网络启动

三、适用场景

  • 开发板 / 嵌入式设备调试:开发板插上网线自动拿 IP,不用每块板子接串口配地址,批量上电测试尤其省事。
  • IP 摄像头、IoT 设备接入:摄像头出厂默认 DHCP,测试网里没有 DHCP 服务器就扫不到设备,拿这个工具临时顶一下。
  • 交换机 / 网络设备初始配置:不少交换机首次启动通过 DHCP 获取管理地址,测试环境里用它来发现和管理设备。
  • PXE 网络启动装机:配合 TFTP 服务器做批量裸机装机,填好 option 66/67 就能用。
  • 临时测试网络:展会、实验室、客户现场等没有固定 DHCP 的场合,笔记本一台就能撑起整个测试网的地址分配。
  • 不适合的场景:生产网络、办公网络等需要长期稳定 DHCP 的场合——这个工具面向测试/实验网络,没有鉴权、没有高可用,不要接入生产网络与正式 DHCP 服务混用。

四、环境要求与快速开始

两种用法二选一,推荐直接用 exe:

方式要求启动方法
直接用 exe(推荐)Windows 7 及以上,无需安装任何东西双击「便携DHCP服务器.exe」
源码方式Python 3.10+(仅用标准库,无第三方包),安装时勾选 Add python.exe to PATH双击「启动DHCP服务器.bat」
# 快速开始(5 步)
# 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

首次运行如果 Windows SmartScreen 提示“已保护你的电脑”,点「更多信息」→「仍要运行」即可——自打包程序没有代码签名,出现这个提示是正常现象。配置与租约文件保存在 exe 同一目录,拷贝 exe 时把同目录的 dhcp_config.json 和 dhcp_leases.json 一并拷贝,就能保留配置和租约记录。

五、首次使用必看:防火墙放行 UDP 67

这是新手最容易卡住的地方,单独列一节:客户端的 DHCP 请求是发往本机 UDP 67 的入站流量,默认会被 Windows 防火墙拦截。症状是服务明明启动了,客户端却永远拿不到地址。正确做法:

  • 右键「启动DHCP服务器.bat」→「以管理员身份运行」(exe 方式也建议右键以管理员身份运行一次);
  • 在程序里点击「防火墙放行 UDP 67」(会弹窗确认);
  • 之后日常使用无需再管,也可以随时点「移除放行」撤销。

对应的手动命令(管理员身份运行 cmd 或 PowerShell):

# 放行 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"

# 检查规则是否已存在
netsh advfirewall firewall show rule name="PortableDhcpServer-UDP67"

六、三大管理界面详解

6.1 客户端列表

顶部搜索框可按 IP、MAC、主机名、备注实时过滤;状态下拉可只看“已分配 / 预分配 / 已过期”。选中任意行,下方详情栏显示该客户端的完整信息;右键弹出快捷菜单(复制、解除租约、设为保留地址),双击 MAC 可以直接复制到剪贴板——排障时要把 MAC 贴到文档里,这个小功能很顺手。

6.2 租约管理

列表工具栏提供「解除选中租约」「清空过期租约」「清空全部租约」,操作前都有确认弹窗。解除租约后,该设备下次续租会被拒绝并重新申请地址。租约到期会自动回收;同一设备再次申请时尽量保持原 IP(租约文件里有记录);停止服务时租约会保存到磁盘,下次启动接着用。

6.3 保留地址(MAC → IP)

点「新增保留地址」,填 MAC、固定 IP、备注和可选的独立租约时长,立即生效、无需重启服务。「在线状态」列实时显示该设备是否在线。在客户端列表中选中某行点「设为保留地址」,可以把当前分配的 IP 直接固定给该设备,省去手抄 MAC 的步骤。保留地址支持导入/导出 CSV,方便批量维护几十上百条固定绑定。

七、地址池与分配规则

地址池填起始和结束地址,程序在范围内按顺序分配。分配时有三层保护:第一,自动跳过网关地址、本机 IP、网络号、广播地址,这些地址永远不会分出去;第二,分配前先 Ping 候选地址,如果已经被占用就跳过;第三,曾经被客户端 DECLINE(拒绝)过的地址会记入冲突名单,不再分配。这三层保护加在一起,基本杜绝了“两个设备拿到同一个 IP”的情况。

地址池的规划建议:池子大小至少是设备数量的 1.5 倍,留出余量给临时设备;网关、服务器、打印机这些固定设备不要放进池子里,单独做保留地址;租约时长按场景定——测试设备频繁上下线,租期设短一点(比如 1 小时)回收更快;长期在线的设备可以设长一点,减少续租广播。

八、PXE 网络启动配置

要做 PXE 批量装机,除了 DHCP 分配地址,还需要告诉客户端去哪里下载启动文件。程序里填两个选项就行:TFTP 服务器地址(option 66)和启动文件名(option 67),客户端拿到 IP 的同时也会拿到这两个参数,然后去 TFTP 服务器下载启动镜像。TFTP 服务器本身需要另外准备(比如 Windows 上的 Tftpd64,或 Linux 上的 tftpd-hpa),本工具只负责 DHCP 这一环。

# PXE 场景示例配置(在界面里填写)
# 地址池:192.168.10.100 ~ 192.168.10.200
# 网关:192.168.10.1
# TFTP 服务器 (option 66):192.168.10.10
# 启动文件名 (option 67):pxelinux.0
# 客户端启动时选择网络启动(PXE boot),即可从 TFTP 拉取启动文件

九、完整示例:给一批开发板分配 IP 并固定地址

假设场景:实验室新到 5 块开发板,接在独立交换机上,网段 192.168.10.0/24,电脑网卡 IP 是 192.168.10.10,要让开发板自动拿 IP,并把其中一块主控板固定到 .50:

# 1. 电脑网卡配静态 IP 192.168.10.10/24,接进测试交换机
#    (图形界面配,或管理员 cmd)
netsh interface ip set address "以太网" static 192.168.10.10 255.255.255.0 192.168.10.1

# 2. 双击 exe,确认服务网卡 IP 显示为 192.168.10.10
#    地址池填 192.168.10.100 ~ 192.168.10.200,网关填 192.168.10.1
#    点「防火墙放行 UDP 67」,再点「▶ 启动服务」

# 3. 开发板上电,设为自动获取 IP
#    在客户端列表里应能看到 5 块板子陆续拿到 .100 ~ .104

# 4. 把主控板固定到 .50:选中它那行 → 右键 →「设为保留地址」
#    或在保留地址页新增:MAC 填板子的 MAC,固定 IP 填 192.168.10.50
#    保留立即生效,主控板下次续租就会拿到 .50

# 5. 导出一份台账备查
#    客户端列表 → 导出 CSV;保留地址 → 导出 CSV

# 6. 收工时点「■ 停止服务」,租约自动保存到 dhcp_leases.json
#    下次再用时直接启动,之前的分配记录还在

十、常见问题

现象可能原因处理方法
启动失败:端口被占用(10013/10048)系统开了「Internet 连接共享 / 移动热点」,其内置 DHCP 占了 UDP 67管理员运行 net stop SharedAccess 关闭,或 netstat -ano -p udp | findstr :67 查占用进程
客户端拿不到 IP防火墙没放行 UDP 67按第五节放行 UDP 67 入站
客户端拿不到 IP设备和电脑不在同一个二层网络DHCP 依赖广播,不能跨路由器/跨 VPN,确认在同一交换机或同一 Wi-Fi
客户端拿不到 IP地址池与网卡 IP 不在同一网段地址池必须与服务网卡 IP 同网段,改池子或改网卡 IP
多网卡电脑行为异常插着 VPN 或虚拟网卡,服务网卡选错了服务监听所有网卡的 UDP 67,但下发的网关/子网参数由「服务网卡 IP」决定,选对接测试网的那块网卡
和路由器 DHCP 冲突同一网段有两个 DHCP 服务器关掉路由器 DHCP,或把电脑接到独立交换机做纯测试网
窗口一闪而过启动时报错退出在命令行手动运行 python dhcp_server_app.py 看报错信息

十一、重新打包 exe(可选)

当前发布的 便携DHCP服务器.exe 已经打包完成,一般不需要自己打包。只有改了源码(比如改默认端口、改界面文字)才需要重新打包。打包用 PyInstaller,在独立的虚拟环境里做,避免污染系统 Python:

# 在 Windows 上重新打包(cmd 或 PowerShell)
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 可单独拷贝使用
# 注意:--windowed 表示不带控制台窗口,打包后想看报错要去掉 --windowed 重新打包,
# 或者直接用 python dhcp_server_app.py 源码方式运行看报错

十二、使用须知与安全提醒

  • 仅用于测试/实验网络:请勿接入生产网络与正式 DHCP 服务混用,同一网段两个 DHCP 服务器会让客户端随机拿到其中一个的地址。
  • DHCP 基于 UDP 广播:仅适用于与电脑同一物理网段的设备,跨路由器、跨 VPN 都拿不到地址。
  • 程序不做鉴权:同一网段内任何设备都能申请到地址,注意使用场景,不要在不可信的网络里长期开着。
  • 用完即停:测试结束点停止服务,租约会自动保存;下次要用再启动,配置和租约都在。
  • 配置文件随 exe 走:dhcp_config.json 和 dhcp_leases.json 保存在 exe 同一目录,拷贝 exe 时一并拷贝;dhcp_leases.json 可以删除,删除后重新分配。

总结:便携 DHCP 服务器解决的是一个很具体的小问题——测试网里没有 DHCP 时,拿一台 Windows 笔记本就能临时顶上去。它不追求功能大而全,而是把“双击即用、图形管理、租约保留、PXE 支持”这几件事做扎实。对于经常和开发板、摄像头、裸机打交道的工程师来说,硬盘里常备这样一个 exe,关键时刻能省下不少折腾。

发表回复

后才能评论