Akemi

DHCPv4服务器搭建

2025/04/02

DHCP协议报文

DHCP协议的核心复杂性在于其丰富的Option,Option允许DHCP协议灵活扩展,支持各种网络参数的动态配置。

比如DHCP Server Identifier(Option 54) 用以标识DHCP服务器的身份,在DHCP服务器返回offer时会带上,client先收到谁的offer,就去谁的option54那

这几个报文里一般只有前五个是比较常用的

报文类型 发送方 目的 内容示例 触发场景
DHCP Discover 客户端 寻找可用DHCP服务器 客户端MAC地址、请求参数(如租期) 客户端首次接入网络或租约过期
DHCP Offer 服务器 向客户端提供IP地址和配置参数 分配的IP、子网掩码、网关、DNS、租期 响应Discover报文
DHCP Request 客户端 确认接受某个服务器的Offer,或请求续租IP地址 选择的服务器标识、请求的IP地址 收到多个Offer时选择其一,或租期续约(T1)
DHCP ACK 服务器 确认IP分配或续租请求 完整的网络配置参数 客户端Request合法时响应
DHCP NAK 服务器 拒绝客户端的Request(如IP冲突或非法请求) 错误标识、拒绝原因 客户端请求无效或IP不可用
DHCP Release 客户端 主动释放已分配的IP地址 需释放的IP地址、服务器标识 客户端主动断开网络(如关机)
DHCP Decline 客户端 通知服务器分配的IP地址存在冲突 冲突的IP地址、服务器标识 客户端检测到IP地址冲突(如ARP探测)
DHCP Inform 客户端 客户端已有IP地址,仅请求其他配置参数(如DNS、网关) 当前IP地址、请求的配置参数 静态IP设备需动态获取额外配置

DHCP服务器搭建

交换机配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
enable
configure
vlan 1,10,20,30,40
exit

interface e0/1
switchport mode access
switchport access vlan 10

int e0/2
sw m ac
sw ac v 20

int e0/0
sw t en d
sw m t

int range e0/0,e0/3
switchport trunk encapsulation dot1q
switchport mode trunk

int e0/3
switchport trunk allowed vlan remove 10,20

dhcp服务器配置

1
2
3
4
5
6
# rhel/centos——dhcp-server
# ubuntu——isc-dhcp-server

yum -y install dhcp-server

\cp /usr/share/doc/dhcp-server/dhcpd.conf.example /etc/dhcp/dhcpd.conf

dhcp配置文件解析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
/etc/dhcp/dhcpd.conf

option domain-name "example.org"; ;分配的域(全局)
option domain-name-servers ns1.example.org, ns2.example.org; ;dns服务器(全局)

# 租期时间(s)
default-lease-time 600;
# 最长租期时间
max-lease-time 7200;

#authoritative;如果是官方,就打开授权

# 给10.152.187.0/24网段分配地址
subnet 10.152.187.0 netmask 255.255.255.0 {
}

# range 分配地址范围
subnet 10.254.239.0 netmask 255.255.255.224 {
range 10.254.239.10 10.254.239.20;
option routers rtr-239-0-1.example.org, rtr-239-0-2.example.org; (局部)
}
# 每次拿地址都不同dynamic-bootp
range dynamic-bootp 10.254.239.10 10.254.239.20;

一堆option不列举了

# 针对主机做特定配置
host passacaglia {
# 如果网卡mac地址是这个
hardware ethernet 0:0:c0:5d:bd:95;
# 根据配置文件进行配置,用来做pve的
filename "vmunix.passacaglia";
# 指定host名字
server-name "toccata.example.com";
}

配置文件

其中vlan1也需要配置(VLAN 1默认放行是二层行为,DHCP依赖三层子网划分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
default-lease-time 600;
max-lease-time 7200;
log-facility local7;

subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.100 192.168.1.200;
option routers 192.168.1.1;
}

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 192.168.30.0 netmask 255.255.255.0 {
range 192.168.30.100 192.168.30.200;
option routers 192.168.30.1;
}

subnet 192.168.40.0 netmask 255.255.255.0 {
range 192.168.40.100 192.168.40.200;
option routers 192.168.40.1;
}

网卡配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
nmcli con add con-name eth1-vlan1 type ethernet ifname eth1 ipv4.addresses 192.168.1.1/24 ipv4.method manual
nmcli con add con-name eth1-vlan10 type vlan id 10 ifname eth1-vlan10 \
dev eth1 ipv4.addresses 192.168.10.1/24 ipv4.method manual

nmcli con add con-name eth1-vlan20 type vlan id 20 dev eth1 ifname eth1-vlan20 ipv4.addresses 192.168.20.1/24 ipv4.method manual
nmcli con add con-name eth1-vlan30 type vlan id 30 dev eth1 ifname eth1-vlan30 ipv4.addresses 192.168.30.1/24 ipv4.method manual
nmcli con add con-name eth1-vlan40 type vlan id 40 dev eth1 ifname eth1-vlan40 ipv4.addresses 192.168.40.1/24 ipv4.method manual

ip a | grep 192
inet 192.168.1.1/24 brd 192.168.1.255 scope global noprefixroute eth1
inet 192.168.10.1/24 brd 192.168.10.255 scope global noprefixroute eth1-vlan10
inet 192.168.20.1/24 brd 192.168.20.255 scope global noprefixroute eth1-vlan20
inet 192.168.30.1/24 brd 192.168.30.255 scope global noprefixroute eth1-vlan30
inet 192.168.40.1/24 brd 192.168.40.255 scope global noprefixroute eth1-vlan40

dhcp测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 测试
dhcpd -t
Internet Systems Consortium DHCP Server 4.4.2b1
Copyright 2004-2019 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/
ldap_gssapi_principal is not set,GSSAPI Authentication for LDAP will not be used
Not searching LDAP since ldap-server, ldap-port and ldap-base-dn were not specified in the config file
Config file: /etc/dhcp/dhcpd.conf
Database file: /var/lib/dhcpd/dhcpd.leases
PID file: /var/run/dhcpd.pid
Source compiled to use binary-leases

systemctl enable dhcpd --now

此时node1和node2都获得了ip
是因为链路使用access,所以不需要打tag也可以获取到流量
而node3因为使用了trunk,必须使用带tag的接口来接受,所以只能获取到vlan 1分配的ip

添加node3 vlan网卡配置

1
2
3
4
nmcli con add con-name eth0-vlan30 ifname eth0-vlan30 type vlan id 30 dev eth0 
nmcli con add con-name eth0-vlan40 ifname eth0-vlan40 type vlan id 40 dev eth0

然后可以获取到了地址

原文作者:王盛

原文链接:https://akemi.zj.cn/2025/04/02/DHCP/

发表日期:April 2nd 2025, 7:35:46 pm

更新日期:April 2nd 2025, 7:37:43 pm

版权声明:本文采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可

CATALOG
  1. 1. DHCP协议报文
  2. 2. DHCP服务器搭建
    1. 2.1. 交换机配置
  3. 3. dhcp服务器配置
    1. 3.1. dhcp配置文件解析
    2. 3.2. 配置文件
    3. 3.3. 网卡配置
    4. 3.4. dhcp测试