一、DHCP 服务概述
1.DHCP(Dynamic Host Configuration Protocol)动态主机配置协议
DHCP 是由 Internet 工作任务小组设计开发的,专门用于为 TCP/IP 网络中的计算机自动分配 TCP/IP 参数的协议。 使用 DHCP 可以减少管理员的工作量,避免 IP 地址冲突,当网络更改 IP 地址网段时不需要再重新配置每个用户的 IP 地址,提高了 IP 地址的利用率,方便客户端的配置。
2.可分配的地址信息主要包括:
网卡的 IP 地址、子网掩码、对应的网络地址、广播地址、默认网关地址、DNS 服务器地址等。
3.DHCP 的分配方式
(1)自动分配:
分配到一个 IP 地址后永久使用
(2)手动分配:
由 DHCP 服务器管理员专门指定 IP 地址
(3)动态分配:
使用完后释放该 IP,供其他客户机使用
4.DHCP 租约过程
(1)客户机从 DHCP 服务器获取 IP 地址的过程称为 DHCP 的租约过程。
(2)租约过程分为四个步骤:
1> 客户机发送请求IP (DHCP Discover 广播包)
当一个DHCP客户机启动时,客户机还没有IP地址,所以客户机需要通过DHCP获取一个合法的地址,此时DHCP客户机以广播方式发送DHCP Discover发现信息来寻找DHCP服务器,广播信息中包含DHCP客户机的MAC地址和计算机名,以便DHCP服务器确定是那个客户机发送的请求
2>服务器响应 (服务器发DHCP Offer 广播包)提供服务
当DHCP服务器接收到来自客户机的请求IP地址信息时,他就在自己的IP地址池中查找是否有合法的IP地址提供给客户机,如果有,DHCP服务器就会将此IP地址做上标记,加入到DHCP Offer的消息中,然后DHCP服务器就广播一则包含下列信息的DHCP Offer消息:DHCP客户机的MAC地址,DHCP服务器提供的合法IP地址、子网掩码、默认网关、租约的期限、DHCP服务器的IP地址
3> 客户机选择IP (客户机发DHCP Request 广播包)
DHCP客户机从接收到的第一个DHCP Offer消息中提取IP地址,发出IP地址的 DHCP服务器将该地址保留,这样该地址就不能在分配给另一个DHCP客户机。当客户机从第一个DHCP服务器接收到DHPC Offer消息并提取了IP地址后,客户机将DHCP Request消息广播到所有的DHPC服务器,表明它接收提供的内容。DHPC Request消息包括为客户机提供IP配置的服务器的服务标识符(服务器的IP地址)。DHCP服务器查看服务器标识符字段,以确定提供的IP是否被接受,如果DHCP Offer被拒绝,则DHCP服务器取消并保留其IP地址以提供给下一个IP租约的请求
4> 服务器确定租约 (服务器发 DHCP ACK广播包)
DHCP服务器接收到DHCP Request消息后,以DHCP ACK消息形式向客户机广播成功确认,该消息包括含有IP地址的有效租约和其他的可配置的信息。当客户机收到DHCP ACK消息时,他就配置了IP地址,完成了TCP/IP的初始化。
(3)重新登录
DHCP 客户机每次重新登录网络时,不需要再发送 DHCP Discover 信息,而是直接发送包含前一次所分配的 IP 地址的 DHCP Request 请求信息。当 DHCP 服务器接收到这一信息后,他会尝试让 DHCP 客户机继续使用原来的 IP 地址,并回答一个 DHCP ACK 确认信息。
如果此 IP已无法再分配原来的 DHCP 客户机使用(如 IP 地址已经分配给其他的 DHCP 客户机使用),DHCP 服务器给 DHCP 客户机回答一个 DHCP Nack 否认信息。当原来的 DHCP 客户机接收此 DHCP Nack 否认信息后,他就必须重新发送 DHCP Discover 发现信息来请求新的 IP 地址。
(4)更新租约
当 DHCP 服务器向客户端出租的 IP 地址租期达到 50% 时,就需要更新租约。客户机直接向提供租约的服务器发送 DHCP Request 包,要求更新现有的地址租约。若此时 DHCP 服务器无法正常回复 DHCP 客户机的请求,客户机的此 IP 地址可以继续使用到最大租约时间的 87.5%。
二、Linux 中 DHCP 的安装预配置
1.DHCP 的安装
(1)挂载安装光盘
(2)yum 安装光盘中的 dhcp (本地 yum 仓库的建立此处略,参见第一册Linux系统管理03)
2.配置 DHCP 服务
- 主配置文件:/etc/dhcp/dhcpd.conf
- 执行程序:/usr/sbin/dhcpd、/usr/sbin/dhcrelay
- 服务脚本:/etc/init.d/dhcpd、/etc/init.d/dhcrelay
- 执行参数配置:/etc/sysconfig/dhcpd
- DHCP 中继配置:/etc/sysconfig/dhcrelay
修改配置文件 /etc/dhcp/dhcpd.conf
【保存退出。(注意,此 DHCP 服务器必须有一个网络设备的 IP 地址属于所设置的网段)】
【设置 DHCP 服务开机自启并启动服务】
3.客户端验证
再开启一台 Centos7 主机,选择网卡与 DHCP 相同的网卡段,然后设置为 DHCP 自动获取
三、Linux 中 DHCP 服务启动失败排错
1.排查思路:
观察日志文件的 /var/log/messages 中,找出配置文件错误进行修改。
2.示例:
(1)DHCP 服务器的网卡配置中没有与所配置的网段相匹配的 IP 地址
1> DHCP 服务器的网卡 ens37 的 IP 地址,使之与配置服务的 100.0 网段不服,重启 DHCP服务
2> 查看报错详情,根据报错查找问题
[root@huyouba1 ~]# journalctl -xe
分析:日志文件中记录在 DHCP 服务器中的两块网卡均与 dhcp.conf 配置文件中的网段不符,导致启动失败。 解决方法:修改任意一块网卡 IP 地址,或者修改 /etc/dhcp/dhcpd.conf 配置文件
(2)配置文件编写错误
1> 模拟错误,删除一些字符。
[root@huyouba1 ~]# vim /etc/dhcp/dhcpd.conf
2> 启动 DHCP 服务,观察日志文件
[root@huyouba1 ~]# systemctl restart dhcpd
[root@huyouba1 ~]# journalctl -xe
分析:配置文件错误 – 退出
解决方案:修改配置文件,在日志文件报错行附近多家关注,若查不出哪里出错,可以与 /usr/share/doc/dhcp-*/dhcp.conf.sample 进行对比。
四、Linux 中 DHCP 中继配置
DHCP服务器只作用于局域网同一网段内,客户端是通过广播消息来获得DHCP服务器响应后才能得到IP地址的,但广播消息不能跨越子网,那么如何让客户端获取到DHCP服务器提供的IP地址呢?这就是DHCP中继服务器的功能了。
1.搭建实验环境
两台 Centos7 虚拟机,一台 Windows7 虚拟机,配置要求如下:
- 第一步,在 DHCP-server(DHCP服务器)中配置,并启动服务
配置 DHCP 服务器的网络参数
[root@dhcp-server ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
IPADDR=192.168.100.100
NETMASK=255.255.255.0
GATEWAY=192.168.100.1
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=107e7300-d2d8-4bb0-9f02-3ad5ab2d40dd
DEVICE=ens33
ONBOOT=YES
重启网络服务
[root@dhcp-server ~]# systemctl restart network
查看 DHCP 服务器的 IP
[root@dhcp-server ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:1a:77:9b brd ff:ff:ff:ff:ff:ff
inet 192.168.100.100/24 brd 192.168.100.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::9024:765f:fd20:b330/64 scope link noprefixroute
valid_lft forever preferred_lft forever
编辑 DHCP 服务器的配置文件
[root@dhcp-server ~]# cat /usr/share/doc/dhcp-4.2.5/dhcpd.conf.example > /etc/dhcp/dhcpd.conf
[root@dhcp-server ~]# vim /etc/dhcp/dhcpd.conf
# dhcpd.conf
# Sample configuration file for ISC dhcpd
#
# option definitions common to all supported networks...
option domain-name "huyouba1.com";
option domain-name-servers 8.8.8.8,114.114.114.114;
default-lease-time 600;
max-lease-time 7200;
log-facility local7;
# No service will be given on this subnet, but declaring it helps the
subnet 192.168.100.0 netmask 255.255.255.0 {
range 192.168.100.100 192.168.100.200;
option routers 192.168.100.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;
启动 DHCP 服务,并检查状态
[root@dhcp-server ~]# systemctl restart dhcpd
[root@dhcp-server ~]# ss -utpln |grep dhcpd
udp UNCONN 0 0 *:67 *:* users:(("dhcpd",pid=8277,fd=7))
DHCP 服务器一切正常至此 DHCP 服务器的配置已经完成;下一步配置 DHCP 中继代理服务器。
- 第二步,修改 DHCP-Relay(DHCP中继)网络连接模式
【注意】当网卡较多时,此时选择的 VMnet 与之前所规划的网段不一定是一一对应的,可以选择停用三块网卡,观察剩下唯一一块网卡的 IP 地址网段,属于规划时的那个 VMnet,将其一一对应。
- 第三步,配置 DHCP-Relay(DHCP中继)网卡 IP 地址结果为下,具体过程略
[root@dhcp-relay ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:04:d0:ae brd ff:ff:ff:ff:ff:ff
inet 192.168.100.1/24 brd 192.168.100.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe04:d0ae/64 scope link
valid_lft forever preferred_lft forever
3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:04:d0:b8 brd ff:ff:ff:ff:ff:ff
inet 192.168.10.1/24 brd 192.168.10.255 scope global noprefixroute ens37
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe04:d0b8/64 scope link
valid_lft forever preferred_lft forever
4: ens38: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:04:d0:c2 brd ff:ff:ff:ff:ff:ff
inet 192.168.20.1/24 brd 192.168.20.255 scope global noprefixroute ens38
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe04:d0c2/64 scope link tentative
valid_lft forever preferred_lft forever
5: ens39: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:04:d0:cc brd ff:ff:ff:ff:ff:ff
inet 192.168.30.1/24 brd 192.168.30.255 scope global noprefixroute ens39
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe04:d0cc/64 scope link tentative
valid_lft forever preferred_lft forever
-
第四步,在 DHCP-Relay(DHCP 中继)上安装 dhcp 服务,具体安装过程详见前文,此处略。
-
第五步,打开 DHCP 中继服务器路由转发功能
编辑 /etc/sysctl.conf 文件在文件添加一行内容为:net.ipv4.ip_forward = 1 开启路由转发
[root@dhcp-relay ~]# vim /etc/sysctl.conf
# sysctl settings are defined through files in
# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
#
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#
# For more information, see sysctl.conf(5) and sysctl.d(5).
net.ipv4.ip_forward = 1
使设置立即生效,执行以下命令:
[root@dhcp-relay ~]# sysctl -p
- 第六步,开启 DHCP 中继服务
[root@dhcp-relay ~]# dhcrelay 192.168.100.100
Dropped all unnecessary capabilities.
Internet Systems Consortium DHCP Relay Agent 4.2.5
Copyright 2004-2013 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/
Listening on LPF/ens39/00:0c:29:04:d0:cc
Sending on LPF/ens39/00:0c:29:04:d0:cc
Listening on LPF/ens38/00:0c:29:04:d0:c2
Sending on LPF/ens38/00:0c:29:04:d0:c2
Listening on LPF/ens37/00:0c:29:04:d0:b8
Sending on LPF/ens37/00:0c:29:04:d0:b8
Listening on LPF/ens33/00:0c:29:04:d0:ae
Sending on LPF/ens33/00:0c:29:04:d0:ae
Sending on Socket/fallback
- 第七步,测试
Win7 使用不同的网卡分别测试自动获取的 IP
【虚拟机中 DHCP 中继服务器配置失败的可能原因】
(1)虚拟机与真实环境相比,在 DHCP 中继调试好后需要多用一条命令,dhcrelay 加 DHCP 服务器的 IP,例如:dhcrelay 192.168.100.100
(2)虚拟机中添加的网卡顺序,预所选 VMnet 不一定是一一对应的顺序。所以在实验中若遇到不对应的情况,可以先停用其他网卡,只留下一块,观察剩下网卡的 IP 地址网段是规划时的 VMnet几,将其修改,以此类推,将所有网卡的 IP 地址网段与事先规划的 VMnet 相对应,修改后重启网络服务即可。