1.DHCP服务

29.DHCP服务

文章目录

DHCP 服务介绍

在大型网络中,系统静态分配IP地址面临问题:

  1. 确保不要同时在多个系统上使用同一个地址。
  2. 部署新系统通常需要手动分配其IP地址。在云环境中,实例的网络是自动化配置的。

动态主机配置协议(DHCP-Dynamic Host Configuration Protocol)提供了一种自动配置网络参数的方法,例如IP地址,默认网关,DNS服务器和域或NTP服务器。在网络中部署DHCP服务器,您可以集中控制这些参数。

DHCP有两种协议:

  • 用于IPv4网络的 DHCPv4
  • 用于IPv6网络的 DHCPv6

本课程只介绍DHCPv4。

DHCP 通信过程

  1. 客户端使用DHCPv4配置网络接口时,网卡将 DHCPDISCOVER 数据包发送到 255.255.255.255 广播目标。因为路由器通常不转发该广播地址,所以必须将DHCP服务器与客户端安装在同一物理网络上,以便它可以接收DHCPDISCOVER数据包。您也可以将路由器配置为DHCP中继代理,转发DHCP消息到其他网络。
  2. DHCP服务器收到 DHCPDISCOVER 数据包后,响应 DHCPOFFER 数据包,该数据包包含其自己的IP地址和客户端应使用的IP地址。该数据包还包括一个租用期限,以指示所提供的IP地址有效的时间,以及其他网络参数,例如默认网关和DNS服务器。
  3. 客户端收到DHCP服务器 DHCPOFFER 数据包后,发送 DHCPREQUEST 广播数据包,请求DHCP服务器提供的IP地址。这似乎很多余,但是网络上可能有多个DHCP服务器,或者路由器可能会将DHCPOFFER转发到多个网络。因此,客户端可能会从不同的DHCP服务器收到响应。客户端的DHCPREQUEST数据包包括接受请求的DHCP服务器的IP地址。
  4. DHCP服务器收到DHCPREQUEST数据包后,会发送 DHCPACK 数据包,确认客户端对客户端IP地址具有独占权限,直到租约到期为止。
  1. 租约到期后,重新向DHCP服务器续约。
  2. DHCP服务器,同意客户端续约。

在DHCP服务器上,可以使用journalctl --unit= dhcpd.service命令来访问客户端与服务端通信消息。 以下摘录显示了客户端通过DHCP请求IP地址。

bash 复制代码
DHCPDISCOVER from 00:0c:29:26:13:b5 via eth0
DHCPOFFER on 10.1.8.101 to 00:0c:29:26:13:b5 (hosta) via eth0
DHCPREQUEST for 10.1.8.101 (10.1.8.2) from 00:0c:29:26:13:b5 (hosta) via
eth0
DHCPACK on 10.1.8.101 to 00:0c:29:26:13:b5 (hosta) via eth0

在租约到期之前,客户端会定期向服务器发送 DHCPREQUEST 数据包,以确保服务器不会收回IP地址。

多个 DHCP 服务器

尽管DHCP支持在物理网络上运行多个DHCP服务器,但不建议这么做。正常情况下,同一个物理网络中只需要一台DHCP服务器应回答客户端的请求即可。

在同一网络上运行多个服务器的情况下,当新客户端发送 DHCPDISCOVER 数据包以获取地址时,它可能会收到多个 DHCPOFFER 数据包。客户端仅接受其中一台服务器提供的配置,并广播包含该服务器IP地址的 DHCPREQUEST 数据包。其他DHCP服务器释放它们为客户端准备的IP地址。

但是,当客户端使用 DHCPREQUEST 数据包更新其IP地址时,服务器行为取决于服务器是否具有权威性。 ==非权威的DHCP服务器会忽略DHCPREQUEST数据包中不知道的地址。==当客户端发送的IP地址在权威DHCP服务器管理的地址范围内,但服务器以前不知道该IP地址时,它将拒绝该请求并发回DHCPNAK 数据包。这可能意味着客户端最初是从网络上的另一台非权威的DHCP服务器获得其地址的。任何收到DHCPNAK数据包的客户端都不能再使用该地址,而必须请求一个新的地址。

使用默认配置启动DHCP服务器时,服务器不是权威服务器, 这样可以防止非权威DHCP服务器接管权威服务器提供的地址。

部署 DHCP 服务器

要配置DHCPv4服务器,请首先使用ip addr命令确认您的网络接口配置是否指定了BROADCAST地址。

bash 复制代码
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:e5:be:0f brd ff:ff:ff:ff:ff:ff
    inet 10.1.8.10/24 brd 10.1.8.255 scope global ens160
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fee5:be0f/64 scope link 
       valid_lft forever preferred_lft forever

服务器必须具有静态IP地址。

安装 DHCP 软件

bash 复制代码
#下载DHCP服务
yum install -y dhcp
#可以关闭防火墙或者放行DHCP服务

配置 DHCP 服务器

dhcpd服务使用/etc/dhcp/dhcpd.conf配置文件。 dhcp软件包提供/usr/share/doc/dhcp-*/dhcpd.conf.example 配置文件示例。

bash 复制代码
[root@centos7 ~ 10:32:00]#  vim /etc/dhcp/dhcpd.conf 

#可以参考6.vim编辑那一章案例三配置DHCP服务
[root@centos7 ~ 10:49:11]# cat /etc/dhcp/dhcpd.conf 
# A slightly different configuration for an internal subnet.
subnet 10.1.1.0 netmask 255.255.255.0 {
  range 10.1.1.101 10.1.1.130;
  option domain-name-servers 223.5.5.5, 223.6.6.6;
  option domain-name "zhang.cloud";
 # option routers 10.1.1.1;
  option broadcast-address 10.1.1.255;
  default-lease-time 600;
  max-lease-time 7200;
}

#set static ip
host client.zhang.cloud {
  hardware ethernet 08:00:07:26:c0:a5;
  fixed-address 10.1.1.100;
}

配置说明:

  • authoritative,指示服务器对其所管理的子网具有权威性。
  • subnet,提供的子网详。
  • range,指定服务器在该范围内分配IP地址。
  • option routers,指定服务器提供默认网关地址。
  • option domain-name-servers,指定服务器提供DNS名称服务器。
  • option domain-search,指定服务器提供DNS域搜索列表。
  • default-lease-time,提供网络信息默认租期,如果客户端不要求任何特定的租期。单位秒。
  • max-lease-time,指示服务器可以从客户端请求接受的最大租期。单位秒。

客户端系统上的NetworkManager使用domain-name-serversdomain-search 更新resolv.conf 文件中的nameserversearch参数。

启动DHCP服务

bash 复制代码
[root@dhcp ~ 15:02:26]# systemctl restart dhcpd

配置 DHCP 客户端

bash 复制代码
#配置ens33静态地址
[root@centos7 ~ 10:35:58]# nmcli c delete Wired\ connection\ 1 
[root@centos7 ~ 10:36:16]# nmcli connection add type ethernet ifname ens33 con-name ens33 ipv4.method manual ipv4.addresses 10.1.1.10/24

[root@centos7 ~ 10:37:29]# nmcli connection up ens33

[root@centos7 ~ 10:37:42]# ip -br a
lo               UNKNOWN        127.0.0.1/8 ::1/128 
ens32            UP             10.1.8.10/24 fe80::20c:29ff:fe5a:2097/64 
ens33            UP             10.1.1.10/24 fe80::55d2:fd84:15e5:63fd/64

基于 MAC 地址预留IP地址

在配置文件中,host声明可以将MAC地址绑定到IP地址。 此配置对于始终为特定系统的网络接口提供相同的IP地址特别有用,尤其是Web或数据库系统之类的服务器。

客户端MAC地址查看

bash 复制代码
#set static ip
host client.zhang.cloud {
  hardware ethernet 08:00:07:26:c0:a5;
  fixed-address 10.1.1.100;
}

把原本的mac地址改成

分配固定IP

bash 复制代码
[root@centos7 ~ 11:42:40]# ip -br link
lo               UNKNOWN        00:00:00:00:00:00 <LOOPBACK,UP,LOWER_UP> 
ens32            UP             00:0c:29:54:9f:21 <BROADCAST,MULTICAST,UP,LOWER_UP> 
ens33            UP             00:0c:29:54:9f:2b <BROADCAST,MULTICAST,UP,LOWER_UP> 

#更改client的mac地址
[root@server ~ 11:43:23]# vim /etc/dhcp/dhcpd.conf 
[root@server ~ 11:46:18]# systemctl restart dhcpd

启动客户端网卡验证

bash 复制代码
[root@centos7 ~ 11:42:55]# nmcli connection up ens33-auto 
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/7)
[root@centos7 ~ 11:43:36]# ip -br a
lo               UNKNOWN        127.0.0.1/8 ::1/128 
ens32            UP             10.1.8.11/24 fe80::20c:29ff:fe54:9f21/64 
ens33            UP             10.1.1.100/24 fe80::c474:21b7:5b78:e4d/64 

获得文件里所配置的地址

DHCP中继服务器

DHCP 中继介绍

如果DHCP客户端与DHCP服务器不处于同一个广播域,那么DHCP客户端广播的DHCP Discover报文,会被网络中的三层设备丢弃,无法被DHCP服务器接收,此时,就需要DHCP中继代理(DHCP Relay Agent)。

DHCP中继可以实现在不同广播域(如子网、Vlan)之间处理和转发DHCP工作时的广播报文,使得DHCP客户端可以跨网段获取IP地址及相关参数。

DHCP 中继工作原理

有DHCP中继的场景中,DHCP中继在DHCP服务器和DHCP客户端之间转发DHCP报文,以保证DHCP服务器和DHCP客户端可以正常交互,下图示意了中继情形下,DHCP客户端与DHCP服务器的报文交互过程。

img

在有中继的情形下,DHCP客户端申请IP地址仍然分为四个阶段:发现、提供、请求和确认(否认)。只是客户端发送的报文会被同广播域内的DHCP中继收到,然后由DHCP中继将DHCP报文以单播的形式转发给服务器。同样,服务器响应的DHCP报文以单播形式发给DHCP中继,然后再由中继转发给客户端。

DHCP 中继实践

实验主机

主机名 IP 地址 虚拟网络
dhcp-server.laoma.cloud 10.1.8.10/24 vmnet8
dhcp-relay.laoma.cloud 10.1.8.20/24 vmnet8
dhcp-relay.laoma.cloud 10.1.1.20/24 vmnet1
dhcp-client.laoma.cloud 自动获取 vmnet1

vmnet1和vmnet8关闭dhcp功能。

网路拓扑要求:

  • server:只有一块网卡,连接vmnet8,地址是10.1.8.10
  • client:只有一块网卡,连接vmnet1,地址是自动获取,最终获取为10.1.1.200
  • dhcp-relay: 有2块网卡。
    • 第一个网卡连接vmnet8,地址是10.1.8.20
    • 第二个网卡连接vmnet1,地址是10.1.8.20

实验拓扑

配置 dhcp-server

配置 dhcp
bash 复制代码
#新增一个地址池
[root@server ~ 13:49:23]# cat /etc/dhcp/dhcpd.conf 
# A slightly different configuration for an internal subnet.
subnet 10.1.8.0 netmask 255.255.255.0 {
  range 10.1.8.101 10.1.8.130;
  option domain-name-servers 223.5.5.5, 223.6.6.6;
  option domain-name "zhang.cloud";
  option routers 10.1.8.2;
  option broadcast-address 10.1.8.255;
  default-lease-time 600;
  max-lease-time 7200;
}

# A slightly different configuration for an internal subnet.
subnet 10.1.1.0 netmask 255.255.255.0 {
  range 10.1.1.101 10.1.1.130;
  option domain-name-servers 223.5.5.5, 223.6.6.6;
  option domain-name "zhang.cloud";
  option routers 10.1.1.20;
  option broadcast-address 10.1.1.255;
  default-lease-time 600;
  max-lease-time 7200;
}

#set static ip
host client.zhang.cloud {
  hardware ethernet 00:0c:29:54:9f:2b;
  fixed-address 10.1.1.200;
}

[root@server ~ 13:48:23]# systemctl restart dhcpd
[root@server ~ 13:49:21]# ip -br a
lo               UNKNOWN        127.0.0.1/8 ::1/128 
ens32            UP             10.1.8.10/24 fe80::20c:29ff:fe5a:2097/64 
配置路由

DHCP server必须配置一个到达 DHCP relay 接收 DHCP 广播网卡的路由。

如果不配置该路由,dhcp server 无法将数据包返回给 10.1.1.20 服务器,最终导致无法提供dhcp给 dhcp-client。

bash 复制代码
# 当前实验环境: DHCP relay的第二个网卡,地址是:10.1.1.20/24 。
# dhcp-server 去往 10.1.1.20/32 路由下一跳是 10.1.8.20
[root@dhcp ~ 14:56:09]# nmcli connection modify ens32 ipv4.routes '10.1.1.20/32 10.1.8.20'

[root@dhcp ~ 14:57:46]# nmcli connection up ens32

配置dhcp-rlay

配置ens32地址
bash 复制代码
#配置ens33IP地址
[root@dhcp-relay ~ 14:02:33]# nmcli connection add type ethernet ifname ens33 con-name ens33 ipv4.method manual ipv4.addresses 10.1.1.20/24

[root@dhcp-relay ~ 14:03:51]# nmcli connection up ens33

[root@dhcp-relay ~ 14:04:03]# ip -br a
lo               UNKNOWN        127.0.0.1/8 ::1/128 
ens32            UP             10.1.8.20/24 fe80::20c:29ff:fec6:757e/64 
ens33            UP             10.1.1.20/24 fe80::b9f2:6497:550:14fa/64
dhcp端测试
bash 复制代码
[root@dhcp-relay ~ 14:42:00]# cp /usr/lib/systemd/system/dhcrelay.service /etc/systemd/system/dhcrelay.service
[root@dhcp-relay ~ 14:43:04]# vim /etc/systemd/system/dhcrelay.service 
#在 ExecStart 参数末尾添加 DHCP 服务器 IP 地址

[root@dhcp-relay ~ 14:44:11]# systemctl daemon-reload 
[root@dhcp-relay ~ 14:44:24]# systemctl enable dhcrelay.service --now
配置路由转发
bash 复制代码
# 查看路由是否开启,值为0,表示路由功能未开启.
[root@dhcp-relay ~ 14:45:29]# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 0

#开启路由转发
[root@dhcp-relay ~ 14:47:02]# echo net.ipv4.ip_forward =1 > /etc/sysctl.d/98-route.conf

[root@dhcp-relay ~ 14:49:10]# sysctl -p /etc/sysctl.d/98route.conf 
net.ipv4.ip_forward = 1
查看端口号67是否存在
bash 复制代码
[root@dhcp-relay ~ 14:45:10]# ss -lunp
State      Recv-Q Send-Q Local Address:Port               Peer Address:Port              
UNCONN     0      0      127.0.0.1:323                 *:*                   users:(("chronyd",pid=678,fd=5))
UNCONN     0      0       *:67                  *:*                   users:(("dhcrelay",pid=12208,fd=6))
UNCONN     0      0       [::1]:323                  [::]:*                   users:(("chronyd",pid=678,fd=6))
客户端配置
客户端测试
相关推荐
云泽8082 小时前
C++ List 容器详解:迭代器失效、排序与高效操作
开发语言·c++·list
云帆小二3 小时前
从开发语言出发如何选择学习考试系统
开发语言·学习
光泽雨3 小时前
python学习基础
开发语言·数据库·python
百***06014 小时前
python爬虫——爬取全年天气数据并做可视化分析
开发语言·爬虫·python
jghhh014 小时前
基于幅度的和差测角程序
开发语言·matlab
fruge4 小时前
自制浏览器插件:实现网页内容高亮、自动整理收藏夹功能
开发语言·前端·javascript
曹牧4 小时前
Java中处理URL转义并下载PDF文件
java·开发语言·pdf
未来之窗软件服务5 小时前
幽冥大陆(二十二)dark语言智慧农业电子秤读取——东方仙盟炼气期
开发语言·windows·golang·东方仙盟·东方仙盟sdk
逐步前行5 小时前
C项目--羊了个羊(两关全)--含源码
c语言·开发语言
IMPYLH5 小时前
Lua 的 assert 函数
开发语言·笔记·junit·单元测试·lua