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))
客户端配置
客户端测试
相关推荐
BingoGo1 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php
JaguarJack1 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php·服务端
BingoGo2 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php
JaguarJack2 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php·服务端
JaguarJack3 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
后端·php·服务端
BingoGo3 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
php
JaguarJack4 天前
告别 Laravel 缓慢的 Blade!Livewire Blaze 来了,为你的 Laravel 性能提速
后端·php·laravel
郑州光合科技余经理5 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
feifeigo1235 天前
matlab画图工具
开发语言·matlab
dustcell.5 天前
haproxy七层代理
java·开发语言·前端