分类: LINUX
2006-11-24 23:35:53
在TCP/IP网络上,每台工作站要能存取网络上的资源之前,都必须进行基本的网络配置,一些主要参数诸如IP地址,子网掩码,缺省网关,DNS等必不可少,还可能需要一些附加的信息如IP管理策略之类。对于一个稍微大点的网络而言,网络的管理和维护的任务是相当繁重的。一台计算机从一个子网转移到另一个子网,就要重新对系统进行配置。对于普通水平的工作站用户是不能赋予他们配置自己的工作站网络的权限,而且也没有这个必要。如果一个没有相应技术水平的用户出于好奇或想学习一下的目的错误地更改了工作站的网络配置,造成网络故障,后果不言而喻。因此,需要有一种机制来让TCP/IP的配置和管理从用户端转移到网络管理端,实现IP的集中式管理。解决方案就是用DHCP。
DHCP的全称是动态主机配置协议(Dynamic Host Configuration Protocol),由IETF(Internet 网络工程师任务小组)设计,详尽的协议内容在RFC文档rfc2131和rfc1541里。目的就是为了减轻TCP/IP网络的规划、管理和维护的负担,解决IP地址空间缺乏问题。运行DHCP的服务器把TCP/IP网络设置集中起来,动态处理工作站IP地址的配置,用DHCP租约和预置的IP地址相联系,DHCP租约提供了自动在TCP/IP网络上安全地分配和租用IP地址的机制,实现IP地址的集中式管理,基本上不需要网络管理人员的人为干预。而且,DHCP本身被设计成BOOTP(自举协议)的扩展,支持需要网络配置信息的无盘工作站,对需要固定IP的系统也提供了相应支持。
在介绍DHCP工作原理以前,先解释这几个名词的含义:
DHCP客户:DHCP客户是一通过DHCP来获得网络配置参数的Internet主机,通常就是普通用户的工作站。
DHCP服务器:DHCP服务器是提供网络设置参数给DHCP客户的Internet主机。
DHCP/BOOTP 中继代理:在DHCP客户和服务器之间转发 DHCP 消息的主机或路由器。
DHCP是基于客户机/服务器模型设计的,DHCP客户和DHCP服务器之间通过收发DHCP消息进行通讯。
0 | 1 | 2 | 3 |
0123456789 | 0123456789 | 0123456789 | 0123456789 |
op (1) | htype (1) | hlen (1) | hops (1) |
xid (4) | |||
secs (2) | flags (2) | ||
ciaddr (4) | |||
yiaddr (4) | |||
siaddr (4) | |||
giaddr (4) | |||
chaddr (16) | |||
sname (64) | |||
file ( 128) | |||
options ( 312) |
DHCP 消息的格式与BOOTP消息大部分相同, 这样设计可以增强BOOTP服务器工具,同时为BOOTP和DHCP两种客户服务。另外,BOOTP的中继代理可用来转发跨子网的DHCP请求。
各段描述如下
括号里的数字代表这个段以8位组为单位的大小,除options外,其余的段的长度都是固定的,options段的长度至少是312个8位组。
如op(1)代表这个段的长度为一个8位组
op 是消息操作代码,值为1 代表BOOTREQUEST(自举请求)值为2 代表BOOTREPLY(自举响应)
在DHCP客户和DHCP服务器对话期间,op段被DHCP客户设置为BOOTREQUEST(1), 被DHCP服务器设置为 BOOTREPLY(2)。
htype 是硬件地址类型
hlen 是硬件地址长度
hops DHCP客户置这项为零,中继代理要用
xid DHCP客户在寻求时产生的一个随机数, 它提供了对所有后续的DHCP消息中的客户请求和服务器响应的一
种联合。
ciaddr 客户机用来请求一个特定的IP地址, 这个地址以前曾经分配给该客户机,希望保留。
yiaddr 由DHCP服务器填写,包含它提供给某一DHCP客户的IP地址。
siaddr 服务器的主机地址
giaddr 中继代理的IP地址
chaddr DHCP客户硬件地址
sname 服务器主机名
file 启动文件名
options 选项
在获得IP地址前,DHCP客户用 htype, hlen 和 chaddr 段表明它的硬件地址, 这个值由
向客户硬件地址作出响应的服务器和中继代理利用。 以前BOOTP协议中的两个没有用到的8位组
的flags段在DHCP消息里有了定义。这个段的高位比特用于表明客户机能不能在IP地址没有被配置前接
收Unicast 回应, 剩下的低位比特保留且必须置为零。 hops 和 secs 段在初始化过程中被中继代理
有选择地利用。 sname 和 file 域可以被BOOTP或无盘站利用。
关于 options 选项
选项附加在DHCP消息的固定长度段之后, 为了与BOOTP工具兼容, 选项段的前四个8位组包含了
RFC1497中定义的magic cookies,余下的段就都是DHCP 选项。在RFC1533里定义了DHCP的所有的选项
的格式。大多数选项用于标志网络传输设置值, 例如子网掩码 (mask)、 DNS 服 务 器 地 址 等其
他选项被DHCP协议利用, 且在大多数消息中是必需的。
DHCP 选项的编码格式如下:
Code | Length | value |
26 | 2 | m1 | m2 |
选项可以固定长度或可变长度,所有的选项都以一个8位组标识码开始,这个标识码用来标识选项。不带数据的固定长度选项就只由一个标识码构成。而且只有选项0和255是固定长度,其它的选项都可变长度的,为了标明选项数据的长度,在标识码后面是一个长度8位组,这个长度8位组的值不包含标识码和长度码本身。
例如,DHCP选项里的子网掩码选项如下定义
Code | Length | Subnet Mask |
1 | 4 | m1 | m2 | m3 | m4 |
标识码是1,长度是4个8位组,随后的4个8位组就是子网掩码
DHCP消息类型选项的标识码是53,长度是1个8位组,值是从1到7,分别代表不同的DHCP消息类型。
Code | Length | Type |
53 | 1 | 1-7 |
值 | 消息类型 |
1 | DHCPDISCOVER |
2 | DHCPOFFER |
3 | DHCPREQUEST |
4 | DHCPDECLINE |
5 | DHCPACK |
6 | DHCPNAK |
7 | DHCPRELEASE |
最后一项选项是零长度的End(选项 255), 表明这是选项的结束以便DHCP客户处理。 采用选项编码的好处是不论选项有多长,DHCP客户都可以正确接收,即使是它不认识的选项(不见得所有的DHCP客户程序都完全遵循RFC标准)。
不论是DHCP客户还是DHCP服务器,都是通过按DHCP消息格式要求来填写各个段形成具体的DHCP消息,
DHCP用的传输协议的非面向连接的UDP(用户数据报协议),从DHCP客户发出的DHCP消息送往DHCP服务
器的端口67,DHCP服务器发给客户的DHCP消息送往DHCP客户的端口68,由于在取得服务器赋予的IP之前,
DHCP客户并没有自己的IP,所以包含DHCP消息的UDP数据报的IP头的源地址段是0.0.0.0,目的地址则是
255.255.255.255。
DHCP客户机初始化TCP/IP,在本地物理子网上广播一个 DHCPDISCOVER 消息, 以确定DHCP服务器位
置及其IP地址。如果DHCP服务器和客户不在同一个物理子网上,BOOTP中继代理将转发这个消息给DHCP服务器。由于网络上可能不止一个DHCP服务器,凡所有具有有效IP地址信息的DHCP服务器向客户机发出一个提议。客户机从接收到的第一个提议中选定IP地址信息,并广播一条租用地址的消息请求。由发出该提议的DHCP服务器响应该消息,指定IP地址信息给该客户机并发送一个确认,而所有其它DHCP服务器撤回各自的提议。客户机完成TCP/IP协议的初始化和绑定。配置完成后,客户机就可以使用普通网络通信和连接至其它IP主机时用到的所有IP服务和应用。
在Linux几乎都采用的是Paul Vixie/ISC DHCPd,来实现DHCP服务器端功能。可以访问
获得最新消息。
目前大多书Linux发布都包含这个软件,如果是Red Hat,以RPM形式提供,只要
简单地用RPM安装就可以了。
# rpm -i dhcpd-1.3.17pl5-i386.rpm
从目前情况看,大多数Linux DHCP服务器是为Windows95/98客户平台提供服务。
为了使DHCP服务器能为正确MS的DHCP客户机器服务,需要创建一个到地址255.255.255.255
的路由,把这条路由命令加到/etc/rc.d/rc.local,使得每次机器启动后自动运行。
#route add -host 255.255.255.255 dev eth0
在一些老Linux核心的系统里可能会报告错误消息:
255.255.255.255: Unkown host
可以试着加下面的条目到/etc/hosts文件里
255.255.255.255 dhcphost
再用下面的命令
#route add -host dhcphost dev eth0
DHCPd默认的配置文件是/etc/dhcpd.conf,这是一个文本文件,DHCPd里有一个语法分析器,能对这个文件进行语法分析,获得配置参数。dhcpd.conf 格式是递归下降的,关键字大小写敏感,可以有注释,注释以#开头,一直到该行结束。这里给出一个简单的dhcpd.conf的例子,所服务的网络为C类保留网络 192.168.1.0
#examples
# 缺省租约时间
default-lease-time 28800;
# 最大租约时间
max-lease-time 43200;
# 子网掩码选项
option subnet-mask 255.255.255.0;
# 广播地址
option broadcast-address 192.168.1.255;
# 路由器地址
option routers 192.168.1.1;
# DNS地址
option domain-name-servers 192.168.1.1;
# 域名
option domain-name "netreslab.org";
# 以上都是全局参数
# 子网声明和掩码
subnet 192.168.1.0 netmask 255.255.255.0 {
# 范围
range 192.168.1.10 192.168.1.100;
# 范围
range 192.168.1.150 192.168.1.200;
}
这段配置文件将允许DHCP服务器分配两段地址范围给DHCP客户,192.168.1.10-100 和192.168.1.150-200
如果DHCP客户在申请租约时不请求一个特定租约失效时间,则以default-lease-time(28800秒)为租约时间,如果有请求一个特定的租约失效时间,则采用max-lease-time(432000秒)
服务器发送下面的参数给DHCP客户机:
子网掩码是255.255.255.0 ,广播地址是192.168.1.255,默认网关是192.168.1.1,DNS是192.168.1.1。
如果要为一台叫做hotdog的机器指定固定的IP地址,可以在dhcpd.conf文件加一条
host hotdog {
# hotdog上网卡的硬件地址
hardware ethernet 08:00:00:4c:58:23;
#固定IP
fixed-address 192.168.1.210;
}
4.3 dhcpd.leases
dhcpd.leases 是DHCP客户租约的数据库文件,默认目录在/var/state/dhcp/,文件包含租约声明,每次一个租约被获取、更新或释放,它的新值就被记录到文件的的末尾。在DHCPd第一次安装后,并不会生成这个文件。但DHCPd的运行需要这个文件,所以可以建立一个空的文件。
# touch /var/state/dhcp/dhcpd.leases
DHCPd记录这个文件的格式是
lease ip-address { statements... }
每个记录包含一个提供给客户的IP地址,在花括号里的语句包含一些租约信息。具体的租约信息因客户发出不同的DHCP请求而稍有差别。
要启动DHCPd, 简单地键入 /usr/sbin/dhcpd 或用ntsysv 把DHCPd服务自动启动,也可以用
/etc/rc.d/init.d/dhcpd start,
这样启动后,DHCPd是启动在eth0 上,如果DHCPd上的服务器还有另外一块网卡eth1, 想在eth1上启动
dhcpd,就键入
#/usr/sbin/dhcpd eth1
以上述例子的dhcpd.conf来启动dhcpd,如果我们启动一Windows95机器,Windows95的网络配置的TCP/IP选项里指定自动获得IP地址,也就是启用Windows95里的DHCP客户程序,这台95机器的主机名叫ONE,进入系统后,用winipcfg查看,如下图:
在Windows95机器获得租约后,DHCPd会在dhcp.leases里建一条记录
lease 192.168.1.154 {
starts 1 2000/05/15 13:36:42;
ends 1 2000/05/15 21:36:42;
hardware ethernet 00:00:21:4e:3f:58;
uid 01:00:00:21:4e:3f:58;
client-hostname "one";
}
要注意的是dhcpd.leases的时间记录采用GMT时间,而不是本地时区的时间。 要查看本机的GMT时间可以用
date -u
前面说过,dhcpd.conf是个递归下降格式的配置文件,有点象C的源程序风格,由参数和声明两大类语句构
成,参数类语句主要告诉DHCPd网络参数, 如租约的时间、网关、DNS等,而声明语句则是描述网络的拓扑,
用来表明网络上的客户、要提供给客户的IP地址、提供一个参数组给一组声明等。
描述网络拓扑的声明语句有 shared-network 和 subnet 声明。.如果要给一个子网里的客户动态指定IP地
址,那么在subnet声明里必须有一个 range 声明,说明地址范围。如果要给DHCP客户静态指定IP地址,那么
每个这样客户都要有一个host 声明。 对于每个要提供服务的与DHCP服务器连接的子网,都要有一个 subnet
声明,即使这是个没有IP地址要动态分配的子网。
一个典型的dhcpd.conf如下
#example
#全局参数
shared-network 共享网络名 {
共享网络特定参数...
subnet 204.254.239.0 netmask 255.255.255.224 {
子网特定参数...
range 204.254.239.10 204.254.239.30;
}
subnet 204.254.239.32 netmask 255.255.255.224 {
子网特定参数...
range 204.254.239.42 204.254.239.62;
}
}
subnet 204.254.239.64 netmask 255.255.255.224 {
子网特定参数...
range 204.254.239.74 204.254.239.94;
}
group {
组特定参数...
host ws1.domain {
特定主机参数...
}
host ws2.domain {
特定主机参数...
}
host ws3.domain {
特定主机参数...
}
}
因为DHCPd的语句很多,不可能一一列出,这里给出最常用和最重要的语句。
share-network 语句
shared-network name {
[ 参数 ]
[ 声明 ]
}
share-network 用于告诉DHCP服务器某些IP子网其实是共享同一个物理网络。任何一个在共享物理网络里的
子网都必须声明在 share-network 语句里。当属于其子网里的客户启动时,将获得在share-network语句里
指定参数,除非这些参数被subnet 或 host 里的参数覆盖。用share-network是一种权宜之计,例如某公司
用B类网络145.252,公司里的部门 A 被划在子网 145.252.1.0 里, 子网掩码为255.255.255.0,这里子网
号为8个bit,主机号也为8个bit,但如果部门 A 急速增长,超过了254个节点,而物理网络还来不及增加,
就要在原来这个物理网络上跑两个8bit掩码的子网,而这两个子网其实是在同一个物理网络上,
share-network 语句可以如下
shared-network share1 {
subnet 145.252.1.0 netmask 255.255.255.0 {
range 145.252.1.10 145.252.1.253;
}
subnet 145.252.2.0 netmask 255.255.255.0 {
range 145.252.2.10 145.252.1.253;
}
这里的share1是个共享网络名。
subnet 语句:
subnet subnet-number netmask netmask {
[ 参数 ]
[ 声明 ]
}
subnet 语句用于提供足够的信息来阐明一个IP地址是否属于该子网。也可以提供指定的子网参数和指明那些
属于该子网的IP地址可以动态分配给客户,这些IP地址必须在 range 声明里指定。subnet-number 可以是个IP地址或
能被解析到这个子网的子网号的域名。netmask 可以是个IP地址或能被解析到这个子网的掩码的域名。
range 语句:
range [ dynamic-bootp ] low-address [ high-address];
对于任何一个有动态分配IP地址的subnet语句里,至少要有一个 range 语句,用来指明要分配的IP地址的范
围。如果只指定一个要分配的IP地址,高地址部分可以省略。
host 语句:
host hostname {
[ 参数 ]
[ 声明 ]
}
host语句的作用是为特定的客户机提供网络信息。
group 语句
group {
[ 参数 ]
[ 声明 ]
}
组语句给一组声明提供参数。
allow 和 deny 语句
allow和deny语句用来控制DHCPd对客户的请求。
unknown-clients 关键字
allow unknown-clients;
deny unknown-clients;
allow unknown-clients 允许DHCPd可以动态分配IP给未知的客户,而 deny unknown-clients 则不允许。
缺省是允许的。
bootp 关键字
allow bootp;
deny bootp;
指明DHCPd是否响应bootp查询,默认是允许的。
default-lease-time 语句
语法
default-lease-time time;
指定缺省租约时间,这里的time是以秒为单位的。如果DHCP客户在请求一个租约但没有指定租约的失效时间,租约时间就是缺省租约时间。
max-lease-time 语句
语法
max-lease-time time;
最大的租约时间。如果DHCP在请求租约时间时有发出特定的租约失效时间的请求,则用最大租约时间。
hardware 语句
语法
hardware hardware-type hardware-address;
指明物理硬件接口类型和硬件地址。硬件地址由6个8位组构成,每个8位组以“:”隔开。如00:00:E8:1B:54:97
例如:hard
server-name 语句
server-name "name";
用于告诉客户服务器的名字。
fixed-address 语句
fixed-address address [, address ... ];
fixed-address 语句用于指定一个或多个IP地址给一个DHCP客户。只能出现在host声明里。
选项类语句以option 开头,后面跟一个选项名,选项名后是选项数据,选项非常的多,这里列出一些常用的
选项供参考
option routers ip-address[, ip-address];
指明在客户子网内的路由器的地址,可以有多个;
option time-servers ip-address[, ip-address...];
指明时间服务器的地址。
option domain-name-servers ip-address[, ip-address...];
指明DNS的地址
option host-anme string;
给客户指定主机名,string是个字符串。
option domain-name string;
指明域名
option interface-mtu mtu;
指明网络界面的MTU,这里mtu是个正整数
例 option interface-mtu 1500;
option broadcast-address ip-address;
指定广播地址
以上就是DHCPd常用配置,实际应用DHCP还要考虑IP分配的一些策略问题,同时要保证网络的健壮性,必须至少要有两台DHCP服务器一起工作,如果一台出了故障,另一台可以继续为DHCP客户服务。然而目前DHCP协议里并没有能让两台DHCP服务器协同工作的机制,不能保证分配的地址的唯一性,所以这两台DHCP服务器里的可分配地址空间必须进行调整,不能有交叉重复的IP地址。