欢迎光临
我们一直在努力

1.DHCP 服务器

作者@小郭

1.DHCP 服务器

DHCP 服务介绍

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

  • 确保不要同时在多个系统上使用同一个地址。
  • 部署新系统通常需要手动分配其IP地址。在云环境中,实例的网络是自动化配置的。
  • 动态主机配置协议(DHCP-Dynamic Host Configuration Protocol)提供了一种自动配置网络参数的方法,例如IP地址,默认网关,DNS服务器和域或NTP服务器。在网络中部署DHCP服务器,您可以集中控制这些参数。

    DHCP有两种协议:

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

    本课程只介绍DHCPv4。

    DHCP 通信过程

    在这里插入图片描述

    在这里插入图片描述

  • 客户端使用DHCPv4配置网络接口时,网卡将 DHCPDISCOVER 数据包发送到 255.255.255.255 广播目标。因为路由器通常不转发该广播地址,所以必须将DHCP服务器与客户端安装在同一物理网络上,以便它可以接收DHCPDISCOVER数据包。您也可以将路由器配置为DHCP中继代理,转发DHCP消息到其他网络。

  • DHCP服务器收到 DHCPDISCOVER 数据包后,响应 DHCPOFFER 数据包,该数据包包含其自己的IP地址和客户端应使用的IP地址。该数据包还包括一个租用期限,以指示所提供的IP地址有效的时间,以及其他网络参数,例如默认网关和DNS服务器。

  • 客户端收到DHCP服务器 DHCPOFFER 数据包后,发送 DHCPREQUEST 广播数据包,请求DHCP服务器提供的IP地址。这似乎很多余,但是网络上可能有多个DHCP服务器,或者路由器可能会将DHCPOFFER转发到多个网络。因此,客户端可能会从不同的DHCP服务器收到响应。客户端的DHCPREQUEST数据包包括接受请求的DHCP服务器的IP地址。

  • DHCP服务器收到DHCPREQUEST数据包后,会发送 DHCPACK 数据包,确认客户端对客户端IP地址具有独占权限,直到租约到期为止。

  • 租约到期后,重新向DHCP服务器续约。

  • DHCP服务器,同意客户端续约。

  • 在这里插入图片描述

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

    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地址。

    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 软件

    # 安装软件包
    [root@server ~]# yum install -y dhcp

    # 配置防火墙,放行dhcp服务
    [root@server ~]# firewall-cmd –add-service=dhcp
    [root@server ~]# firewall-cmd –add-service=dhcp –permanent

    配置 DHCP 服务器

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

    [root@server ~ 10:39:20]# cp /usr/share/doc/dhcp*/dhcpd.conf.example /etc/dhcp/dhcpd.conf
    cp: overwrite ‘/etc/dhcp/dhcpd.conf’? yes

    #在前面加/bin就不会有提示信息。
    [root@server ~]# /bin/cp /usr/share/doc/dhcp-*/dhcpd.conf.example /etc/dhcp/dhcpd.conf

    #进入编辑文本变成如下,具体细节参考vim编辑器示例三。
    [root@server ~ 10:55:25]# vim /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 "gcf.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.gcf.cloud {
    hardware ethernet 08:00:07:26:c0:a5;
    fixed-address 10.1.1.100;
    }

    典型的DHCP配置示例:

    [root@server ~ 11:00:17]# cat /etc/dhcp/dhcpd.conf
    # A slightly different configuration for an internal subnet.
    subnet 10.1.1.0 netmask 255.255.255.0 {#网络地址是 10.1.1.0,子网掩码是 255.255.255.0。
    range 10.1.1.101 10.1.1.130;#指定 DHCP 服务器可以分配的动态 IP 地址范围
    option domain-name-servers 223.5.5.5,223.6.6.6;
    option domain-name "gcf.cloud";#客户端设置默认的 DNS 搜索域
    #option routers 10.1.1.1;
    option broadcast-address 10.1.1.255;#指定广播地址。
    default-lease-time 600;#默认租约时间
    max-lease-time 7200;#最大租约时间
    }
    #set static IP,静态IP
    host client.gcf.cloud {#定义了一个名为 client.gcf.cloud 的主机条目
    hardware ethernet 08:00:07:26:c0:a5;#指定客户端的 MAC 地址
    fixed-address 10.1.1.100;#为这个特定 MAC 地址的客户端分配固定的静态 IP 地址 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-servers和domain-search更新resolv.conf文件中的nameserver和search参数。

    验证 DHCP 配置

    # 验证配置文件语法
    [root@server ~]# dhcpd -t
    Internet Systems Consortium DHCP Server 4.2.5
    Copyright 2004-2013 Internet Systems Consortium.
    All rights reserved.
    For info, please visit https://www.isc.org/software/dhcp/
    Not searching LDAP since ldap-server, ldap-port and ldap-base-dn were not specified in the config file

    启用并启动服务

    # 启用并启动服务
    [root@server ~ 11:09:09]# systemctl enable dhcpd –now

    # 查看服务状态
    [root@server ~ 11:10:19]# systemctl status firewalld.service
    ● firewalld.service – firewalld – dynamic firewall daemon
    Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
    Active:`active (running)` since Wed 2025-11-19 10:16:13 CST; 54min ago
    Docs: man:firewalld(1)
    Main PID: 708 (firewalld)
    CGroup: /system.slice/firewalld.service
    └─708 /usr/bin/python2 -Es /usr/sbin/firewalld –nofork –nopid

    Nov 19 10:16:12 server.gcf.cloud systemd[1]: Starting firewalld – dynamic firewall .....
    Nov 19 10:16:13 server.gcf.cloud systemd[1]: Started firewalld – dynamic firewall d...n.
    Nov 19 10:16:13 server.gcf.cloud firewalld[708]: WARNING: AllowZoneDrifting is enabl....
    Hint: Some lines were ellipsized, use -l to show in full.

    配置 DHCP 客户端

    # 添加一个自动获取ip连接,
    #先查看新增网卡是ens33,ens32是之前配置过的。
    [root@client ~ 10:28:49]# ip -br a
    lo UNKNOWN 127.0.0.1/8 ::1/128
    ens32 UP 10.1.8.11/24 fe80::6f36:3274:f36f:f9db/64
    ens33 UP

    #ens32-manual是我自己配置的,方便再xshell端连接到10.1.8.10.
    [root@client ~ 11:12:54]# nmcli connection
    NAME UUID TYPE DEVICE
    ens32-anual 9cbbdc5f-c7ca-4cc0-bbad-bb12d96114fb ethernet ens32
    ens32 3778df61-009f-425a-baa9-9800ed00cd87 ethernet —
    Wired connection 1 b4984d15-24b6-317d-a79a-0cdb1f4b438c ethernet —

    #多余的删除。
    [root@client ~ 11:12:59]# nmcli connection delete b4984d15-24b6-317d-a79a-0cdb1f4b438c
    Connection 'Wired connection 1' (b4984d15-24b6-317d-a79a-0cdb1f4b438c) successfully deleted.
    [root@client ~ 11:13:36]# nmcli connection
    NAME UUID TYPE DEVICE
    ens32-anual 9cbbdc5f-c7ca-4cc0-bbad-bb12d96114fb ethernet ens32
    ens32 3778df61-009f-425a-baa9-9800ed00cd87 ethernet —

    #此时在server端。
    [root@server ~ 11:00:17]# 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 "gcf.cloud";
    #option routers 10.1.1.1;
    option broadcast-address 10.1.1.255;
    default-lease-time 600;#默认租约时间
    max-lease-time 7200;#最大租约时间
    }

    #配置一个自动获取ip连接,
    [root@client ~ 11:13:39]# nmcli connection add type ethernet ifname ens33 con-name ens33-auto
    Connection 'ens33-auto' (7b769c0f-0727-4149-8cf6-137cbcc8f2a2) successfully added.

    #此时去查看ens33得到了地址10.1.1.101.
    [root@client ~ 11:35:50]# ip -br a
    lo UNKNOWN 127.0.0.1/8 ::1/128
    ens32 UP 10.1.8.11/24 fe80::6f36:3274:f36f:f9db/64
    ens33 UP 10.1.1.101/24 fe80::a9ad:af8b:9e90:6837/64

    #以上,虽然给client端配置了固定的静态ip地址但是此时并没有将client的mac地址写进去,使用他还是通过动态获取到10.1.1.101.

    基于 MAC 地址预留IP地址

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

    基于上面的实验:

    #通过命令去查看ens33的mac地址。
    [root@client ~ 11:35:56]# ip -br link
    lo UNKNOWN 00:00:00:00:00:00 <LOOPBACK,UP,LOWER_UP>
    ens32 UP 00:0c:29:dc:d8:d8 <BROADCAST,MULTICAST,UP,LOWER_UP>
    ens33 UP 00:0c:29:dc:d8:e2 <BROADCAST,MULTICAST,UP,LOWER_UP>

    #将查到的mac地址 00:0c:29:dc:d8:e2 写入文件,输出内容如下。
    [root@server ~ 11:38:22]# 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 "gcf.cloud";
    option routers 10.1.1.10;
    option broadcast-address 10.1.1.255;
    default-lease-time 600;
    max-lease-time 7200;
    }

    #set static IP
    host client.gcf.cloud {
    hardware ethernet 00:0c:29:dc:d8:e2;#在这里将mac地址替换成ens33.
    fixed-address 10.1.1.100;
    }

    重启服务

    [root@server ~]# systemctl restart dhcpd

    客户端验证

    #重新启动一下ens33,激活连接。
    [root@client ~ 11:38:37]# nmcli connection up ens33-auto
    Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/31)

    #再去查看ens33的地址就会变成10.1.1.100.
    [root@client ~ 11:38:50]# ip -br a
    lo UNKNOWN 127.0.0.1/8 ::1/128
    ens32 UP 10.1.8.11/24 fe80::6f36:3274:f36f:f9db/64
    ens33 UP 10.1.1.100/24 fe80::a9ad:af8b:9e90:6837/64

    #当将client的mac地址获得了之后写进进去,此时他的ip地址就是静态获取的10.1.1.100,动态获取对他不起作用了。

    补充:

    当遇到不能下载安装包的问题:

    如图所示:显示不能解析这个名字。

    在这里插入图片描述

    解决办法:

    1.先去查看网关。

    #ip r 命令查看路由表,
    #via 223.5.5.5:下一跳网关地址是 223.5.5.5,
    [root@client ~ 14:35:38]# ip r
    default via 223.5.5.5 dev ens32 proto static metric 100
    10.1.8.0/24 dev ens32 proto kernel scope link src 10.1.8.11 metric 100
    223.5.5.5 dev ens32 proto static scope link metric 100
    #对于我的client端,他的下一跳也就是网关地址应该是10.1.8.2,因为他的地址是10.1.8.11,当时在配置的时候配置的网关是10.1.8.2,是这台服务器的默认网关,也是 10.1.8.0/24 子网的出口路由器地址。

    2.查看dns

    [root@server ~ 09:54:49]# vim /etc/resolv.conf
    [root@server ~ 09:55:18]# cat /etc/resolv.conf
    # Generated by NetworkManager
    search gcf.cloud
    nameserver 223.5.5.5
    nameserver 223.6.6.6
    #确保文件中有223.5.5.5,因为yum仓库下载是要去阿里云下载他要通过223.5.5.5去解析阿里云的地址。

    DHCP 中继服务器(扩展-自学)

    DHCP 中继介绍

    前文,我们介绍了DHCP客户端和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服务器的报文交互过程。
    在这里插入图片描述

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

    DHCP 中继实践

    实验主机

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

    vmnet1和vmnet8关闭dhcp功能。

    实验拓扑

    在这里插入图片描述

    配置 dhcp-server

    配置 dhcp

    # 安装软件包
    [root@server ~ 19:17:30]# yum install -y dhcp
    [root@server ~ 19:18:52]# /bin/cp /usr/share/doc/dhcp-*/dhcpd.conf.example /etc/dhcp/dhcpd.conf
    [root@server ~ 19:19:33]# vim /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 "gcf.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.gcf.cloud {
    hardware ethernet 00:0c:29:dc:d8:e2;
    fixed-address 10.1.1.200;
    }

    # 新增一个地址池
    # 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 "gcf.cloud";
    option routers 10.1.8.2;
    option broadcast-address 10.1.8.255;
    default-lease-time 600;
    max-lease-time 7200;
    }

    # 启用并启动服务
    [root@server ~ 14:11:08]# systemctl restart dhcpd

    # 查看服务状态
    [root@server ~ 14:28:04]# systemctl status dhcpd
    ● dhcpd.service – DHCPv4 Server Daemon
    Loaded: loaded (/usr/lib/systemd/system/dhcpd.service; enabled; vendor preset: disabled)
    Active: `active (running)` since Wed 2025-11-19 14:11:57 CST; 18min ago
    Docs: man:dhcpd(8)
    man:dhcpd.conf(5)
    Main PID: 2410 (dhcpd)
    Status: "Dispatching packets…"
    CGroup: /system.slice/dhcpd.service
    └─2410 /usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf -user dhcpd -g...

    Nov 19 14:11:57 server.gcf.cloud dhcpd[2410]: All rights reserved.
    Nov 19 14:11:57 server.gcf.cloud dhcpd[2410]: For info, please visit https:.../
    Nov 19 14:11:57 server.gcf.cloud dhcpd[2410]: Not searching LDAP since ldap...e
    Nov 19 14:11:57 server.gcf.cloud dhcpd[2410]: Wrote 0 deleted host decls to....
    Nov 19 14:11:57 server.gcf.cloud dhcpd[2410]: Wrote 0 new dynamic host decl....
    Nov 19 14:11:57 server.gcf.cloud dhcpd[2410]: Wrote 1 leases to leases file.
    Nov 19 14:11:57 server.gcf.cloud dhcpd[2410]: Listening on LPF/ens32/00:0c:...4
    Nov 19 14:11:57 server.gcf.cloud dhcpd[2410]: Sending on LPF/ens32/00:0c:...4
    Nov 19 14:11:57 server.gcf.cloud systemd[1]: Started DHCPv4 Server Daemon.
    Nov 19 14:11:57 server.gcf.cloud dhcpd[2410]: Sending on Socket/fallback/...t
    Hint: Some lines were ellipsized, use -l to show in full.

    配置路由

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

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

    # 当前实验环境: DHCP relay的第二个网卡,地址是:10.1.1.20/24 。
    # dhcp-server 去往 10.1.1.20/32 路由下一跳是 10.1.8.20
    [root@server ~ 19:24:23]# nmcli connection modify ens32 ipv4.routes '10.1.1.20/32 10.1.8.20'
    [root@server ~ 19:36:38]# nmcli connection up ens32
    Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/2)

    配置 dhcp-relay

    配置 dhcp relay
    配置网卡具体命令如下:

    在这里插入图片描述

    [root@dhcp-relay ~]# yum install -y dhcp
    [root@dhcp-relay ~]# cp /usr/lib/systemd/system/dhcrelay.service /etc/systemd/system/dhcrelay.service
    [root@dhcp-relay ~]# vim /etc/systemd/system/dhcrelay.service

    [Unit]
    Description=DHCP Relay Agent Daemon
    Documentation=man:dhcrelay(8)
    Wants=network-online.target
    After=network-online.target

    [Service]
    Type=notify
    # 在 ExecStart 参数末尾添加 DHCP 服务器 IP 地址
    ExecStart=/usr/sbin/dhcrelay -d –no-pid 10.1.8.10#这里添加10.1.8.10.
    StandardError=null

    [Install]
    WantedBy=multi-user.target

    #启用并立即启动了 DHCP 中继服务
    [root@dhcp-relay ~ 19:27:39]# systemctl enable dhcrelay.service –now

    #DHCP 用 UDP 协议:DHCP 是基于 UDP 的无连接协议,
    #ss -ulnp查看 UDP 监听端口
    [root@dhcp-relay ~ 19:28:39]# ss -lunp
    State Recv-Q Send-Q Local Address:Port Peer Address:Port
    UNCONN 0 0 *:67 *:* users:(("dhcrelay",pid=977,fd=6))

    配置路由转发

    # 开启路由转发
    [root@dhcp-relay ~]# echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf

    #使命令生效。
    [root@dhcp-relay ~]# sysctl -p /etc/sysctl.conf
    net.ipv4.ip_forward = 1

    客户端测试

    未将client段mac地址写入/etc/dhcp/dhcpd.conf时还未获取到。

    在这里插入图片描述

    改变mac地址后就可以获得到200的地址。

    在这里插入图片描述

    赞(0)
    未经允许不得转载:171主机测评 » 1.DHCP 服务器
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址