首页 / 资讯中心 / 文章详情

Linux下DHCP服务器搭建实战:地址池规划与dhcpd.conf配置详解

Linux下DHCP服务器搭建实战:地址池规划与dhcpd.conf配置详解 ★ FEATURED ARTICLE
1. DHCP在局域网里到底干了什么活自打开始在Linux上折腾DHCP服务你就得先想明白一个问题你公司的员工/家人/室友手里的设备为什么插上网线或者连上Wi-Fi不用填任何IP地址就能直接上网背后就是DHCP在干活。DHCP全称Dynamic Host Configuration Protocol动态主机配置协议它干的事通俗点说就是局域网里的“分房专员”。每个设备接入网络时自动申请一个IP、子网掩码、网关、DNS用完了还回收再分配。以前很多人碰到要上网的设备多了手动配IP配到崩溃笔记本、手机、打印机、IP电话、考勤机、访客设备……每个都得单独设。更烦的是手动配置容易冲突A设备占用了B设备已经写死的IP排查起来恨不得把网线拔光。这个时候在Linux服务器上搭一个DHCP服务一次配置全网设备自动获取省心程度直接拉满。这篇内容适合谁看两类人一是公司/工作室的运维或准运维管着一个几十到几百台设备的局域网想自己掌控地址分配二是在家里或者实验室折腾软路由、NAS、树莓派的朋友希望把地址分配权从家用路由器手里夺过来做得更细、更可控。不管你是CentOS系的还是Debian/Ubuntu系底层逻辑完全一致把原理吃透换个发行版就是换几个包名和路径的事。2. 动手之前先把网络规划和分配逻辑盘清楚2.1 服务器选型与基础要求搭DHCP服务对硬件近乎没有要求。我见过有人用一台跑了好几年的旧笔记本装个精简版Linux跑着DHCP外加DNS缓存带一整个办公区两百来台设备稳得一批。只要这台机器系统稳定、网卡在线、常年不关机就行。虚拟机也行但务必确认虚拟网卡工作正常并且广播能通到目标网段。系统选择上Debian/Ubuntu系用isc-dhcp-server这个包CentOS/RHEL 7系是老牌dhcp包CentOS 8/Rocky/RHEL 8及以上用dhcp-server。包名略有不同但配置文件都是同一个名字/etc/dhcp/dhcpd.conf。这一点非常关键你换系统不换配置逻辑软件包安装方式虽然不同但核心的配置语法通用。2.2 地址池规划应该在装系统之前就做完我见过太多人服务装好了才开始想IP怎么分结果网关、服务器、保留地址、自动分配地址全挤在一个小段里乱成一锅粥。规划这件事必须在装DHCP之前完成。举一个最常见的办公局域网场景IP段192.168.10.0/24网关是192.168.10.1DNS服务器在192.168.10.2。我的建议是这么切用途地址范围说明固定设备区192.168.10.1 - 192.168.10.50网关、服务器、交换机管理IP、打印机、IP话机等全用手动/保留分配动态分配池192.168.10.100 - 192.168.10.200DHCP自动分配的范围100个地址预留扩展区192.168.10.201 - 192.168.10.250留着以后加设备或者做临时保留这里的核心思路是动态池和固定设备严格分开中间留出缓冲带。为什么留缓冲带因为一旦动态池蹭到了固定设备的段里哪天新设备拿走了打印机留着的地址你就要跟打印机“抢地址”了。中间那50个地址的缓冲就是给你的手工配置机器一个安全区。2.3 地址池大小怎么算别一拍脑袋就定地址池大小要结合设备实际规模来算。假设办公室里同时在线的手机、笔记本、电视、门禁加起来总共80台你给它分配120个地址的池子够用还能留余量。如果是访客网络和办公网络分开访客池可以小一点比如30个地址因为访客设备流动性大租约时间短地址回收快。租约时间的设定也直接影响地址池够不够用。租约时间短比如10分钟一个地址可以在一小时内服务多批访客租约时间长比如8小时同一时间段的地址占用就会更持久。所以如果池子小、设备多就适当缩短默认租约时间池子宽裕就可以放长一点减少DHCP交互频率。3. dhcpd.conf配置逐段拆解每个参数背后都有讲究3.1 全局参数租约时间和权威声明配置文件的核心是/etc/dhcp/dhcpd.conf默认不存在一整个完整可用的配置你需要自己从头写。打开文件前先备份一份原始的这是好习惯。我先说全局段default-lease-time 600; max-lease-time 7200; authoritative;default-lease-time的意思是客户端如果没有特殊要求默认租约600秒10分钟。max-lease-time是客户端要求延长时能拿到的最大租约7200秒2小时。有人说办公网10分钟太短了客户端每隔十分钟就要续约一次会增加网络里的广播流量。其实这个担心多余——DHCP续约是单播只有重绑定时才广播流量小到可以忽略。authoritative这一行特别容易被新手忽略但它是排障利器。加上它之后DHCP服务器会明确告诉客户端“我就是这个网段合法的地址分配者”当客户端上报一个自己配的地址、但服务器不认同时服务器会直接回应DHCPNAK让客户端放弃手头地址重新申请。不加这行服务器面对地址冲突时的态度会比较“暧昧”可能不回应客户端就一直用自己的错误地址排查起来非常被动。3.2 subnet声明你的主网段全局参数下面就是核心的网段声明把新建的所有参数都放在花括号里subnet 192.168.10.0 netmask 255.255.255.0 { range 192.168.10.100 192.168.10.200; option routers 192.168.10.1; option subnet-mask 255.255.255.0; option domain-name-servers 192.168.10.2; option domain-name corp.local; }range定义了可动态分配的地址区间routers就是客户端要用的默认网关domain-name-servers指定DNS。注意这里的DNS既可以是内网DNS也可以直接丢给公共DNS。内网如果做了解析需求一定填内网DNS的地址如果没有内网DNS填公共DNS也能让客户端正常上网但你在内网写的那些主机名就全解析不了了。domain-name这个参数是给客户端发“域名后缀”的Windows设备加入域或者解析短主机名时用得上不需要就别写这行。3.3 保留地址给特定设备固定IP打印机、考勤机、门禁主机这种设备IP经常变会让IT崩溃。解决办法是保留地址reservation通过MAC地址把某个IP固定给某台设备host printer-01 { hardware ethernet 00:16:3E:41:2B:AF; fixed-address 192.168.10.20; }host后面的名字是给人看的随便起但别用中文和特殊符号。hardware ethernet后面写设备的MAC地址fixed-address写你要固定给它的IP。这样配置后这台打印机无论怎么重启、换网线拿到的永远是这个IP。需要说明的是保留地址和range地址池必须在同一个subnet块内。如果保留地址不在这个网段的range里客户端应答会出问题因为服务器会认为这个地址不该在这个网段使用。此外MAC地址一定要核对清楚别拿错一个字符不然这台设备死活拿不到指定IP。3.4 配置文件校验先试运行再启服务配置写完先别急着重启服务用下面的命令检查语法dhcpd -t -cf /etc/dhcp/dhcpd.conf没有输出就说明语法通过。继续用dhcpd -f -d -cf /etc/dhcp/dhcpd.conf这条命令会让DHCP服务在前台跑起来文件里每条配置加载情况都会清清楚楚地打在控制台里。确认无误后CtrlC退出再正式启动服务。4. 一次完整的搭建实录从安装到验证全流程4.1 安装软件包不同发行版的操作差异我在一台Debian 11的机器上实操过一遍完整流程这里以它为例。先更新软件源apt update apt install isc-dhcp-serverCentOS/RHEL系的命令是yum install dhcp-server # 老系统 dnf install dhcp-server # 新系统安装完成后Debian系会有一个/etc/default/isc-dhcp-server文件里面需要指定DHCP要监听的网卡接口。这台机器的网卡名是ens33Ubuntu 18.04的方式配置这样填INTERFACESv4ens33 INTERFACESv6这一步是新手最容易卡住的地方服务起来了但日志报错说“Not configured to listen on any interfaces!”就是因为你没指定监听网卡系统根本不知道要在哪个网卡上接收DHCP请求。4.2 配置一个真实可用的场景80人办公室假设场景办公室网络192.168.10.0/24网关192.168.10.1DNS服务器192.168.10.2打印机固定IP 192.168.10.20。设备总量约80台。完整配置如下default-lease-time 86400; max-lease-time 86400; authoritative; log-facility local7; subnet 192.168.10.0 netmask 255.255.255.0 { range 192.168.10.100 192.168.10.200; option routers 192.168.10.1; option subnet-mask 255.255.255.0; option domain-name-servers 192.168.10.2; option domain-name corp.local; host printer-01 { hardware ethernet 00:16:3E:41:2B:AF; fixed-address 192.168.10.20; } }默认租约我直接用86400秒24小时原因很简单固定办公网里设备相对稳定24小时租约意味着每天设备开机时续约一次交互很少还不会因为租约过期导致某些老物联网设备掉线重连。4.3 启动服务与开机自启配置保存后启动systemctl restart isc-dhcp-server systemctl enable isc-dhcp-server systemctl status isc-dhcp-server看到active (running)就是正常了。再用语法检查命令过一遍配置确保没有临时手动改动引入错误dhcpd -t -cf /etc/dhcp/dhcpd.conf这里插一句dhcpd -t只检查语法不检查IP段和路由配置对不对。所以实际操作中把服务器网线拔掉再插上、客户端release后重新获取才是验证配置是否合理的关键。4.4 客户端验证三个命令确认生效服务端配置完成后一定要拿到真实客户端上去验证。Linux客户端可以先释放再获取dhclient -r ens33 # 释放当前租约 dhclient ens33 # 重新获取 ip addr show ens33 # 查看IP是否拿到Windows客户端就是ipconfig /release再ipconfig /renew。拿到IP之后重点看三件事地址是不是落在192.168.10.100-200的池子里网关是不是192.168.10.1DNS是不是192.168.10.2。如果拿到了192.168.10.10这种非池内地址说明之前有旧租约缓存先清缓存再看。在服务器端看租约分配情况cat /var/lib/dhcp/dhcpd.leases这个文件每一行都记录着哪台设备MAC地址在什么时候拿到了哪个IP很直观。如果想看实时分配动态用journalctl -u isc-dhcp-server -f监听日志能看到DISCOVER/OFFER/REQUEST/ACK的完整流程。5. 进阶玩法多网段、中继和更细的地址分配策略5.1 多网段共用一台DHCP服务器大的办公室会划分多个VLAN每个VLAN一个网段。一台DHCP服务器能不能同时给多个网段分配IP能但前提是服务器得能收到对应网段的DHCP请求。DHCP报文用的是广播默认不会跨路由所以需要路由器或三层交换机开启DHCP中继ip helper-address / ip dhcp relay。服务器上做多个subnet声明即可subnet 192.168.10.0 netmask 255.255.255.0 { range 192.168.10.100 192.168.10.200; option routers 192.168.10.1; } subnet 192.168.20.0 netmask 255.255.255.0 { range 192.168.20.100 192.168.20.200; option routers 192.168.20.1; }注意多个subnet共用一个DHCP服务时服务器自身的IP必须和其中一个subnet匹配否则服务启动时检测不到本机地址会拒绝启动。这就是为什么前面强调要规划好服务器IP放在哪个管理网段里。如果想彻底绕过这个限制可以用shared-network的写法但那种方式复杂大多数场景用不上。5.2 中继场景下的特殊性当中继开起来之后DHCP服务器看到的所有请求都来自于中继设备的IP所以它判断客户端属于哪个网段靠的是报文里中继附加的giaddr字段也就是中继设备面向客户端的那个接口IP。服务器配置文件里写subnet时要跟这条子网地址段严格对应。如果中继配置出错客户端会拿到一个完全不搭的IP或者干脆一发请求就石沉大海。在排障时最典型的现象是客户端一直获取不到IP但服务端日志里根本没有收到DISCOVER报文。这种情况问题八成出在中继或路由配置上而不是DHCP本身。第一步就ping服务器的地址能不能通第二步看中继有没有生效这比抓瞎改配置有效得多。5.3 租约记录与文件的管理租约文件是DHCP服务最关键的“记忆体”。重启DHCP服务不会丢失租约因为租约存在/var/lib/dhcp/dhcpd.leases里。新装系统时这个文件需要存在否则服务启动会失败。文件丢了服务会重建一个空的但已分配出去的IP会全部变成“无主”状态此时部分客户端续约会被拒绝得重拿一次IP。日常维护不建议手动编辑租约文件除非你知道自己在干什么。批量更换设备网段或清空租约时可以停掉服务、备份旧的租约文件、删除或清空、再启动服务让所有终端重新获取IP。这就是“全网IP重洗”的标准操作流程。5.4 日志配置看得更清默认情况下DHCP日志会走系统日志。但混在系统日志里很难查。个人经验是在dhcpd.conf里加一行log-facility local7;然后在rsyslog里把local7转到独立文件比如/etc/rsyslog.d/dhcp.conf里写local7.* /var/log/dhcpd.log重启rsyslog和DHCP服务后DHCP的分配、续租、冲突全都会单独落在一个文件里排查问题效率翻倍。6. 常见问题与排查技巧实录6.1 服务启动失败八成是配置语法或监听网卡问题我遇到最多的启动失败有两种情况。第一种是配置语法问题第二种是没指定监听网卡。语法问题跑一遍dhcpd -t就能定位到哪一行缺分号引号这类低级错误一眼就能看出来。监听网卡问题前面说过了检查/etc/default/isc-dhcp-server里的INTERFACESv4是不是填了正确的网卡名。还有一种情况是单位里有人之前装过别的DHCP服务端口被占用了。启动时提示Address already in use这时执行ss -ulpn | grep 67看到哪个进程霸占着67端口把它处理掉。如果确认没有其它DHCP服务多半是有同名服务重复启用了。6.2 客户端拿不到IP从层层过滤开始查优先级最高的排查顺序服务状态与日志systemctl status和journalctl -ef看有没有收到DISCOVER。网络连通性客户端能不能ping通DHCP服务器地址。防火墙服务器和客户端之间的防火墙是否放行了UDP 67/68端口。交换机端口如果客户端连的是trunk口或VLAN没配好广播报文到不了你的服务器。这里有一个典型的坑服务器的防火墙开着默认只放行SSHDHCP报文直接就被DROP了。表现出来就是客户端一直拿不到IP但服务器上一切看起来正常。在UOS/CentOS上用firewall-cmd或者ufw放行67端口一条命令的事ufw allow 67/udp或者firewalld:firewall-cmd --permanent --add-servicedhcp firewall-cmd --reload6.3 客户端拿到错误网段的IP这种问题十有八九是网络里有别的DHCP服务器在“抢答”。办公网里有人私接了一个家用路由器当交换机用它的DHCP功能没关网段是192.168.1.0/24。结果部分设备拿到了192.168.1.x的地址上不了网不知道怎么回事。排查办法在客户端上抓包看DHCP OFFER来自哪个服务器或者到接入交换机上查dhcp snooping。最彻底的办法是把私接设备找出来路由器当交换机用之前先把它的DHCP服务关闭。有条件就交换机上开启dhcp snooping把信任口指定给合法的DHCP服务器其它非信任口的DHCP应答报文直接丢弃。6.4 常见配置错误速查表症状可能原因解决办法服务启动失败提示no subnet declaration配置里没有匹配本机网卡的subnet给服务器本机IP所在网段加上subnet声明服务启动失败提示not configured to listen没指定监听网卡配置/etc/default/isc-dhcp-server客户端获取不到IP防火墙拦截或中继配置错误放行UDP 67/68检查路由客户端拿到IP但上不了网网关或DNS配置错误查看option routers和domain-name-servers部分客户端IP频繁变化租约时间太短或地址池不够适当延长租约扩容range同一IP两台设备抢占手动配置和DHCP池冲突固定设备用reservation池与固定段隔离6.5 一个隐藏很深的坑DHCP报文穿越三层网络的“广播黑洞”特别提示一个容易踩的场景一个分公司的局域网里有两台三层交换机划分为两个VLANDHCP服务器在VLAN1VLAN2的客户端怎么都获取不到IP。检查了所有配置都没问题最后发现三层交换机上完全没有开启DHCP中继。很多人以为DHCP广播能像交换机二层那样“自动通”其实到了三层就止步了。正确做法是在三层设备上给VLAN2接口配置ip helper-address指向DHCP服务器的IP。一个VLAN一个helper一个都别漏。有些设备上叫“DHCP Relay”设置界面里找到对应VLAN的操作接口填上服务器地址即可。这个坑我见人踩过无数次这里给你提前打了预防针。7. 搭建完成之后的日常维护心得DHCP服务器这东西一旦稳定跑起来基本可以不闻不问。但有两件事需要定期关注一是租约文件的膨胀问题二是地址池的余量变化。租约文件会随着每次地址分配、续租不断追加记录旧记录不会自动清理。建议每季度停服一次清空租约文件重新生成保证文件体积处于可控状态。清理流程很简单停服务、备份dhcpd.leases、清空文件、启动服务。下游客户端最多进行一次续约重绑不会有明显感知挑个午休时间操作就行。另一个维护重点是地址池余量监控。可以用crontab定期统计当前租约数总量超过池子80%就报警提醒扩容或者清理僵尸设备。写一个简单的脚本统计dhcpd.leases里的active租约数量配合企业微信或钉钉机器人推送运维成本极低但非常实用。我在某次维护中就是靠这个脚本提前发现了地址池即将耗尽的情况在终端设备大规模掉线之前就扩容了range避免了一次办公网络事故。最后分享一个经验之谈DHCP服务的技术含量不高但它在整个网络里的影响力极大。改配置之前记得备份改完之后记得先dhcpd -t重启前先看一眼当前租约里有多少活跃设备避免在高峰期操作引发全网掉线。沉稳操作比什么高级技巧都管用。
阅读完成 · 觉得有帮助?
咨询建站