您的位置:首页 > 运维架构 > Linux

Linux系统管理实践(9):DHCP服务器配置

2010-01-18 20:37 656 查看
    一般来讲,如果你有一个有线调制解调器或者数字用户线路,你就可以使用家里的电脑获取由你的服务提供商动态分配的IP地址。如果在调制解调器和本地网络之间安装了有线/数字用户线路的路由器,你的电脑很有可能是在启动过程中从路由器获取了IP地址。你也可以选择禁用本地路由器中DHCP服务器的功能,而设置一个Linux机器作为DHCP服务器。

    首先要安装dhcp服务器。在RedHat/Fedora中,DHCP服务器的RPM包的命名往往以dhcp开始,后跟一个版本号,比如这样dhcp-3.0.1rc14-1.i386.rpm。对 Debian/Ubuntu来说软件包名称可能也包含版本号. 用 dpkg --list | grep dhcp 来查询到一个所有dhcp软件包的列表,从而找到dhcp服务器的软件包名称(比如dhcp3-server)。为了方便,我们可以将dhcp的服务器和客户端同时安装。

    1、DHCP的配置文件:
RedHat/Fedora下为/etc/dhcpd.conf,在Debian/Ubuntu下为/etc/dhcp3/dhcpd.conf。内容如下:

# ISC dhcpd for Debian的简单配置文件
# 注意:如果/etc/ltsp/dhcpd.conf存在,则将代替本文件作为dhcpd的配置文件
# $Id: dhcpd.conf,v 1.1.1.1 2002/05/21 00:07:44 peloy Exp $
# ddns-updates-style参数:过度性DHCP-DNS互动更新。控制服务器当一个租期被确认时,
# 是否尝试做一个DNS更新。在版本2的包中我们使用默认值'none',因为从DHCP v2开始
# 已经不支持DDNS了
ddns-update-style none;
# 对所有被支持的网络的通用选项定义...
# 为DHCP客户端设置DNS域名
option domain-name "example.org";
# 为DHCP客户端设置DNS服务器名(也可用IP地址)
option domain-name-servers ns1.example.org, ns2.example.org;
# 默认的地址租期(秒)
default-lease-time 600;
# 最长的地址租期
max-lease-time 7200;
# 如果本DHCP服务器是是本地网络正式的DHCP服务器,则authoritative指示符应该激活
#authoritative;
# 使用本选项来发送dhcp日志消息给一个不同的日志文件(你还需要修改syslog.conf以完成重定向)
log-facility local7;
# 在本子网上没有任何的服务,但声明它可以帮助DHCP服务器理解网络的拓扑结构
subnet 10.152.187.0 netmask 255.255.255.0 {
}
# 这是一个非常基本的子网声明
subnet 10.254.239.0 netmask 255.255.255.224 {
range 10.254.239.10 10.254.239.20;  # 能够分配的IP地址范围
# 客户端的默认网关(也可用IP地址而不是主机全名)
option routers rtr-239-0-1.example.org, rtr-239-0-2.example.org;
}
# 这个声明允许BOOTP客户端获取动态的地址,在实际中我们并不建议这样做
subnet 10.254.239.32 netmask 255.255.255.224 {
range dynamic-bootp 10.254.239.40 10.254.239.60; # 设置允许BOOTP的地址池
option broadcast-address 10.254.239.31;   # 客户端广播地址
option routers rtr-239-32-1.example.org;  # 默认网关
}
# 对内部子网的一个稍微不同的配置
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域名
option routers 10.5.5.1;                    # 默认网关
option broadcast-address 10.5.5.31;         # 广播地址
default-lease-time 600;  # 默认的地址租期(秒)
max-lease-time 7200;     # 最长的地址租期
}
# 需要特殊配置选项的主机可以列在主机语句段中。如果没有指定地址,那么地址将动态分配(如果可能的话),
# 但特定于主机的信息仍然来自于主机声明
host passacaglia {
hardware ethernet 0:0:c0:5d:bd:95;  # 设置主机passacaglia的MAC地址
filename "vmunix.passacaglia";
server-name "toccata.fugue.com";
}
# 可以为主机(在指定的MAC地址上)分配固定的IP地址。这些地址不应该在可动态分配的地址池中。指定
# 了固定IP地址的主机能用BOOTP或DHCP协议来引导。没有指定固定IP地址的主机则只能用DHCP来引导,
# 除非在子网上存在一个地址范围,在这个地址范围中有一个设置了dynamic-bootp标志的BOOTP客户端
# 已经连接
# 为主机fantasia分配固定的IP地址
host fantasia {
hardware ethernet 08:00:07:26:c0:a5;
fixed-address fantasia.fugue.com;  # 分配一个映射到fantasia.fugue.com的固定IP地址
}
# 你可以声明一个客户端类,然后基于这个类来进行地址分配。下面的例子表示这样一个情况:类中的
# 所有客户端在子网10.17.224/24上获取地址,而所有其他的客户端在子网10.0.29/24上获取地址
class "foo" {
match if substring (option vendor-class-identifier, 0, 4) = "SUNW";
}
shared-network 224-29 {
subnet 10.17.224.0 netmask 255.255.255.0 {
option routers rtr-224.example.org;
}
subnet 10.0.29.0 netmask 255.255.255.0 {
option routers rtr-29.example.org;
}
pool {
allow members of "foo";
range 10.17.224.10 10.17.224.250;
}
pool {
deny members of "foo";
range 10.0.29.10 10.0.29.230;
}
}


    其他的一些常用选项:

ignore client-updates;              # 忽略客户端更新

option subnet-mask 255.255.255.0;   # 设置客户端子网掩码

option ip-forwarding off;           # 不从一个网口向另一个网口转发DHCP请求

option nis-domain “fengzl.com”;     # 设置客户端NIS域名

option time-offset -18000;          # 设置与格林威治时间的偏移时间(秒)

option nntp-server 192.168.1.100;   # 设置客户端NTP服务器

option netbios-name-servers 192.168.1.100;   # 设置客户端WINS服务器

nest-server marvin.redhat.com;      # 设置用于定义服务器从引导文件中装入的主机名, 用于无盘工作站

    还有许多其他选项来配置DHCP,包括告诉DHCP客户端哪里提供finger以及IRC服务。在安装后请用man dhcp-options查看其手册页。特别要说明的是,dhcpd.conf文件里面的host指令非常有用。像网络上打印机这样一些设备默认是通过DHCP获得IP地址的,但是用户可以用固定IP地址区访问。这个指令可以用来为一个已经预先知道网卡MAC地址的DHCP客户端提供静态IP地址。这可以降低系统管理开销。

    2、客户租期数据库文件/var/lib/dhcp/dhcpd.leases:
要运行DHCP服务器,还需要一个客户租期数据库文件/var/lib/dhcp/dhcpd.leases,该文件初始为空,且无需管理员手工配置,但管理员可以浏览此文件查看DHCP服务器的运行情况。文件包含租期声明,每次一个租期被获取,更新或释放,它的新值就被记录到文件的末尾。文件的格式可参考dhcpd.leases(5) manual page。注意dhcpd.leases的时间记录采用GMT(格林威治)时间,而不是本地时区的时间,要查看GMT时间用date –u。Ubuntu中dhcpd.leases内容如下:

# 本文件中的所有时间都是UTC(GMT),而不是本地时区内的时间。这并不是一个bug,因此不要对它有什么
# 疑惑。把租约存储在本地时区中是不可移植的方式,因此请不要希望能有这个特性。如果这让你觉得不方
# 或者困惑,非常抱歉。
# 本文件的格式可参考dhcpd.leases(5)手册页。本租约文件为isc-dhcp-V3.0.6编写。


    在一些旧版本的RedHat/Fedora上,可能没有dhcpd.leases文件,可用命令touch /var/lib/dhcp/dhcpd.leases去创建一个。

    配置完后,服务器上要启动或重启DHCP,RedHat/Fedora下用命令service dhcpd start、service dhcpd stop、service dhcpd restart,为指定的网络接口启动DHCP服务器可用echo “DHCPDARGS=eth0” >> /etc/sysconfig/dhcpd。配置DHCP在电脑启动时自动运行用chkconfig dhcpd on。在Debian/Ubuntu上可用sudo /etc/init.d/dhcp3-server start等命令,配置DHCP在电脑启动时自动运行用sysv-rc-conf dhcpd3-server on。

    最后,要记住客户端电脑要把网卡配置为用DHCP来获得它的IP地址。可用命令iface eth0 inet dhcp,或者直接修改/etc/network/interfaces文件。对于Windows客户端,Windows默认对所有网口使用DHCP,所以你不用担心需要重新配置。

    以上就是DHCP常用配置,实际应用DHCP还要考虑IP分配的一些策略问题,同时要保证网络的健壮性,必须至少要有两台DHCP服务器一起工作,如果一台出了故障,另一台可以继续为DHCP客户服务。然而目前DHCP协议里并没有能让两台DHCP服务器协同工作的机制,不能保证分配的地址的唯一性,所以这两台DHCP服务器里的可分配地址空间必须进行调整,不能有交叉重复的IP地址。

    3、配置实例:

    我的实验室是校园网内的一个局域网,有30台主机,因此主机地址部分有一个字节足够了。我把它配置成一个C类子网,网络地址为192.168.0.0(是一个私有地址,专门为组织机构内部使用,并不是一个在Internet上公开的地址),子网掩码为255.255.255.0。子网的广播地址为192.168.0.255,默认网关为192.168.0.1(即局域网内的路由器的LAN口地址,而WAN口地址则为局域网外的某台路由器地址或ISP提供的地址),局域网内各个主机的网关都应该指向这个地址,表示数据包直接通过这个路由器进来或出去。指定的动态IP地址范围为192.168.0.100~192.168.0.199。对网内的主机laptop-zhou做MAC和IP地址绑定,绑定的IP地址不应该在动态IP地址范围内。配置好后的dhcpd.conf文件如下:

# 默认租期为1天
default-lease-time 86400
# 最大租期为10天
max-lease-time 864000
# 定义网络地址为192.168.0.0,子网掩码为255.255.255.0
subnet 192.168.0.0 netmask 255.255.255.0{
# 动态分配的IP地址范围
range 192.168.0.100 192.168.0.199;
# 广播地址,注意是根据上面的网络地址,子网掩码计算出来的
option broadcast-address 192.168.0.255;
# 默认网关
option routers 192.168.0.1;
# DNS服务器:一个是我配置的内网的DNS服务器,一个是外网的DNS服务器
option domain-name-servers 192.168.0.219 202.120.190.208;
}
host laptop-zhou{  # 对网内的一台主机做MAC和IP地址绑定,即分配固定的IP
hardware ethernet 00:21:86:5a:a6:56;      # 主机laptop-zhou的MAC
fixed-address 192.168.0.207;              # 分配固定IP
option broadcast-address 192.268.0.255;   # 广播地址
option routers 192.168.0.1;               # 默认网关
option domain-name-servers 192.168.0.219; # DNS服务器
}


    4、有多个网卡的DHCP服务器:
当一台被配置为动态获得IP(DHCP)的电脑启动时,他向DHCP服务器申请一个IP地址。这是通过向DHCP服务器发送一个标准的DHCP申请实现的。这个申请是一个广播桢,源IP地址为255.255.255.255。如果你的DHCP服务器有多个网络接口,你必须为这个255.255.255.255添加一条路由表项,让服务器进程知道往哪个接口发送回应;否则,回应会被发往默认网关(我们假设DHCP请求来自接口eth0)。注意你不能在多个网口上运行多个DHCP服务器,因为网络255.255.255.255只能有一个路由表项。如果你一定要这样,你会发现DHCP服务器只在一个网口上工作。你可以用命令route add -host 255.255.255.255 dev eth0为255.255.255.255添加一个临时路由项。

    5、使用一个DHCP服务器为多个网络服务:
DHCP客户端发送一个请求IP地址的广播桢,而广播桢是被限制在局域网里面的。这本来意味着每个子网都需要一个DHCP服务器。但是,可以通过配置路由器向许多跳之外的DHCP服务器转发DHCP请求。这是通过将路由器在DHCP客户端接口的IP地址插入到转发的桢里面。对于DHCP服务器,非空的路由器的IP地址优先于广播地址考虑,并向该地址提供对DHCP客户端很重要的IP地址。DHCP服务器用一个广播桢响应,而记录了原先的DHCP请求的路由器再把这个响应桢转发给DHCP客户端。你可以用 ip helper-address 命令让Cisco路由器在所有有DHCP客户端的接口中启用该功能。下面是一个配置实例,DHCP服务器的地址为192.168.36.25:

interface FastEthernet 2/1
ip address 192.168.1.30 255.255.255.0
ip helper-address 192.168.36.25


    6、简单的DHCP故障排解:
DHCP最常见的问题常跟服务器无关;在服务器端被正确配置之后就没必要作任何更改,服务器会运行的很好。问题常常由客户端各种各样的原因导致。

    (1)DHCP客户端包含169.254.0.0地址:当Microsoft DHCP客户端找不到DHCP服务器,他们就会默认从169.254.0.0网络中选择一个IP地址,直到找到DHCP服务器为止,这常被称为Automatic Private IP Addressing(APIPA)。你可以采取一下步骤解决该问题:

    * 确定DHCP服务器配置正确并使用先前讲到的 pgrep 命令来确定DHCP服务器进程在运行。特别注意 255.255.255.255 路由项,尤其当你有多个网口时。

    * 从DHCP服务器能够分配的IP地址里面选一个给DHCP客户端,然后看客户端能不能ping通DHCP服务器。如果不能,再次检查线缆与网卡。

    * DHCP使用BOOTP协议在客户端与服务器间交换信息。确定防火墙没有阻止通信。DHCP服务器在UDP端口67接收请求,DHCP客户端在UDP端口68等待响应,在服务器网卡上使用tcpdump检查通信数据流是否正确。

    (2)DHCP服务器无法启动:常见的原因有/etc/dhcpd.conf文件配置错误,例如没有定义DHCP服务器负责的网络;防火墙阻止了依赖于UDP端口67和68的 DHCP bootp协议;当客户端位于另外一个网络时,路由器没有转发DHCP服务器的bootp数据包;等等。经常地查看/var/logs/messages文件以确定是否有DHCP错误发生,同时记得当你升级操作系统的时候寄存在配置文件里的关键字可能改变。经常查阅版本发布通知以确保关键字没有改变。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息