Windows下轻量DHCP服务器部署指南:从DORA流程到地址池管理
简介面向小型局域网运维人员与网络学习者的 Windows 平台 DHCP 服务端工具包。核心价值在于解决手工配置 IP 地址繁琐、易冲突的问题动态分配地址的同时还支持 TFTP、DNS 与 HTTP 协议可配合远程引导、无人值守安装、实验教学等场景使用。压缩包共 9 个文件以 exe 主程序与配置向导为核心配合 HTML 页面和 xsl 样式表构成本地管理界面另有 readme 说明文档、ico 图标及 JPG 图片素材整体仅 101KB无需复杂安装即可运行。已有 392 人学习浏览。借助向导可快速创建 IP 作用域和租约规则通过网页端直观查看分配状态内置 TFTP/HTTP 支持还可为无盘启动提供资源下发能力帮助读者完整走通从地址分配到网络引导的流程。对于想掌握 DHCP 配置细节或快速搭建轻量级网络启动环境的读者这是一份低门槛、可直接上手验证的实用工具包。1. DHCP Server for Windows V2.3路由器停了之后我用一台Windows电脑把整个网段顶了起来某公司小办公网的路由器在固件升级后彻底不再分配地址三十几台机器全部停在“正在获取IP地址”。换设备要等采购最快的方式是找一台还能用的Windows电脑把一个轻量DHCP服务临时顶上去。这就是DHCP Server for Windows 这类工具存在的意义V2.3是我在实验网和临时网络里用得较多的一个版本。它只是一个负责地址分配的Windows进程不依赖Windows Server角色用文本文件维护配置监听UDP 67端口对本地网段的客户端完成发现、提供、请求、确认这四步交互。它能解决应急顶班、设备联调、隔离测试网段这类“需要一个DHCP但又不想架一台服务器”的场景。适合运维、嵌入式调试和搭实验网的人不适合有多VLAN、需要中继、需要审计的正式生产网络。2. 先看协议再看工具V2.3只做DORA四步里的哪些事轻量DHCP工具最容易让人误解的地方是大家默认“它和路由器里的DHCP一样能干所有事”。实际上协议边界决定了它能做什么、不能做什么。先把DORA和租约生命周期讲清楚后面配置和排障才不会靠猜。2.1 DORA四步与租约生命周期V2.3在UDP 67端口上等什么DHCP客户端开机后因为自己还没有IP会从0.0.0.0:68向255.255.255.255:67发一个广播的DHCP Discover。这个广播只能在当前二层广播域内传播路由器默认不转发它除非专门配置了DHCP中继。服务端收到Discover后从地址池里挑一个可用IP回一个Offer携带网关Option 3、DNSOption 6、租期Option 51等参数。客户端可能收到多个Offer它选一个再广播一次DHCP Request表明“我选这个”。服务端确认无误后回Ack租约生效。租约不是一次性的。客户端会在租期过半时用单播方式向服务端发起续租大约到87.5%还没续上就退回广播重绑定。所以租期设多长直接影响DHCP流量大小和地址回收速度。V2.3这类工具在协议层面的职责就这么几件监听UDP 67、维护地址池、应答Discover和Request、写入租约、按静态绑定表分配固定IP。它不做企业级DHCP的几件事不做跨VLAN的中继那是路由器或单独中继服务的活、不做动态DNS更新、不做分配前的主动冲突探测。很多轻量工具出于实现简单不先ping再分配冲突检测依赖客户端自己发免费ARP感知。这意味着如果网段里存在另一台DHCP服务器两边不会协调后文常见的“两台DHCP打架”就是这样来的。2.2 三种DHCP方案的选型对比路由器的池、Windows角色、轻量工具各管什么部署DHCP常见路径有三条用家用级路由器/交换机的内置DHCP、启用Windows Server自带的DHCP角色、或者在普通Windows机器上跑V2.3这类轻量工具。选型不是谁新谁好是看网络规模和故障时谁最容易接手。对比项Windows Server DHCP角色路由器/交换机内置DHCPV2.3这类轻量Windows工具部署成本要一台Server、开角色、授权界面点几下就有拷贝文件、改配置、跑一个进程管理界面MMC控制台功能全网页条目有限文本配置控制台日志租约可视化控制台看得很细大多只能看在线用户控制台与租约文件可查静态绑定按MAC预留支持批量一般只有个位数条目配置文件里按行加支持批量跨VLAN中继支持配合中继能跨网段部分支持不支持只服务本地广播域资源占用高一台系统级服务零额外成本一个进程几十MB以内适合场景域环境、多VLAN、要审计家庭、小型办公实验室、临时网段、IoT联调我一般这样选网络里有域控或者需要租约审计直接上Windows DHCP角色网络就是一台路由器管着的小办公网内置DHCP足够只有当“这台Windows机器是现场唯一的可用设备”或者“这个网段是隔离测试网段”时才把V2.3拉出来。它最适合的是让一个网段快速拥有地址分配能力而不是去补企业DHCP的位。2.3 网络前提与边界什么环境能上什么环境别指望它用V2.3之前先拿这张前提清单过一遍缺一条后面都是坑。第一运行工具的那台Windows机器必须配置静态IP这个IP通常就是该网段的一个合理地址工具要在这个IP上代表整个网段响应请求。第二客户端必须和这台机器在同一个二层广播域中间有路由器隔离但没有配DHCP中继的工具永远收不到Discover。第三这个广播域里只能有一个活跃的DHCP服务路由器内置DHCP没关就启动V2.3等于自己给自己埋雷。第四Windows客户端机器上那个“DHCP Client”服务微软叫DHCP Client负责向服务器要地址的客户端组件不能随手禁用很多优化教程让你禁它省资源禁了之后机器只会一直卡在获取IP。边界也要认清。别在一个/16大网段里跑它轻量工具没有复杂的分布式地址管理租约文件线性增长异常时排查成本很高。别指望它做合规级审计日志是文本级没有权限模型。也别在有强制合规要求或者对外开放的网络里用DHCP本身没有认证机制任何人都能广播请求拿到地址这是协议特性不是工具缺陷。3. 把V2.3跑起来静态IP、防火墙、最小配置与开机自启部署一台V2.3核心动作就三块先把Windows这台机器的网络环境准备好再写一份最小配置文件最后决定是前台跑还是注册成服务。我建议第一次使用一定先前台跑一遍日志看得见出了问题能当场判断是配置错还是环境错。3.1 部署前三件事给网卡固定IP、放行UDP 67、选对监听网卡工具运行的那台机器自己必须先有固定IP。它自己如果也是DHCP动态获取会出现一个循环它要等别人给它地址它又要给别人发地址网卡状态都稳定不了。配置静态IP我习惯用netsh比图形界面快且能写进脚本备份netsh interface ip set address name以太网 static 192.168.1.10 255.255.255.0 192.168.1.1 netsh interface ip set dns name以太网 static 192.168.1.1第一行把网卡“以太网”设为静态地址192.168.1.10掩码255.255.255.0网关192.168.1.1第二行指定DNS。注意name参数必须和ipconfig里看到的连接名完全一致中文系统里常见“以太网”“WLAN”改了连接名就失效。如果这台机器同时有线和无线都在用建议把不参与服务的网卡先禁掉避免工具监听范围失控。防火墙是第一个“看不见的拦路虎”。DHCP服务端要收客户端的广播请求必须放行UDP入站67端口netsh advfirewall firewall add rule nameLocalDHCPSrv UDP67 dirin protocolUDP localport67 actionallow这条命令在防火墙里新建一条入站规则协议UDP本地端口67允许通过。客户端回包走UDP 68正常出站方向默认放行一般不用管。但如果你这台机器处于“公用网络”这类严格配置文件下建议规则按配置文件都启用省得换个网络位置防火墙行为就变。验证规则是否生效用netsh advfirewall firewall show rule nameLocalDHCPSrv UDP67查看。最后是网卡选择。ipconfig /all看这台机器上有几张活跃网卡带Hyper-V虚拟交换机、VMware虚拟网卡的机器尤其要小心。虚拟网卡默认不参与外部物理广播域工具即使在里面监听也收不到真实客户端的Discover白忙一场。我一般在配置里显式指定物理网卡对应的IP或接口名而不是依赖“第一块网卡”这种默认行为。3.2 最小配置文件地址池、掩码、网关、DNS与租期怎么填V2.3的配置是文本文件常见格式是ini风格的分节键值对。不同构建对键名定义不完全一致我的习惯是先把随包示例配置原样跑通再改成自己的网段绝不直接凭记忆写键名。一份最小配置通常长这样[network] interface以太网 bind192.168.1.10 start192.168.1.100 end192.168.1.199 mask255.255.255.0 gateway192.168.1.1 dns192.168.1.1,223.5.5.5 lease7200逐项解释interface指定监听网卡的连接名防止多网卡时听错口子bind是工具声明自己用的地址就是这台机器刚才设的静态IP有些版本叫server-ip或local-ipstart和end定义了动态地址池的起止范围这个范围必须落在mask对应的子网内mask子网掩码要和网卡一致gateway是下发给客户端的默认网关ip地址可以不在池子里但必须是可达的dns是下发给客户端的域名服务器多个用逗号分隔lease以秒为单位7200就是2小时。租期字段有些版本写成lease-time或default-lease-time注意看示例。配置文件的存放位置和编码是个容易被忽略的坑。中文Windows下如果界面是中文连接名“以太网”是中文文件编码必须是ANSI或带BOM的UTF-8否则工具读出来是乱码接口匹配失败。我一般把配置和程序放在同一个目录比如C:\tools\dhcpsrv避免放在Program Files那种带权限保护的位置后面写租约文件会省很多麻烦。3.3 前台启动与日志观察从OFFER到ACK一条分配记录能看出什么第一次运行不要注册服务直接控制台起。常见启动形式是命令行后跟配置路径cd C:\tools\dhcpsrv DHCPSrv.exe -c dhcpsrv.ini-c指定配置文件路径是这类工具里比较常见的参数写法具体以你下载版本自己带的帮助说明为准有的版本默认读取同目录配置文件不需要参数。前台运行的好处是日志实时刷屏客户端发来Discover日志出现一条DHCPDISCOVER记录包含客户端MAC和到达接口工具回Offer出现DHCPOFFER和分配的IP客户端确认后出现DHCPREQUEST和DHCPACK到这里就是一次完整分配。如果池子满了或者静态绑定不匹配会出现DHCPNAK这条记录非常关键客户端的表现是持续“正在获取IP”。日志观察的要点是分层判断。如果服务端日志里根本没有DHCPDISCOVER说明请求根本没到工具这里问题在网络链路、防火墙或者监听网卡而不是配置如果看到DISCOVER但没有OUT OFFER常见是地址池耗尽或者start/end写错如果REQUEST之后回了NAK多半是绑定表或租约状态出了问题。客户端侧的验证命令是ipconfig /release ipconfig /renew ipconfig /allrelease释放当前地址renew重新走一遍DORAipconfig /all重点看“DHCP服务器”这一项它显示的是Offer里携带的服务器标识也就是猫咪的服务器IP能直接判断响应来自哪台机器。3.4 用sc命令把V2.3注册成Windows服务并做失败重启实验网可以前台跑真正要顶班用的网络机器一重启没人手动开进程肯定不行。把V2.3注册成Windows服务的做法是用系统自带的sc命令不需要额外装工具sc create LocalDHCPSrv binPath C:\tools\dhcpsrv\DHCPSrv.exe -c C:\tools\dhcpsrv\dhcpsrv.ini start delayed-auto DisplayName Local DHCP Server V2.3 sc failure LocalDHCPSrv reset 86400 actions restart/5000/restart/10000/restart/30000 sc start LocalDHCPSrv第一条命令创建服务binPath里的内容是要执行的完整命令行注意sc要求等号后面有一个空格这是它最容易报语法错的地方。startdelayed-auto让服务延迟启动给网卡和网络栈就绪留时间避免开机瞬间网卡还没起来工具就绑定失败。第二条设置失败后的恢复策略86400秒内如果服务异常退出依次等待5秒、10秒、30秒后自动重启这个配置能让工具在崩溃后自己活过来。第三条立即启动。sc创建的服务默认以LocalSystem身份运行运行目录不是程序所在目录所以配置路径必须写绝对路径程序里的相对路径会失效。另外服务跑在Session 0隔离会话里你在桌面看不到工具的窗口和日志日志只能看它写入的文件。这意味着你要确保数据目录对LocalSystem可写C:\tools\dhcpsrv这种目录没问题Program Files反而会因为权限问题写不进租约文件。注册服务后用sc query LocalDHCPSrv查看状态确认是RUNNING再让客户端去续租。4. 把地址池管细排除段、静态绑定与租约文件清理能分配地址只是及格线。一个网段里总有打印机、门禁控制器、IoT网关这类需要固定IP的设备也有池子慢慢被占满的问题。这一章把地址池规划、静态绑定和租约文件维护讲透。4.1 地址池规划参数IP段划分、排除范围与租期时长怎么定规划C类地址段我习惯把网段切成四块而不是只写一个start和end。以192.168.1.0/24为例范围用途是否参与动态分配.1 - .49网关、交换机、打印机等手工配置设备否.50 - .99预留扩展防止规模增长否.100 - .199动态地址池是.200 - .249静态绑定区否按MAC固定分配.250 - .254保留否动态池越小租约文件越小异常时越好查。如果工具只有start和end两个字段没有排除段字段那网关、交换机这些设备就不要出现在start到end的范围内一旦手工配置的设备地址落进动态池冲突只是时间问题。租期参数按场景选场景建议租期原因实验/联调网段600秒设备频繁插拔短租期快速回收地址WiFi密集办公7200秒2小时移动设备多续租频繁反而浪费2小时平衡固定办公桌面86400秒1天桌面机变动少减少DHCP广播流量嵌入式/IoT设备259200秒3天减少设备重启后的请求次数但翻车后问题也隐藏得久租期不是越长越好。客户端在50%时单播续租87.5%还没续上才广播重绑定租期设7天意味着一个MAC被释放后它的地址最多要等好几天才能重新回到池子这在测试环境里几乎是灾难。我管理实验网的经验是宁可多承担一点续租流量也要让地址回收速度跟得上设备变动速度。4.2 MAC静态绑定给打印机、门禁和IoT设备写固定IP静态绑定就是把某个MAC和某个IP在配置里写成固定关系客户端请求时工具直接分配这个IP不占动态池。V2.3这类工具的写法通常是在配置里加一行绑定条目static00:1E:06:2A:BB:CC,192.168.1.200 staticAC:9E:17:11:22:33,192.168.1.201每条记录由MAC和IP组成分隔符常见是逗号键名有的版本叫static有的叫reservation或fixed同样以示例配置为准。MAC格式要统一冒号分隔、字母小写。Windows下查设备MAC用getmac /v注意同一台电脑如果有线和无线都启用会有两个MAC绑定时要确认设备实际走的是哪个网卡。静态绑定有两个隐藏坑。第一手机如果开了“随机MAC”或“隐私MAC”功能每次连接WiFi都可能换MAC绑定会间歇性失效表现为设备有时拿到固定IP有时拿到动态IP这种情况需要去设备端关掉随机MAC。第二绑定的IP最好落在动态池之外。有一部分工具在地址池里看到已被静态绑定的IP会自动跳过但也有实现不做这个检查结果就是同一个IP既被静态占用又进了动态池分配时自己撞自己。4.3 租约文件读取与清理什么时候能动什么时候不能动轻量DHCP工具通常有一个租约文件来记录当前已分配的MAC、IP、过期时间和主机名每个版本字段顺序不太一样我拿到一份新工具的习惯是先打开租约文件看前几行确认字段含义再写任何解析脚本。租约文件的价值在于它能告诉你哪些地址还“活着”哪些已经过期也能帮你判断池子剩余空间。清理租约文件是最容易翻车的操作。常见错误是直接把租约文件删掉以为这样能重置地址池结果恰恰相反客户端手里还持有旧地址工具却失去了这些地址的记录后续分配的IP就可能和别人冲突。正确的清理纪律是把租期临时调短例如改成600秒等一个租期周期让所有客户端走完续租和释放确认网段里已经没有需要保留的连接后停掉服务备份租约文件再动手清理过期条目。千万别在服务运行期间热删租约文件很多工具不会自动重建完整状态。文件权限和杀毒软件也要提前处理。租约文件需要写入如果程序放在Program FilesUAC和权限保护会让写操作被静默拦截表现是“工具能启动但租约始终为空”。杀毒软件对这类监听端口的工具也可能误报并拦截文件写入把整个工具目录加入排除项能省掉半夜被叫醒的麻烦。5. 避坑清单V2.3上线后最常见的5个翻车现场这个工具本身逻辑简单上线后的大部分问题不在程序而在环境和操作习惯。以下5个坑是我在实验网和临时顶班网络里反复见到的每条按现象、原因、解决写清楚可以直接当排查手册用。5.1 客户端一直停在“正在获取IP地址”服务端却显示没收到请求现象客户端ipconfig /renew后长时间停在获取中服务端日志一条DISCOVER都没有。原因请求根本没到达工具。最常见的是防火墙拦了UDP 67或者工具监听在错误的网卡上。还有一种情况是这台Windows机器本身启用了网络共享ICSICS强行占用了67端口工具启动时报错或静默失败。解决先看端口占用netstat -ano | findstr :67看UDP 67是不是被工具进程占用如果被其他进程占用先停掉ICS服务。再确认防火墙规则存在且已启用netsh advfirewall firewall show rule nameLocalDHCPSrv UDP67。最后确认工具配置里的interface和bind指向物理网卡虚拟网卡上监听是收不到外部请求的。5.2 一开服务就报IP冲突排查流程翻车在“没想到第二个DHCP”现象服务启动后陆续有客户端弹出“IP地址冲突”提示或者部分设备能上网、部分不能行为随机。原因广播域里存在第二个DHCP服务。常见的是路由器内置DHCP没关、同事临时接了一台家用无线路由器当交换机用、或者某台测试服务器上也跑着别的DHCP工具。V2.3不会和别的DHCP服务协调两边同时应答客户端选到谁就是谁。解决在客户端上ipconfig /all看“DHCP服务器”字段这个字段来自Offer里的服务器标识直接显示到底是谁回了包。确认是路由器的话进路由器管理页关闭DHCP确认是无线路由器的话把它接在LAN口并关掉其DHCP或者干脆拔掉。想看得更清楚用抓包工具过滤bootp协议能看到同一广播域里所有DHCP Offer的来源IP。这个坑的教训是启动任何新DHCP服务前先扫描一遍广播域里已有的DHCP服务扫描比排查便宜得多。5.3 客户端拿到的地址和你配置的池子完全不是一回事现象配置里写的池是192.168.1.100到192.168.1.199客户端却拿到了192.168.137.x之类的地址。原因两个常见来源。一是Windows的Internet连接共享ICS被意外开启它会自动在另一个网卡上创建一个192.168.137.0/24的DHCP服务二是工具绑定到了多张网卡其中一张连着其他网段请求被错误响应。解决先看服务状态和网卡services.msc里找到Internet Connection Sharing服务确认它是禁用状态再检查工具配置里的interface是否明确指定了目标网卡。192.168.137.x这个网段几乎是ICS的指纹地址看到它基本可以断定是ICS在作怪。这类问题最好的预防手段就是配置里永远写死interface和bind不给工具自己做选择的余地。5.4 重启之后配置和租约“全部丢失”原来是工作目录和权限在作怪现象Windows重启后服务启动了但客户端拿不到地址打开配置文件发现里面是默认内容或者租约文件是空的。原因sc注册服务时服务的当前工作目录不是你放配置文件的目录而是系统目录。如果工具按相对路径找配置就会找到不存在或默认的文件如果数据目录不可写租约文件创建失败。杀毒软件把工具目录隔离或者拦截写入也会出现类似表现。解决配置文件路径、日志路径、租约文件路径全部用绝对路径目录统一放在C:\tools\dhcpsrv这种无权限保护的位置。检查目录ACL确认LocalSystem账号对该目录有读写权限。再确认杀毒软件没有隔离程序文件把整个目录加入排除项。处理后重启服务打开租约文件确认有新写入内容再让客户端续租。5.5 注册成服务后反而不干活了会话隔离和网卡顺序的坑现象前台运行一切正常注册成服务后客户端就是收不到地址sc query显示服务是RUNNING但日志文件没有新内容。原因服务运行在Session 0和桌面是隔离的这不是问题本身真正的问题是工具如果在配置里没有指定接口注册成服务后它枚举网卡的顺序可能会变网卡驱动加载顺序不一样服务启动时选中的网卡和前台运行时不是同一张。另一个可能是网卡在开机时还没就绪服务却已经开始监听了。解决配置里必须显式绑定接口名或IP这一步能解决绝大多数服务模式异常。服务启动方式用delayed-auto给网络栈留出时间。如果你发现服务启动时网卡没就绪还可以用sc failure加重启策略工具起失败后自动重启通常第二次启动时网卡已经就绪。最后确认这台机器自己的网卡是静态IP如果它自己也走DHCP会出现服务端和客户端角色在同一张网卡上打架的诡异现象。6. 给V2.3配一个看门脚本用PowerShell盯着租约文件做地址池预警V2.3的日志是文本不会主动通知你“池子快满了”。实验网里最典型的无声事故是新设备接入时拿不到地址用户反复重启也没用最后查下来是地址池满了好几天。一个几十行的PowerShell脚本就能解决读取租约文件和配置文件按阈值预警。$iniPath C:\tools\dhcpsrv\dhcpsrv.ini $leasePath C:\tools\dhcpsrv\dhcpsrv.leases $poolLimit 100 $threshold 0.8 $startLine (Select-String -Path $iniPath -Pattern ^start).Line $endLine (Select-String -Path $iniPath -Pattern ^end).Line $startIP [int]($startLine.Split()[1].Split(.)[3]) $endIP [int]($endLine.Split()[1].Split(.)[3]) $poolTotal $endIP - $startIP 1 $activeLeases 0 Get-Content $leasePath | ForEach-Object { if ($_ -match ^\d{9,15}\s([0-9A-Fa-f:]{17})\s(\d\.\d\.\d\.\d)) { $activeLeases } } $warningLine [int]($poolTotal * $threshold) if ($activeLeases -ge $warningLine -or $activeLeases -ge ($poolLimit * 0.9)) { Write-EventLog -LogName Application -Source LocalDHCPSrvWatch -EntryType Warning -EventId 1001 -Message DHCP池已使用 $activeLeases / $poolTotal请检查租期和新增设备。 }脚本逻辑是先从配置里读start和end取第四段octet算出池子总量再逐行读租约文件用正则匹配形如“时间戳 MAC IP”的记录统计活跃租约数当使用量达到池子总量的80%时写入一条Windows事件日志。关于正则租约文件的字段顺序不同版本不一样这是我前面强调先看租约文件前几行的原因格式不匹配时把正则里的字段顺序调整一下即可。脚本的池子大小也可以直接用配置文件里解析出的总量这样调整配置后不需要改脚本。配合计划任务每小时跑一次schtasks /create /tn WatchLocalDHCPSrv /tr powershell -ExecutionPolicy Bypass -File C:\tools\dhcpsrv\watch.ps1 /sc hourly /ru SYSTEM这条命令创建每小时执行一次的计划任务以系统身份运行不需要登录桌面。事件日志里出现警告后就可以提前去扩池子、缩租期或者排查是谁占着地址不释放而不是等现场用户来喊。这套“配置租约监控”的组合在我手里已经用了很久。我现在每次给某个网段部署完这类轻量DHCP工具必做的最后一件事是抓一次完整的DORA确认从Discover到Ack四条记录齐全然后把配置文件和监控脚本一起放进版本库。工具可以临时顶班流程不能临时。这个习惯帮我避开了无数次“看着像好了但第二天就翻车”的尴尬希望帮到你。本文还有配套的精品资源点击获取