DHCP的工作原理

1.几个DHCP名词在介绍

DHCP工作原理以前,先解释这几个名词的含义:

DHCP客户:DHCP客户是一通过DHCP来获得网络配置参数的Internet主机,通常就是普通用户的工作站。

DHCP服务器:DHCP服务器是提供网络设置参数给DHCP客户的Internet主机。

DHCP/BOOTP 中继代理:在DHCP客户和服务器之间转发DHCP 消息的主机或路由器。

DHCP是基于客户机/服务器模型设计的,DHCP客户和DHCP服务器之间通过收发DHCP消息进行通讯。

2、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) | 

------------------------------------------------------------

各段描述如下:

括号里的数字代表这个段以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 启动文件名

3、修改配置文件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秒) 

如果要为一台叫做hotdog的机器指定固定的IP地址,可以在dhcpd.conf文件加一条

host hotdog {
hardware ethernet 08:00:00:4c:58:23;
fixed-address 192.168.1.210; }

4、DHCP分配IP地址的过程

      DHCP客户机初始化TCP/IP,在本地物理子网上广播一个DHCPDISCOVER 消息,以确定DHCP服务器位置及其IP地址。如果DHCP服务器和客户不在同一个物理子网上,BOOTP中继代理将转发这个消息给DHCP服务器。由于网络上可能不止一个DHCP服务器,凡所有具有有效IP地址信息的DHCP服务器向客户机发出一个提议。客户机从接收到的第一个提议中选定IP地址信息,并广播一条租用地址的消息请求。由发出该提议的DHCP服务器响应该消息,指定IP地址信息给该客户机并发送一个确认,而所有其它DHCP服务器撤回各自的提议。客户机完成TCP/IP协议的初始化和绑定。配置完成后,客户机就可以使用普通网络通信和连接至其它IP主机时用到的所有IP服务和应用。

5、dhcpd.leases 


dhcpd.leases 是DHCP客户租约的数据库文件,默认目录在/var/state/dhcp/,文件包含租约声明,每次一个租约被获取、更新或释放,它的新值就被记录到文件的的末尾。在DHCPd第一次安装后,并不会生成这个文件。但DHCPd的运行需要这个文件,所以可以建立一个空的文件。

# touch /var/state/dhcp/dhcpd.leases

DHCPd记录这个文件的格式是:
lease ip-address { statements... } 
每个记录包含一个提供给客户的IP地址,在花括号里的语句包含一些租约信息。具体的租约信息因客户发出不同的DHCP请求而稍有差别。

6、dhcpd.conf 概述


前面说过,dhcpd.conf是个递归下降格式的配置文件,有点象C的源程序风格,由参数和声明两大类语句构成。

参数类语句主要告诉DHCP网络参数, 如租约的时间、网关、DNS等。

声明语句则是描述网络的拓扑,用来表明网络上的客户、要提供给客户的IP地址、提供一个参数组给一组声明等。网络拓扑的声明语句有 shared-network 和 subnet 。

如果要给一个子网里的客户动态指定IP地址,那么在subnet声明里必须有一个 range 声明,说明地址范围。

如果要给DHCP客户静态指定IP地址,那么每个这样客户都要有一个host 声明。

对于每个子网,都要有一个 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; }

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 {
[ 参数 ]
[ 声明 ]
}

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 time; 
指定缺省租约时间,这里的time是以秒为单位的。如果DHCP客户在请求一个租约但没有指定租约的失效时间,租约时间就是缺省租约时间。

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 ... ];  
用于指定一个或多个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-name string;
给客户指定主机名,string是个字符串。
option domain-name string;
指明域名
option interface-mtu mtu;
指明网络界面的MTU,这里mtu是个正整数
例 option interface-mtu 1500;
option broadcast-address ip-address;
指定广播地址

原文地址:https://www.cnblogs.com/linuxbo/p/4296565.html