第 4 章 Linux DHCP 服务

作者: Brinnatt 分类: ARM64 Linux 进阶架构 发布时间: 2022-01-21 13:41

DHCP 前身是 BOOTP,在 Linux 的网卡配置中也能看到显示的是 BOOTP,DHCP 引进一个 bootp 没有的概念:租约。bootp 分配的地址是永久的,而 dhcp 分配的地址是可以有期限的。

[root@arm64v8 ~]# grep -i bootproto /etc/sysconfig/network-scripts/ifcfg-Britural-router 
BOOTPROTO=dhcp
[root@arm64v8 ~]#

DHCP 可以自动分配 IP、子网掩码、网关、DNS。

DHCP 客户端使用的端口 68,服务端使用端口 67,使用的 UDP 应用层的协议。

DHCP 一般不为服务器分配 IP,因为他们要使用固定 IP,所以 DHCP 一般只为办公环境的主机分配 IP。

DHCP 服务器和客户端需要在一个局域网内,在为客户端分配 IP 的时候需要进行多次广播。但 DHCP 也可以为其他网段内主机分配 IP,只要连接两个网段中间的路由器能转发 DHCP 配置请求即可,但这要求路由器配置中继功能。

dhcp

4.1、DHCP 客户端请求过程

局域网内 DHCP 过程:

  1. 搜索阶段:客户端广播方式发送报文,搜索 DHCP 服务器。此时网段内所有机器都收到报文,只有 DHCP 服务器返回消息。

  2. 提供阶段:众多 DHCP 服务器返回报文信息,并从地址池找一个 IP 提供给客户端。因为此时客户端还没有 IP,所以返回信息也是以广播的方式返回的。

  3. 选择阶段:选择一个 DHCP 服务器,使用它提供的 IP。然后发送广播包,告诉众多 DHCP 服务器,其已经选好 DHCP 服务器以及 IP 地址。此后没有入选的 DHCP 就可以将原本想分配的 IP 分配给其他主机。

    客户端选择第一个接收到的 IP。谁的 IP 先到客户端的速度是不可控的。但是如果在配置文件里开启了 authoritative 选项则表示该服务器是权威服务器,其他 DHCP 服务器将失效,如果多台服务器都配置了这个权威选项,则还是竞争机制;

    通过 MAC 地址给客户端配置固定 IP 也会优先于普通的动态 DHCP 分配。另外 Windows 的 DHCP 服务端回应 Windows 客户端比 Linux 更快。

  4. 确认阶段:DHCP 服务器收到回应,向客户端发送一个包含 IP 的数据包,确认租约,并指定租约时长。

跨网段 DHCP 过程:

  1. 客户端广播方式发送报文,搜索 DHCP 服务器。所有机器包括路由器都收到报文,路由器配置了中继,知道搜索消息后单播给 DHCP 服务器;
  2. DHCP 服务器单播返回信息给路由器,路由器再广播给客户端;
  3. 客户端选择 DHCP 服务器提供的 IP,并广播信息告诉它我选好了,路由器单播给 DHCP 服务器;
  4. DHCP 服务器收到信息将确认信息单播给路由器,路由器单播给客户端。

DHCP 服务器要跨网段提供服务,一样是四步请求,只不过是每一步中间都多了一个路由器和 DHCP 服务器之间的单播通信。

所以 DHCP 的 4 步请求:

Client--> DHCPDISCOVER             # 广播:客户端发现DHCP服务器
          DHCPOFFER <-- Server     # 广播:服务端提供IP给客户端

Client--> DCHPREQUEST              # 广播:客户端请求使用提供的IP
          DCHPACK <-- Server       # 单播:服务端进行确认,订立租约等信息

续租的过程:

Client--> DHCPREQUEST              # 单播:继续请求使用提供的IP
          DHCPACK <-- Server       # 单播:确认续租

DHCP 服务器不跨网段提供服务时,它自己的 IP 地址必须要和地址池中全部 IP 在同一网络中。

DHCP 服务器跨网段提供服务时,它自己的 IP 地址必须要和地址池中的一部分 IP 在同一网络中,另一部分提供给其他网段。因为如果自己的 IP 完全不在自己的网络中而只提供其他网段的 IP,更好的做法是将 DHCP 服务器设在那个需要 DHCP 服务的网络中。

当计算机从一个子网移到另一个子网,找的 DHCP 服务器不同,因为旧的租约还存在,会先续租,新的 DHCP 服务器肯定拒绝它的续租请求,这时将重新开始四步请求。

有些机器希望一直使用一个固定的 IP,也就是静态 IP,除了手动进行配置,DHCP 服务器也可以实现这个功能。DHCP 服务器可以根据 MAC 地址来分配这台机器固定 IP 地址(保留地址),即使重启或重装了系统也不会改变根据 MAC 地址分配的地址。

4.2、安装和配置 DHCP 服务

[root@arm64v8 ~]# yum install dhcp
[root@arm64v8 ~]# rpm -ql dhcp
/etc/dhcp/dhcpd.conf                            # DHCP配置文件
/usr/sbin/dhcpd                                 # DHCP服务程序
/usr/sbin/dhcrelay                              # 中继命令程序,用于跨网段提供DHCP服务
/var/lib/dhcpd/dhcpd.leases                     # 存放租借信息(如IP)和租约信息(如租约时长)
/usr/share/doc/dhcp-4.1.1/dhcpd.conf.sample     # 配置文件的范例文件

[root@arm64v8 ~]# rpm -ql dhcp
/etc/dhcp/dhcpd.conf                            # ipv4 DHCP配置文件
/etc/dhcp/dhcpd6.conf                           # ipv6 DHCP配置文件
/usr/lib/systemd/system/dhcpd.service           # ipv4 服务管理配置文件
/usr/lib/systemd/system/dhcpd6.service          # ipv6 服务管理配置文件
/usr/lib/systemd/system/dhcrelay.service        # DHCP 中继服务配置文件
/usr/sbin/dhcpd                                 # DHCP 二进制程序
/usr/sbin/dhcrelay                              # DHCP 二进制中继程序
/usr/share/doc/dhcp-4.2.5/dhcpd.conf.example    # ipv4 DHCP配置示例
/usr/share/doc/dhcp-4.2.5/dhcpd6.conf.example   # ipv6 DHCP配置示例
/var/lib/dhcpd/dhcpd.leases                     # ipv4 存放租借信息(如IP)和租约信息(如租约时长)
/var/lib/dhcpd/dhcpd6.leases                    # ipv6 存放租借信息(如IP)和租约信息(如租约时长)
[root@arm64v8 ~]#

可以将 dhcpd.conf.sample 复制到 /etc/

[root@arm64v8 ~]# cp /usr/share/doc/dhcp-4.2.5/dhcpd.conf.example /etc/dhcp/dhcpd.conf 
cp: overwrite ‘/etc/dhcp/dhcpd.conf’? y
[root@arm64v8 ~]#

以下是 dhcpd.conf 中部分配置项

ddns-update-style none;                         # 全局开启动态 dns 更新
authoritative;                                  # 声明为权威服务器
log-facility local7;                            # 定义记录日志级别
next-server pxelinux0.brinnatt.com;             # PXE环境下指定的提供引导程序的文件服务器
# DHCP配置文件里必须配置一个地址池,其和DHCP服务器自身IP在同一网段
subnet 10.5.5.0 netmask 255.255.255.224 {
  range 10.5.5.26 10.5.5.30;                                # 地址池
  option domain-name-servers ns1.internal.example.org;      # 为客户端指明DNS服务器地址,可以是多个,最多三个
  option domain-name "internal.example.org";              # 为客户端指明DNS名字,定义了它会覆盖客户端/etc/resolv.conf里的配置
  option routers 10.5.5.1;                                  # 默认路由,其实就是网关
  option broadcast-address 10.5.5.31;                       # 广播地址,不设置时默认会根据A/B/C类地址自动计算
  default-lease-time 600;                                   # 默认租约时长
  max-lease-time 7200;                                      # 最大租约时长
}

#下面的是绑定MAC地址设置保留地址,保留地址不能是地址池中的地址
host fantasia {                                             # 固定地址的配置,host后面的是标识符,没意义
hardware ethernet 08:00:07:26:c0:a5;
  fixed-address 192.168.100.3;                              # 根据MAC地址分配的固定IP 
}
  • 如果不让 dhcp 修改 /etc/resolv.conf 里的内容,就在网卡配置文件 /etc/sysconfig/network-scripts/ifcfg-ethX 里添加一行选项:PEERDNS=no。

4.3、客户端获取动态 IP

有的时候网络接口出现异常,IP 地址会丢失,如果未配置静态 IP 地址,希望通过 DHCP 获取,可以按下面步骤进行:

  1. 检查网络接口配置文件是否满足 DHCP 获取要求

    [root@arm64v8 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 
    TYPE=Ethernet
    PROXY_METHOD=none
    BROWSER_ONLY=no
    BOOTPROTO=dhcp           # 必须指定dhcp协议
    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=eth0
    UUID=9158c5f8-cec0-49ed-a847-d78143305455
    DEVICE=eth0
    ONBOOT=yes               # 接口必须开启
    [root@arm64v8 ~]#
  2. 检查硬件是否正常,比如 RJ45 接口是否插入可用网线,是否与 DHCP 服务器可通信等

    [root@arm64v8 ~]# ethtool eth0
    Settings for eth0:
    Supported ports: [ TP MII ]
    Supported link modes:   10baseT/Half 10baseT/Full 
                            100baseT/Half 100baseT/Full 
                            1000baseT/Full 
    Supported pause frame use: Symmetric Receive-only
    Supports auto-negotiation: Yes
    Supported FEC modes: Not reported
    Advertised link modes:  10baseT/Half 10baseT/Full 
                            100baseT/Half 100baseT/Full 
                            1000baseT/Full 
    Advertised pause frame use: No
    Advertised auto-negotiation: Yes
    Advertised FEC modes: Not reported
    Link partner advertised link modes:  10baseT/Half 10baseT/Full 
                                         100baseT/Half 100baseT/Full 
                                         1000baseT/Full 
    Link partner advertised pause frame use: Symmetric Receive-only
    Link partner advertised auto-negotiation: Yes
    Link partner advertised FEC modes: Not reported
    Speed: 1000Mb/s
    Duplex: Full
    Port: MII
    PHYAD: 4
    Transceiver: internal
    Auto-negotiation: on
    Supports Wake-on: d
    Wake-on: d
    Current message level: 0x0000003f (63)
                   drv probe link timer ifdown ifup
    Link detected: yes      # 为yes说明线路没有问题
    [root@arm64v8 ~]#
  3. 使用命令管理获取 ip 地址

    [root@arm64v8 ~]# systemctl restart network      # 重启网络服务可自动获取ip地址
    [root@arm64v8 ~]# dhclient -r                    # 手动删除ip地址
    [root@arm64v8 ~]# dhclient -v                    # 手动广播获取ip地址
标签云