第十八章 动态主机配置协议(DHCP)
18.1. 为什么使用 DHCP
18.2. 配置 DHCP 服务器
   18.2.1. 配置文件
   18.2.2. 租期数据库
   18.2.3. 启动和停止服务器
   18.2.4. DHCP 转发代理
18.3. 配置 DHCP 客户
动态主机配置协议(DHCP)是用来自动给客户机器分配 TCP/IP 信息的网络协议。每个 DHCP 客户都连接到 DHCP 服务器,该服务器会返回包括 IP 地址、网关和 DNS 服务器信息的客户网络配置。
18.1. 为什么使用 DHCP
  • 利用 DHCP 服务器可以快速配置客户网络。当配置客户系统时,管理员可以选择 DHCP,并不必输入 IP 地址、子网掩码、网关、或 DNS 服务器。客户从 DHCP 服务器中获得这些信息。
  • DHCP在需要大批量改变系统的 IP 地址时也大有用途。只需编辑服务器上的一个 DHCP 配置文件就可获得新 IP 地址集合,新的 DNS 服务器。一旦客户的网络被重新启动(或客户重新引导系统),改变就会生效。
  • 利用DHCP来配置笔记本电脑也很方便。只要每个办公室都有一个允许它联网的 DHCP 服务器,它就可以不必重新配置而在办公室间自由移动。

TOP

18.2. 配置 DHCP 服务器

你可以使用配置文件 /etc/dhcpd.conf 来配置 DHCP 服务器。DHCP 还使用 /var/lib/dhcp/dhcpd.leases 文件来贮存客户租期数据库。

TOP

18.2.1. 配置文件

配置 DHCP 服务器的第一步是创建贮存客户网络信息的配置文件。全局选项可以为所有客户声明,可选选项可以为每个客户系统声明。该配置文件可以使用任何附加的制表符或空行来进行简单格式化。关键字是区分大小写的,起首为井号(#)的行是注释。目前实现了两种 DNS 更新方案 — 特殊 DNS 更新模式和过渡性 DHCP-DNS 互动草图更新模式。如果这两种模式被接受为 IETF 标准进程的一部分,就会出现第三个模式 — 标准 DNS 更新方法。DHCP 服务器必须配置使用这两种当前方案中的一种。版本 3.0b2pl11 以及更早的版本使用特殊模式;不过,这种模式已经过时。如果你想保留相同的行为方式,在配置文件的开头添加以下一行:

ddns-update-style ad-hoc;

要使用推荐的模式,在配置文件的开头添加以下一行:

ddns-update-style interim;

请阅读 dhcpd.conf 的说明书(man)页来获得有关不同模式的细节。

配置文件中有两类陈述:

  • 参数 — 表明如何执行任务,是否要执行任务,或将哪些网络配置选项发送给客户。

  • 声明 — 描述网络的布局;描述客户;提供客户的地址;或把一组参数应用到一组声明中。

某些参数必须以 option 关键字开头,它们也被称为选项。选项配置 DHCP 的可选选项;而参数配置的是必选的或控制 DHCP 服务器行为的值。在使用大括号({ })的部分之前声明的参数(包括选项)通常被当做全局参数。全局参数应用位于其下的所有部分。(如果你改变了配置文件,这些改变在你使用 service dhcpd restart 命令来重新启动 DHCP 守护进程之后才会生效。)

例 18-1中,routerssubnet-mask domain-namedomain-name-serverstime-offset选项被用于所有在它们下面声明的 host 声明中。如例 18-1所示,你可以声明 subnet。你必须为你的网络中的每一个子网包括一个 subnet 声明,否则, DHCP 服务器可能无法启动。在这个例子中,子网中的每个 DHCP 客户都带有全局选项,并且声明了 range。客户被分配给 range 之内的 IP 地址。

subnet 192.168.1.0 netmask 255.255.255.0 {
        option routers                  192.168.1.254;
        option subnet-mask              255.255.255.0;

        option domain-name              "example.com";
        option domain-name-servers       192.168.1.1;

        option time-offset              -18000;     # Eastern Standard Time

	range 192.168.1.10 192.168.1.100;
}

例 18-1. 子网声明

所有共享同一物理网络的子网应该在 shared-network 声明之内声明,如例 18-2所示。在 shared-network 之内,但在被包围起来的 subnet 声明之外的参数被当做全局参数。shared-network 的名称应该是对网络有描述性的标题,例如,使用 test-lab 来描述所有处于实验室(test lab)环境中的子网。

shared-network name {
    option domain-name              "test.redhat.com";
    option domain-name-servers      ns1.redhat.com, ns2.redhat.com;
    option routers                  192.168.1.254;
    more parameters for EXAMPLE shared-network
    subnet 192.168.1.0 netmask 255.255.255.0 {
        parameters for subnet
        range 192.168.1.1 192.168.1.31;
    }
    subnet 192.168.1.32 netmask 255.255.255.0 {
        parameters for subnet
        range 192.168.1.33 192.168.1.63;
    }
}

例 18-2. 共享网络声明

例 18-3中所演示,group 声明可以用来把全局参数应用到一组声明中。你可以组合共享的网络、子网、主机或其它组群。

group {
   option routers                  192.168.1.254;
   option subnet-mask              255.255.255.0;

   option domain-name              "example.com";
   option domain-name-servers       192.168.1.1;

   option time-offset              -18000;     # Eastern Standard Time

   host apex {
      option host-name "apex.example.com";
      hardware ethernet 00:A0:78:8E:9E:AA; 
      fixed-address 192.168.1.4;
   }

   host raleigh {
      option host-name "raleigh.example.com";
      hardware ethernet 00:A1:DD:74:C3:F2;
      fixed-address 192.168.1.6;
   }
}

例 18-3. 组群声明

要配置将动态 IP 地址租给子网内系统的 DHCP 服务器,用你的数值来修改 例 18-4。它为客户声明一个默认租期、最长租期、以及网络配置值。范例中把 range 192.168.1.10 和 192.168.1.100 之间的 IP 地址分配给客户。

default-lease-time 600;
max-lease-time 7200;
option subnet-mask 255.255.255.0;
option broadcast-address 192.168.1.255;
option routers 192.168.1.254;
option domain-name-servers 192.168.1.1, 192.168.1.2;
option domain-name "example.com";

subnet 192.168.1.0 netmask 255.255.255.0 {
   range 192.168.1.10 192.168.1.100;
}

例 18-4. 范围参数

要根据网卡的 MAC 地址给客户分配 IP 地址,使用 host 声明内的 hardware ethernet 参数。 如例 18-5中所演示,host apex 声明表明:网卡的 MAC 地址为 00:A0:78:8E:9E:AA 的系统所分配的 IP 地址将一直是 192.168.1.4。

注意,你还可以使用可选的参数 host-name 来为客户分配主机名。

host apex {
   option host-name "apex.example.com";
   hardware ethernet 00:A0:78:8E:9E:AA; 
   fixed-address 192.168.1.4;
}

例 18-5. 使用 DHCP 的静态 IP 地址

你可以使用 Red Hat Linux 9 的配置文件范例作为样板,然后在其上添加你自己定制的配置选项。使用下面的命令把它复制到正确的位置里:

cp /usr/share/doc/dhcp-<version-number>/dhcpd.conf.sample /etc/dhcpd.conf
(这里的 <version-number> 是你使用的 DHCP 版本)。

要获取选项陈述及其作用的完整列表,请参阅 dhcp-options 的说明书(man)页。

TOP

18.2.2. 租期数据库

在 DHCP 服务器上,/var/lib/dhcp/dhcpd.leases 文件中存放着 DHCP 的客户租期数据库。该文件不应该被手工修改。每个新近分配的 IP 地址的 DHCP 租期信息都会自动储存在租期数据库中。该信息 包括租期的长度;IP 地址被分配的对象;租期的开始和终止日期; 以及用来检索租期的网卡的 MAC 地址。

租期数据库中所用的时间是格林威治标准时间(GMT),不是本地时间。

租期数据库不时被重建,因此它不算太大。首先,所有已知的租期会被储存到一个临时的租期数据库中,dhcpd.leases 文件被重命名为 dhcpd.leases~,然后,临时租期数据库被写入 dhcpd.leases 文件。

在租期数据库被重命名为备份文件,新文件被写入之前,DHCP 守护进程有可能被杀死,系统也有可能会崩溃。如果发生了这种情况,启动服务所需的 dhcpd.leases 文件就不会存在。这时,请不要创建新租期文件。因为这样做会丢失所有原有的旧租期文件,从而导致更多问题。正确的办法是把 dhcpd.leases~ 备份文件重命名为 dhcpd.leases,然后再启动守护进程。

TOP

18.2.3. 启动和停止服务器

在你首次启动 DHCP 服务器之时,除非系统上存在 dhcpd.leases 文件,服务器将无法被启动。 如果这个文件不存在的话,使用 touch /var/lib/dhcp/dhcpd.leases 命令来创建一个。

要启动 DHCP 服务,使用 /sbin/service dhcpd start 命令。要停止 DHCP 服务器,使用 /sbin/service dhcpd stop 命令。

如果你的系统连接了不止一个网络界面,但是你只想让 DHCP 服务器启动其中之一,你可以配置 DHCP 服务器只在那个设备上启动。在 /etc/sysconfig/dhcpd 中,把界面的名称添加到 DHCPDARGS 的列表中:

# Command line options here
DHCPDARGS=eth0

如果你有一个带有两个网卡的防火墙机器,这种方法就会大派用场。一个网卡可以被配置成 DHCP 客户来从互联网上检索 IP 地址;另一个网卡可以被用作防火墙之后的内部网络的 DHCP 服务器。仅指定连接到内部网络的网卡使系统更加安全,因为用户无法通过互联网来连接它的守护进程。

其它可在 /etc/sysconfig/dhcpd 中指定的命令行选项包括:

 

  • -p <portnum> — 指定 dhcpd 应该监听的 udp 端口号码。默认值 为 67。DHCP 服务器在比指定的 udp 端口大一位的端口号码上把回应传输给 DHCP 客户。譬如,如果你接受了默认的端口 67,服务器在端口 67 上监听请求,然后在端口 68 上回应客户。如果你在此处指定了一个端口号码来使用 DHCP 转发代理,你所指定的 DHCP 转发代理的监听端口也必须是同一端口。详情请参阅 第 18.2.4 节

  • -f — 把守护进程作为前台进程运行。这在调试时最常用。

  • -d — 把 DCHP 服务器守护进程记录到标准错误描述器中。这在调试时最常用。如果它没有指定,日志将被写入 /var/log/messages

  • -cf filename — 指定配置文件的位置。默认位置是 /etc/dhcpd.conf

  • -lf filename — 指定租期数据库文件的位置。如果租期数据库文件已存在,在 DHCP 服务器每次启动时使用同一个文件至关重要。强烈建议你只在无关紧要的机器上为调试目的才使用该选项。默认的位置是 /var/lib/dhcp/dhcpd.leases.

  • -q — 在启动该守护进程时,不要显示整篇版权信息。

TOP

18.2.4. DHCP 转发代理

DHCP 的转发代理(dhcrelay)允许你把无 DHCP 服务器的子网内的 DHCP 和 BOOTP 请求转发给其它子网内的一个或多个 DHCP 服务器。

当某个 DHCP 客户请求信息时,DHCP 转发代理把该请求转发给 DHCP 转发代理启动时所指定的一列 DHCP 服务器。当某个 DHCP 服务器返回一个回应 时,该回应被广播或单播给发送最初请求的网络。

除非使用 INTERFACES 指令在 /etc/sysconfig/dhcrelay 文件中指定了接口,DHCP 转发代理监听所有接口上的 DHCP 请求。

要启动 DHCP 转发代理,使用 service dhcrelay start 命令。

TOP

18.3. 配置 DHCP 客户

配置 DHCP 客户的第一步是确定内核能够识别网卡。多数网卡会在安装过程中被识别,系统会为该卡配置恰当的内核模块。如果你在安装后安装了一张网卡,Kudzu 应该会识别它,并提示你为它配置相应的内核模块。 请确定查看 Red Hat Linux 的硬件兼容列表,它位于 http://hardware.redhat.com/hcl/。 如果网卡不是由安装程序或 Kudzu 配置的,而且你知道要为它载入哪个内核模块,那么请参阅 第31章 中关于载入内核模块的细节。

要手工配置 DHCP 客户,你需要修改 /etc/sysconfig/network 文件来启用联网;并修改 /etc/sysconfig/network-scripts 目录中每个网络设备的配置文件。在该目录中,每个设备都有一个叫做 ifcfg-eth0 的配置文件,这里的 eth0 是网络设备的名称。

/etc/sysconfig/network 文件应该包含以下行:

NETWORKING=yes

你的这个文件中可能有更多信息,但是如果你想在引导时启动联网,NETWORKING 变量必须 被设为 yes

/etc/sysconfig/network-scripts/ifcfg-eth0 文件应该包含以下几行:

DEVICE=eth0
BOOTPROTO=dhcp
ONBOOT=yes

每个你想配置使用 DHCP 的设备都需要一个配置文件。

如果你首选图形化界面来配置 DHCP 客户,请参阅第12章 来获取关于使用 网络管理工具来配置网络接口使用 DHCP 的详情。

TOP

请参考下列资料:

  • dhcpd 的说明书(man)页 — 描述 DHCP 守护进程的运行原理

  • dhcpd.conf 的说明书(man)页 — 解释如何配置 DHCP 配置文件;包括一些例子

  • dhcpd.leases 的说明书(man)页 — 解释如何配置 DHCP 租期文件;包括一些例子

  • dhcp-options 的说明书(man)页 — 解释在 dhcpd.conf 中声明 DHCP 选项的语法;包括一些例子

  • dhcrelay 的说明书(man)页 — 解释 DHCP 转发代理和它的配置选项