1、Linux 下配置完整安全的 DHCP 服务器详解 来源: Linux 技术中坚站 作者:赛迪网 曹江华 等级:默认等级 发布于 2005-06-01 22:55 被读 39078 次 【字体:大 中 小】 DHCP 是动态主机配置协议。这个协议用于向计算机自动提供 IP 地址, 子网掩码和路由信息。网络管理员通常会分配某个范围的 IP 地址来分发给局域网上的客户机。当设备接入这个局域网时,它们会向 DHCP 服务器请求一个 IP 地址。然后 DHCP 服务器为每个请求的设备分配一个地址,直到分配完该范围内的所有 IP 地址为止。已经分配的 IP 地址必须定时地延长借用期。这个延期的过程称作l
2、easing,确保了当客户机设备在正常地释放 IP 地址之前突然从网络断开时被分配的地址可以归还给服务器。本文以 Redhat Linux 9.0 为例,介绍如何建立一个完整和安全的 DHCP 服务器。 一、建立 DHCP 服务器配置文件 可以使用 Redhat Linux 9.0 自身携带 rpm 包安装。安装结束后 , DHCP 端口监督程序 dhcpd配置文件是/etc 目录中的名为 dhcpd.conf 的文件。下面手工建立/etc/dhcpd.conf 文件。/etc/dhcpd.conf 通常包括三部分:parameters 、declarations 、option。 1.DHC
3、P 配置文件中的 parameters(参数):表明如何执行任务,是否要执行任务,或将哪些网络配置选项发送给客户。主要内容见表 1参 数 解 释ddns-update-style 配置 DHCP-DNS 互动更新模式。default-lease-time 指定确省租赁时间的长度,单位是秒。max-lease-time 指定最大租赁时间长度,单位是秒。hardware 指定网卡接口类型和 MAC 地址。server-name 通知 DHCP 客户服务器名称。get-lease-hostnames flag 检查客户端使用的 IP 地址。fixed-address ip 分配给客户端一个固定的地址
4、。authritative 拒绝不正确的 IP 地址的要求。2. DHCP 配置文件中的 declarations (声明):用来描述网络布局、提供客户的 IP 地址等。主要内容见表 2:声 明 解 释shared-network 用来告知是否一些子网络分享相同网络。subnet 描述一个 IP 地址是否属于该子网。range 起始 IP 终止 IP 提供动态分配 IP 的范围。host 主机名称 参考特别的主机。group 为一组参数提供声明。allow unknown-clients;deny unknown-client 是否动态分配 IP 给未知的使用者。allow bootp;den
5、y bootp 是否响应激活查询。allow booting;deny booting 是否响应使用者查询。filename 开始启动文件的名称,应用于无盘工作站。next-server 设置服务器从引导文件中装如主机名,应用于无盘工作站。3. DHCP 配置文件中的 option(选项):用来配置 DHCP 可选参数,全部用 option 关键字作为开始,主要内容包括见表 3:选 项 解 释subnet-mask 为客户端设定子网掩码。domain-name 为客户端指明 DNS 名字。domain-name-servers 为客户端指明 DNS 服务器 IP 地址。host-name 为客
6、户端指定主机名称。routers 为客户端设定默认网关。broadcast-address 为客户端设定广播地址。ntp-server 为客户端设定网络时间服务器 IP 地址。timeoffset 为客户端设定和格林威治时间的偏移时间,单位是秒。注意:如果客户端使用的是视窗操作系统,不要选择“host-name“选项,即不要为其指定主机名称。 下面是一个笔者使用的 DHCP 配置文件,这是一个类网络,共 126 个 IP 地址可以分配的例子。读者可以复制后使用,注意红色部分是必须要修改的。 ddns-update-style interim; ignore client-updates;sub
7、net 192.168.1.0 netmask 255.255.255.0 option routers 192.168.1.254;option subnet-mask 255.255.255.0;option broadcast-address 192.168.1.255;option domain-name-servers 192.168.1.3;option domain-name ““; #DNS 名称 #option domain-name-servers 192.168.1.3;option time-offset -18000; range dynamic-bootp 192.
8、168.1.128 192.168.1.255;default-lease-time 21600;max-lease-time 43200;host ns hardware ethernet 52:54:AB:34:5B:09;#运行 DHCP 的网络接口的 MAC 地址#fixed-address 192.168.1.9;二、建立客户租约文件 运行 DHCP 服务器还需要一个名为 dhcpd.leases 的文件,保持所有已经分发出去的 IP 地址。在 Redhat Linux 发行版本中,该文件位于 /var/lib/dhcp/ 目录中。如果您通过 RPM 安装 ISC DHCP,那么该目
9、录应该已经存在。dhcpd.leases 的文件格式为: Leases address statement一个典型的文件内容如下: lease 192.168.1.255 #DHCP 服务器分配的 IP 地址#starts 1 2005/05/02 03:02:26; # lease 开始租约时间#ends 1 2005/05/02 09:02:26; # lease 结束租约时间# binding state active;next binding state free;hardware ethernet 00:00:e8:a0:25:86; #客户机网卡 MAC 地址#uid “%cont
10、ent%01%content%00%content%00350240%206“; #用来验证客户机的 UID 标示#client-hostname “cjh1“; #客户机名称#注意 lease 开始租约时间和 lease 结束租约时间是格林威治标准时间(GMT),不是本地时间。 第一次运行 DHCP 服务器时 dhcpd.leases 是一个空文件,也不用手工建立。如果不是通过 RPM 安装 ISC DHCP,或者 dhcpd 已经安装,那么您应该试着确定 dhcpd 将其 lease 文件写到何处,并确保该文件存在。也可以手工建立一个空文件: #touch /var/lib/dhcp/dh
11、cpd.leases三、启动和检查 DHCP 服务器 使用命令启动 DHCP 服务器: #service dhcpd start使用 ps 命令检查 dhcpd 进程: #ps -ef | grep dhcpdroot 2402 1 0 14:25 ? 00:00:00 /usr/sbin/dhcpdroot 2764 2725 0 14:29 pts/2 00:00:00 grep dhcpd使用检查 dhcpd 运行的端口: # netstat -nutap | grep dhcpdudp 0 0 0.0.0.0:67 0.0.0.0:* 2402/dhcpd四、配置 DHCP 客户端 通
12、常网管员使用选择手工配置 DHCP 客户,需要修改 /etc/sysconfig/network 文件来启用联网;并修改 /etc/sysconfig/network-scripts 目录中每个网络设备的配置文件。在该目录中,每个设备都有一个叫做 ifcfg-eth? 的配置文件,eth?是网络设备的名称。 如 eth0 等。如果你想在引导时启动联网,NETWORKING 变量必须 被设为 yes。 除了此处之外 /etc/sysconfig/network 文件应该包含以下行: NETWORKING=yesDEVICE=eth0BOOTPROTO=dhcpONBOOT=yes五、DHCP 配
13、置常见错误排除 通常配置 DHCP 服务器很容易,不过,在这里有一些技巧可以帮助您避免出现问题。对服务器而言,要确保网卡正常工作,并具备广播功能。对客户机而言,还要确保客户机的网卡正常工作。最后,要考虑网络的拓扑,并考虑客户机向 DHCP 服务器发出的广播消息是否会受到阻碍。另外如果 dhcpd进程没有启动,那么可以浏览 syslog 消息文件来确定是哪里出了问题。这个消息文件通常是 /var/log/messages。 典型故障: 1.DHCP 服务器配置完成,没有语法错误。但是网络中的客户机却没办法取得 IP 地址。 通常是 Linux DHCP 服务器沒有办法接收來自 255.255.2
14、55.255 的 DHCP 客户机的 Request 封包造成的。一般是 Linux DHCP 服务器的网卡没有设置具有 MULTICAST 功能。为了让dhcpd(dhcp 程序的守护进程 )能够正常的和 DHCP 客户机沟通,dhcpd 必须传送封包到255.255.255.255 这个 IP 地址,但是有些 Linux 系统里 255.255.255.255 这个 IP 地址被用来做为监听区域子网域(local subnet)广播的 IP 地址,所以需要在路由表(routing table)里加入255.255.255.255 以激活 MULTICAST 功能; 使用命令: route
15、add -host 255.255.255.255 dev eth0如果报告错误消息:255.255.255.255:Unkown host 那么请先修改/etc/hosts 加入一行: 255.255.255.255 dhcp 2. DHCP 客户端程序和 DHCP 服务器不兼容 由于 Linux 有许多发现版本,不同版本使用 DHCP 客户端程序和 DHCP 服务器也不相同。Linux提供了四种 DHCP 客户端程序:pump, dhclient, dhcpxd, 和 dhcpcd。了解不同 Linux 发行版本的服务器端和客户端程序对于常见错误排除是必要的。笔者曾经遇到过使用 SuSE
16、Linux 9.1 DHCP 服务器和使用 Mandrake Linux 9.0 客户机不兼容的情况。此时就必须更换客户端程序。方法是先停止客户机的网络服务,卸载原程序,安装和服务器端兼容程序。附表:主要 Linux 发行版使用的 DHCP客户端。发行版本缺省 DHCP 客户端可选 DHCP 客户端DHCP 客户端启动脚本 附加配置文件Red Hat Linux 9.0 dhclient 无 /sbin/ifup/etc/sysconfig/network/etc/sysconfig/network-scripts/ifcfg-eth0Debian Linux 3.0 dhclient 无 /
17、sbin/ifup/etc/network/interfaces/etc/dhclient.confMandrake Linux 9.1 dhclientdhcpcd, dhcpxd, pump/sbin/ifup/etc/sysconfig/network/etc/sysconfig/network-scripts/ifcfg-eth0/etc/dhclient-eth0.confSuSE Linux 9.1 dhcpcd dhclient /sbin/ifup-dhcp/etc/sysconfig/network/dhcp/etc/sysconfig/network/ifcfg-eth0六
18、、DHCP 服务器的安全 1. 在指定网络接口启动 DHCP 服务器 如果你的 Linux 系统连接了不止一个网络界面,但是你只想让 DHCP 服务器启动其中之一,你可以配置 DHCP 服务器只在那个设备上启动。在 /etc/sysconfig/dhcpd 中,把界面的名称添加到 DHCPDARGS 的列表中: DHCPDARGS=eth0或者直接使用命令: Echo “DHCPDARGS=eth0“ /etc/ sysconfig/dhcpd这样对于带有两个网卡的防火墙机器,更加安全:一个网卡可以被配置成 DHCP 客户来从互联网上检索 IP 地址;另一个网卡可以被用作防火墙之后的内部网络的
19、 DHCP 服务器。仅指定连接到内部网络的网卡使系统更加安全,因为用户无法通过互联网来连接它的守护进程。 2. 让 DHCP 服务器在监牢中运行 所谓“监牢“就是指通过 chroot 机制来更改某个软件运行时所能看到的根目录,即将某软件运行限制在指定目录中,保证该软件只能对该目录及其子目录的文件有所动作,从而保证整个服务器的安全。这样即使出现被破坏或被侵入,所受的损失也较小。 将软件 chroot 化的一个问题是该软件运行时需要的所有程序、配置文件和库文件都必须事先安装到 chroot 目录中,通常称这个目录为 chroot jail(chroot“ 监牢“)。如果要在“监牢“ 中运行dhcp
20、d,而事实上根本看不到文件系统中那个真正的目录。因此需要事先创建目录,并将 dhcpd 复制到其中。同时 dhcpd 需要几个库文件,可以使用 ldd(library Dependency Display 缩写)命令,ldd 作用是显示一个可执行程序必须使用的共享库。 ldd dhcpdlibc.so.6 = /lib/tls/libc.so.6 (0x42000000)/lib/ld-linux.so.2 = /lib/ld-linux.so.2 (0x40000000)style=font-family:宋体这意味着还需要在“监牢“ 中创建 lib 目录,并将库文件复制到其中。手工完成这一
21、工作是非常麻烦的,此时可以用 jail 软件包来帮助简化 chroot“监牢“建立的过程。 (1)Jail 软件的编译和安装 Jail 官方网站是: http:/ ,最新版本: 1.9a。 #Wget http:/ . il/jail_1.9a.tar.gz #tar xzvf jail.tar.gz; cd jail/src#make; make install(2)用 jail 创建监牢 jail 软件包提供了几个 Perl 脚本作为其核心命令,包括 mkjailenv、addjailuser 和 addjailsw。 mkjailenv:创建 chroot“监牢“目录,并且从真实文件系统
22、中拷贝基本的软件环境。addjailsw :从真实文件系统中拷贝二进制可执行文件及其相关的其它文件(包括库文件、辅助性文件和设备文件)到该“监牢“中。addjailuser :创建新的 chroot“监牢“用户。 首先停止目前 dhcpd 服务,然后建立 chroot 目录: #/sbin/service dhcpd start#mkjailenv /chroot/mkjailenvA component of Jail (version 1.9 for linux)http:/www.gsyc.inf.uc3m.es/assman/jail/Juan M. Casillas Making c
23、hrooted environment into /chrootDoing preinstall()Doing special_devices()Doing gen_template_password()Doing postinstall()Done.下面的例子展示为“监牢“ 添加 dhcpd 程序的过程: # addjailsw /chroot/ -P /usr/sbin/dhcpdaddjailswA component of Jail (version 1.9 for linux)http:/www.gsyc.inf.uc3m.es/assman/jail/Juan M. Casilla
24、s Guessing dhcpd args(0)Warning: file /chroot/lib/tls/libc.so.6 exists. Overwritting itWarning: file /chroot/lib/ld-linux.so.2 exists. Overwritting itDone.不用在意那些警告信息,因为 jail 会调用 ldd 检查 dhcpd 用到的库文件。而几乎所有基于共享库的二进制可执行文件都需要上述的几个库文件。接下来将 dhcpd 的相关文件拷贝到“监牢“ 中: # mkdir -p /chroot/dhcp/etc# cp /etc/dhcpd.c
25、onf /chroot/dhcp/etc/# mkdir -p /chroot/dhcp/var/state/dhcp# touch /chroot/dhcp/var/state/dhcp/dhcp.leases重新启动 dhcpd: rootwww root# /chroot/usr/sbin/dhcpd使用 ps 命令检查 dhcpd 进程: #ps -ef | grep dhcpdroot 2402 1 0 14:25 ? 00:00:00 /chroot/usr/sbin/dhcpd root 2764 2725 0 14:29 pts/2 00:00:00 grep dhcpd注意此时进程名称已经改变,使用检查 dhcpd 运行的端口: # netstat -nutap | grep dhcpdudp 0 0 0.0.0.0:67 0.0.0.0:* 2402/dhcpd端口号没有改变。现在 dhcpd 已经成功运行在“监牢“中。到此为止一个这样,一个完整和安全的 DHCP 服务器就完成了。