自学linux的第二十一天【DHCP 服务从入门到实战】

DHCP 服务从入门到实战:小白也能看懂的完整教程

一、DHCP 是什么?(先搞懂核心概念)

1. 基本概念

DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是一套自动给网络设备分配 IP 地址、子网掩码、网关、DNS 等网络参数的服务,就像网络里的 "地址管理员"------ 不用手动给每台电脑设置 IP,设备一联网就能自动拿到可用的网络配置。

它的核心特点是:采用 C/S(客户端 / 服务器) 架构,服务端监听 67/udp 端口,客户端监听 68/udp 端口,全程自动完成配置,大幅提升网络管理效率。

2. 核心作用

  • 动态 IP 分配:自动给客户端分配可用 IP,避免手动配置的繁琐和冲突
  • 统一网络参数:同时分配网关、DNS、子网掩码等,确保全网配置一致
  • 地址回收复用:IP 地址有租约期,不用时回收,提升地址利用率

3. DHCP 三大优势

  • 提高配置效率:几十台电脑的网络配置,几分钟就能搞定
  • 减少配置错误:避免手动输入 IP 时输错数字、掩码不匹配等问题
  • 地址灵活管理:IP 地址按需分配,不用时回收,避免地址浪费

4. 三种地址分配方式

表格

分配方式 特点 适用场景
手动分配 管理员手动绑定 IP 和 MAC 地址,固定不变 服务器、打印机等需要固定 IP 的设备
自动分配 客户端首次获取 IP 后永久占用,不回收 小型网络,设备数量少且长期在线
动态分配 IP 有租约期,到期回收,客户端可重新申请 企业办公、校园网等大型网络(最常用)

5. 重要注意事项

  • 同一个局域网内不允许同时存在多个 DHCP 服务器,否则会导致客户端获取地址混乱
  • 当租约期达到 50% 时,客户端会自动向服务器续约,避免地址过期失效
  • 不同系统客户端的 "兜底行为":
    • Linux:DHCP 服务不可用时,客户端不会自动获取 IP,网络直接断开
    • Windows:DHCP 服务不可用时,会启用备用地址(169.254.0.0/16 网段),保证内网连通性

二、DHCP 工作流程(小白也能懂的 "四步拿地址")

当客户端设置为 "自动获取 IP" 时,会和 DHCP 服务器完成 4 步交互,像 "打招呼→邀约→确认→生效":

  1. Discover(发现):客户端发送广播包(目标地址 255.255.255.255),大喊 "谁是 DHCP 服务器?我要 IP!"
  2. Offer(邀约):网络中的 DHCP 服务器收到广播,回应一个广播包,携带一个可用 IP 和配置参数,询问 "这个地址你要不要?"
  3. Request(请求):客户端选中一个 Offer,发送广播包,明确 "我就要这个 IP 了!"
  4. Ack(确认):服务器收到请求,发送确认包,确定 IP 租约期,客户端正式使用该地址

这 4 步全是广播包,因为客户端一开始还没有 IP,只能通过广播和服务器通信。


三、前置:路由搭建(跨网段 DHCP 必备)

如果需要让 DHCP 服务器为多个网段分配 IP,必须先搭建路由,开启 IP 转发和 DHCP 中继功能:

1. 为虚拟机添加新网卡

如果网络由 NetworkManager 管理,新网卡需要用 nmcli 配置静态 IP(作为不同网段的网关):

运行

复制代码
nmcli connection modify 网卡名 \
  ipv4.addresses "网关IP/掩码" \
  ipv4.method "manual"

2. 重启网卡生效

运行

复制代码
nmcli connection down 网卡名 && nmcli connection up 网卡名
nmcli connection down 网卡名2 && nmcli connection up 网卡名2
# 或用传统命令
ifdown 网卡名 && ifup 网卡名 && ifdown 网卡名2 && ifup 网卡名2

3. 开启内核路由功能

运行

复制代码
# 编辑路由配置文件
vim /etc/sysctl.conf
# 将 net.ipv4.ip_forward=0 改为 1
net.ipv4.ip_forward=1

# 生效配置
sysctl -p

4. 开启 DHCP 中继(跨网段转发请求)

运行

复制代码
# 安装中继服务
yum install -y dhcp-relay
# 启动中继,指向主 DHCP 服务器 IP
dhcrelay 主服务器IP

四、实战:搭建 DHCP 服务器(小白一步一步跟着做)

前置准备

  • 系统:CentOS/RHEL 系列(本文以 CentOS 7 为例)
  • 目标:搭建 DHCP 服务器,为 192.168.111.0/24 网段的客户端自动分配 IP
  • 服务器 IP:192.168.111.137(静态 IP,DHCP 服务器必须用固定 IP)

步骤 1:安装 DHCP 服务软件

DHCP 服务的核心软件包是 dhcpdhcp-server,直接用 yum 安装:

运行

复制代码
yum install -y dhcp-server

步骤 2:关闭防火墙和 SELinux(避免拦截)

DHCP 服务依赖 UDP 67/68 端口,先关闭防火墙和 SELinux,避免配置被拦截:

运行

复制代码
# 1. 关闭防火墙并禁止开机自启
systemctl stop firewalld
systemctl disable firewalld

# 2. 临时关闭 SELinux(立即生效)
setenforce 0

# 3. 永久关闭 SELinux(重启后生效)
vim /etc/selinux/config
# 找到 SELINUX=enforcing,改为 SELINUX=disabled

步骤 3:配置服务器静态 IP(关键!)

DHCP 服务器必须有固定 IP,不能自己从其他 DHCP 服务器获取地址。如果网络由 NetworkManager 管理,用 nmcli 配置静态 IP:

运行

复制代码
# 1. 查看网卡名称(比如 ens160)
nmcli connection show

# 2. 配置静态 IP(替换为你的实际网关、IP、掩码)
nmcli connection modify ens160 \
  ipv4.addresses "192.168.111.137/24" \
  ipv4.gateway "192.168.111.2" \
  ipv4.dns "192.168.111.137" \
  ipv4.method "manual"

# 3. 重启网卡生效
nmcli connection down ens160 && nmcli connection up ens160

# 4. 验证 IP 配置
ip address
# 验证网关
route -n
# 验证 DNS
cat /etc/resolv.conf

步骤 4:配置 DHCP 地址池(核心配置)

DHCP 的主配置文件是 /etc/dhcp/dhcpd.conf,默认是空文件,我们需要从示例文件复制模板:

运行

复制代码
# 1. 进入配置目录
cd /etc/dhcp

# 2. 复制示例配置文件(保留权限,-p 很重要!)
cp -p /usr/share/doc/dhcp-server/dhcpd.conf.example ./dhcpd.conf

# 3. 修改配置文件权限(确保可读取)
chmod 0644 dhcpd.conf

# 4. 编辑配置文件
vim dhcpd.conf
关键配置修改(小白直接照抄改)

在配置文件中找到 subnet 相关配置,替换为以下内容(以 192.168.111.0/24 网段为例):

运行

复制代码
# 全局配置
default-lease-time 600;  # 默认租约期:10分钟
max-lease-time 7200;      # 最大租约期:2小时
ddns-update-style none;   # 关闭动态 DNS 更新(小白可忽略)
authoritative;            # 声明本服务器为网段内权威 DHCP 服务器

# 子网配置(核心:定义要分配的网段和参数)
subnet 192.168.111.0 netmask 255.255.255.0 {
  range 192.168.111.5 192.168.111.249;  # 可分配的 IP 范围(避开网关、服务器 IP)
  option domain-name-servers 192.168.111.137;  # DNS 服务器地址(指向自己或公共 DNS)
  option domain-name "internal.example.com";     # 域名(可自定义)
  option routers 192.168.111.250;               # 网关地址(网段的默认网关)
  option broadcast-address 192.168.111.255;     # 广播地址(网段最后一个地址)
  default-lease-time 600;
  max-lease-time 7200;
}

小白重点改:subnet 后的网段、range 后的 IP 范围、option routers 后的网关地址,其他保持默认即可。

步骤 5:地址绑定(固定 IP 给指定设备)

如果需要把某个 IP 固定分给某台电脑(比如服务器、打印机),可以配置 "地址绑定",基于 MAC 地址绑定 IP:

dhcpd.conf 中添加以下内容(替换为实际的 MAC 地址和 IP):

运行

复制代码
host fantasia {
  hardware ethernet 08:00:07:26:c0:a5;  # 客户端的 MAC 地址
  fixed-address 192.168.111.100;         # 要固定分配的 IP
}

这样,只要 MAC 地址为 08:00:07:26:c0:a5 的设备联网,就会固定拿到 192.168.111.100 这个 IP。

步骤 6:检查配置并启动服务

运行

复制代码
# 1. 检查配置文件语法(无输出则正确)
dhcpd -t

# 2. 启动 DHCP 服务并设置开机自启
systemctl enable --now dhcpd

# 3. 查看服务状态(确保 active running)
systemctl status dhcpd

如果启动失败,用以下命令查看日志找原因:

运行

复制代码
journalctl -xeu dhcpd

步骤 7:测试 DHCP 服务

找一台客户端(Windows 或 Linux),设置为 "自动获取 IP",然后执行:

  • Windows:ipconfig /renew → 查看获取的 IP 是否在地址池范围内
  • Linux:dhclient → 用 ip address 查看获取的 IP

如果能正常获取 IP,说明 DHCP 服务器搭建成功!


五、进阶:多网段 DHCP 配置

如果需要为多个网段分配 IP(比如同时服务 192.168.111.0/24 和 192.168.112.0/24),只需在 dhcpd.conf 中添加多个 subnet 配置:

运行

复制代码
# 第二个网段配置
subnet 192.168.112.0 netmask 255.255.255.0 {
  range 192.168.112.5 192.168.112.249;
  option routers 192.168.112.250;
  option domain-name-servers 192.168.111.137;
  default-lease-time 600;
  max-lease-time 7200;
}

六、常见错误排查(小白避坑指南)

  1. DHCP 服务启动失败

    • 原因:配置文件语法错误、IP 范围超出子网、端口 67 被占用
    • 排查:dhcpd -t 检查语法;ss -ulnp | grep :67 查端口占用;journalctl -xeu dhcpd 看日志
  2. 客户端获取不到 IP

    • 原因:服务器和客户端不在同一网段且未配置中继、地址池耗尽、防火墙拦截
    • 排查:检查网段配置;cat /var/lib/dhcpd/dhcpd.leases 查看已分配地址;确认防火墙已关闭
  3. 地址绑定不生效

    • 原因:MAC 地址输入错误、fixed-address 不在地址池范围内
    • 排查:核对 MAC 地址;确保固定 IP 在对应子网内

七、总结

DHCP 是网络管理的 "效率神器",核心就是自动分配 IP、统一网络参数。小白搭建 DHCP 服务器的核心流程是:

  1. 搭建路由(跨网段必备)→ 2. 安装软件 → 3. 配置静态 IP → 4. 写地址池配置 → 5. 启动服务 → 6. 测试验证

重点避开「静态 IP 配置错误、配置文件语法错误、多网段未配置中继」这几个坑,就能快速搭建出稳定可用的 DHCP 服务,让网络管理变得轻松又高效!

相关推荐
_OP_CHEN3 小时前
【Linux系统编程】(二十八)深入 ELF 文件原理:从目标文件到程序加载的完整揭秘
linux·操作系统·编译·c/c++·目标文件·elf文件
Web极客码3 小时前
WordPress博客关键词
服务器·wordpress·网站加速
Fleshy数模3 小时前
MySQL 表创建全攻略:Navicat 图形化与 Xshell 命令行双模式实践
linux·mysql
神梦流4 小时前
GE 引擎的非标准数据流处理:稀疏张量与自定义算子在图优化中的语义保持
linux·运维·服务器
兜兜转转了多少年4 小时前
从脚本到系统:2026 年 AI 代理驱动的 Shell 自动化
运维·人工智能·自动化
.小墨迹5 小时前
apollo学习之借道超车的速度规划
linux·c++·学习·算法·ubuntu
Lsir10110_5 小时前
【Linux】中断 —— 操作系统的运行基石
linux·运维·嵌入式硬件
Sheffield5 小时前
command和shell模块到底区别在哪?
linux·云计算·ansible
darkb1rd5 小时前
八、PHP SAPI与运行环境差异
开发语言·网络安全·php·webshell