DHCP 服务

DHCP 服务器

DHCP(Dynamic Host Configuration Protocol)服务器的主要工作是自动地将网络参数分配给网络中的计算机,这些网络参数包括 IP,网关,DNS 地址等。

一般 DHCP 服务器用在计算机(或移动设备)数量众多的局域网内。如果局域网内计算机数量较少,使用手动配置 IP 能节省开机后从 DHCP 服务器获取 IP 的时间。

DHCP 协议

DHCP 通常是用于局域网内的一个通信协议,它主要通过客户端发送广播数据包给整个物理网段内的所有主机,如果有 DHCP 服务器则会响应客户端的 IP 参数要求。

整个请求过程如下:

  1. 若客户端网卡设置为自动获得 IP, 则当客户端开机或重启网卡时,网卡会发送搜索 DHCP 服务器的 UDP 数据包给整个物理网段。广播数据包发送目标为 255.255.255.255,因此一般主机会直接忽略此包,只有 DHCP 服务器会响应。

  2. DHCP 服务器端在接收到客户端请求后,会针对客户端的 MAC 地址与本身的设置数据来进行下面工作:

    • 到服务器日志查询该用户是否曾租用过某个 IP,若有记录且该 IP 当前闲置,则提供此 IP 给客户端。
    • 若配置文件针对此 MAC 地址设置了固定 IP,则将此 IP 分配给客户端。
    • 如果不符合上面两个条件,则随机选取当前没有被使用的 IP 参数给客户端,并记录下来。

    由于客户端此时没有 IP 地址,因此针对客户端 MAC 来给与回应,此时服务端会保留这个租约然后等待客户端回应。

  3. 有可能局域网内不止一台 DHCP 服务器,客户端需要选择确认 DHCP 服务器提供的相关网络参数租约。当决定好要使用的参数后,客户端开始使用这组网络参数来配置自己的网络环境。此外,客户端也会发送一个广播数据包告知已接受该服务器的租约。没有被接受的 DHCP 服务器会回收对应 IP 租约。

  4. DHCP 服务器端收到客户端确认选择后,会回送确认的响应数据包,并告知客户端这个租约的期限,并开始倒计时。当租约到期且没重新收到申请(renew)时,IP 将会被收回,用户可以向 DHCP 服务器再次要求分配 IP。此外,客户端如果脱机,DHCP 服务器也会将 IP 收回。

一般来说,DHCP 客户端程序大多会主动依据租约时间去重新申请 IP,时间点为租约时间过半和过掉九成。服务端使用 67 端口监听客户请求,而客户端使用 68 端口向 DHCP 服务器请求。

DHCP 服务器配置

使用 Linux 架设 DHCP 服务器需要安装 dhcp 服务:

[root@server2 ~]$ yum -y install dhcp

安装完毕后需要修改配置文件 /etc/dhcp/dhcpd.conf 后才能启动。作为参考可以查看示例文件 /usr/share/doc/dhcp-4.2.5/dhcpd.conf.example

服务器配置文件分为两大块,全局配置和 IP 分配设置。

全局配置

假设整个局域网只有一个子网,那除了 IP 分配之外的配置参数可以放在全局设置区域中。主要参数如下:

  • default-lease-time:默认租约时间,单位是秒。如果用户没有特别要求租约时间,那么使用此默认值。
  • max-lease-time:最大租约时间,设置用户能请求的最大租约时间限制。
  • option domain-name:在用户查找的主机名后自动加上此域名后缀。
  • option domain-name-servers:设置客户端的 DNS 服务器。
  • ddns-update-style:通过 ddns 来更新主机名与 IP 的对应关系。
  • option routers:设定网关的 IP 地址。

IP 分配设置

根据分配类型动态 IP 使用 range 参数指定。例如分配范围 10.1.1.101~10.1.1.200:

subnet 10.1.1.0 netmask 255.255.255.0 {
  range 10.1.1.101 10.1.1.200;
}

静态 IP 分配指定 MAC 地址与对应的固定 IP。例如设置主机名 server1,绑定 MAC 地址 10.1.1.103:

host server1 {
  hardware ethernet 00:0c:29:ab:18:72;
  fixed-address 10.1.1.103;
}

配置文件

整个配置文件内容如下:

[root@server2 ~]$ vi /etc/dhcp/dhcpd.conf
default-lease-time 600;
max-lease-time 7200;
log-facility local7;
option domain-name-servers 8.8.8.8, 114.114.114.114;
option routers 10.1.1.1;

subnet 10.1.1.0 netmask 255.255.255.0 {
  range 10.1.1.101 10.1.1.200;
}

host server1 {
  hardware ethernet 00:0c:29:ab:18:72;
  fixed-address 10.1.1.103;
}

之后就可以启动 dhcp 服务器了:

[root@server2 ~]$ systemctl start dhcpd

在客户端中获取到的 IP 参数信息保存在 /var/lib/dhclient/dhclient.leases 文件中:

[root@server3 ~]$ cat /var/lib/dhclient/dhclient.leases 
lease {
  interface "ens37";
  fixed-address 10.1.1.129;
  option subnet-mask 255.255.255.0;
  option dhcp-lease-time 1800;
  option dhcp-message-type 5;
  option domain-name-servers 10.1.1.1;
  option dhcp-server-identifier 10.1.1.254;
  option broadcast-address 10.1.1.255;
  option domain-name "localdomain";
  renew 5 2021/09/24 03:02:47;
  rebind 5 2021/09/24 03:17:31;
  expire 5 2021/09/24 03:21:16;
}

服务端的记录保存在 /var/lib/dhcpd/dhcpd.leases 文件中。

通过网络唤醒

在局域网内的计算机只要支持且开启了网络唤醒功能,就可以使用 ether-wake 命令来让目标从关机状态开机。

例如唤醒 MAC 地址为 AA:BB:CC:DD:EE:FF 的主机开机:

[root@server2 ~]$ ether-wake -i ens33 AA:BB:CC:DD:EE:FF