DHCP

2 Aug

DHCP(Dynamic Host Configuration Protocol)动态主机配置协议,用于分配IP地址。先向Server设置一批可用的IP地址,当Client向Server请求IP地址时,Server能自动地将IP分配给Client。手工配置IP地址麻烦不说,还容易出错,比如分配了重复的IP地址,当Client端不用IP地址时,该IP地址也不能被及时回收。DHCP解决了这些问题,能保证IP地址不重复分配,能及时回收IP地址以提高IP地址的利用率。管理方便,省时省力。

DHCP工作原理:(4步握手)

20160202141430181

1.Client发送DHCP广播(DHCPDISCOVER)来寻找DHCP Server。网段里所有安装了TCP/IP协议的主机都能收到,但只有DHCP Server会响应

2.接收到DHCPDISCOVER的所有DHCP Server都会做出响应,回复DHCPOFFER(表示我可以为你提供IP),里面包含被分配的一个IP地址

3.Client会根据先来先到的原则(ARP是后来先到),选择收到的第一条DHCPOFFER,并广播DHCPREQUEST向该DHCP Server其请求IP地址。之所以用广播而非单播,是因为能顺便通知其他DHCP Server,它已经决定使用某台DHCP Server提供的IP地址了

4.DHCP Server收到Client的DHCPREQUEST后,回复DHCPACK

补充以下两点:

1.以后Client每次重新登录网络时,就不需要再发送DHCPDISCOVER重新寻找DHCP Server了,直接发送前一次DHCPREQUEST(内含IP地址)。DHCP Server收到后,如果该IP还能用,将让Client继续使用,回复一个DHCPACK。如果该IP不能用了(以被回收并分配给了他人),将回复一个DHCPNACK。Client收到DHCPNACK后,就需要重新从第一步开始发送DHCPDISCOVER来重新寻找DHCP Server重新获取新IP地址。

2.DHCP Server分配给Client的IP地址有一个租借期限(默认为1天),期满后DHCP Server会回收该IP地址。当Client启动时间为租约的50%时,Client会自动向DHCP Server发送更新租约的请求。如果DHCP Server应答,则延期租约。如果DHCP Server没应答,在租约的87.5%时间点,Client应该与任何一个其它的DHCP Server通信,并请求更新它的配置信息。如果Client不能和所有的DHCP Server取得联系,租约到期后,它必须放弃当前的IP地址。并重新从第一步开始发送DHCPDISCOVER来重新寻找DHCP Server重新获取新IP地址。当然,Client不想用该IP地址时,可以主动向DHCP Server发出DHCPRELEASE,将当前的IP地址释放。

DHCP报文:

20160202152022396

OP:0x01是Client的请求,0x02是Server的应答

HTYPE:硬件类型,1为以太网,15为帧中继,20为串行线路等

HLEN:硬件地址的长度,以太网为6

HOPS:跳数,当前的DHCP数据包每经过一个路由器会加1,作用是限制DHCP数据包不要经过太多的路由器

TRANSACTION ID:由Client产生的32位标识符,用来将请求和从DHCP Server得到的回复匹配

SECONDS:从Client开始尝试获取或更新租约用。当有多个Client请求未得到处理时,DHCP Server用该值来确定回复的优先顺序

FLAGS 标志:只使用16位中的左边的最高位,代表广播标志

ciaddr:当Client想继续使用之前的IP地址就将其放到这里,否则为0

yiaddr:DHCP Server分配给Client的IP地址

siaddr:DHCP Server的IP地址

giaddr:网关的IP地址。跨网段发送DHCP时,需要设置。可以帮助位于不同子网或网络的Client与DHCP Server间传输请求和回复

chaddr:Client的硬件地址

sname:DHCP Server名,发送DHCPOFFER或DHCPACK时可以选择性地将其名称放在此处

file:启动文件名,Client可以选择性地在DHCPDISCOVER中使用它来请求特定类型的启动文件。在DHCP中使用它来完整指定启动文件目录和文件名。

Options:包括基本DHCP运作所需的几个参数(如Netmask / Gateway / DNS等)。该字段长度不定,最长312字节

DHCP配置:

将R1配置为DHCP Server,其他路由器或终端都从R1中自动获取IP地址:

20160203115218143

配置命令:

先配置一下R1的基本配置:

R1(config)#inter f0/0
R1(config-if)#ip addr 10.1.1.1 255.255.255.0
R1(config-if)#no shutdown
R1(config-if)#inter f2/0
R1(config-if)#ip addr 12.1.1.1 255.255.255.0
R1(config-if)#no shutdown

现在将R1配置为DHCP Server:

R1(config)#service dhcp                         //启动DHCP服务,默认是开启的
R1(config)#ip dhcp pool pool-1                  //新建一个dhcp池,起名pool-1
R1(dhcp-config)#network 10.1.1.0 255.255.255.0  //池中可分配的地址
R1(dhcp-config)#default-router 10.1.1.1         //默认网关,即和左边网络连接的以太口f0/0的IP地址
R1(dhcp-config)#dns-server 8.8.8.8              //DNS

现在R3可以从R1(DHCP Server)中自动获取IP地址了:(Client不必非是路由器,如果R3是PC的话,就不必如下配置了,直接将IP地址设置为自动获取即可)

R3(config)#inter f0/0  
R3(config-if)#ip addr dhcp      //client直接搜索DHCP Server并获取IP  
R3(config-if)#no shutdown  

现在可以在DHCP Server上和Client上查看当前DHCP信息:

R1#show ip dhcp pool      //DHCP Server端这两条命令查看,IP地址池中信息,哪些已分配掉了
R1#show ip dhcp bingding  //分配给了哪些Client
R3#show dhcp server       //Client端这两条命令查看,Client从哪台Server获取IP
R3#show dhcp lease        //IP租约

R3(Client)从R1(DHCP Server)自动获取到IP地址,如果你不想IP地址经常变,想固定R3的IP地址(如固定为10.1.1.13),可以:

R1#show ip dhcp bingding                        //找到R3的标识
R1(config)#ip dhcp pool pool-R3                 //新建一个dhcp池,起名pool-R3
R1(dhcp-config)#client-identifier XXX           //把R3的标识贴进去
R1(dhcp-config)#host 10.1.1.133 255.255.255.0   //为R3分配固定的IP地址,此处已经不是network是host
R1(dhcp-config)#default-router 10.1.1.1         //默认网关
R1(dhcp-config)#dns-server 8.8.8.8              //DNS
//这样R3每次接入网络,从R1哪里能获得固定的IP地址(10.1.1.13)

DHCP Server可以保留不想被分配出去的IP,比如1-100都不想分配出去,希望从101开始分配:

R1(config)#ip dhcp excluded-address 10.1.1.1 10.1.1.100  
//这样左边网络中10.1.1.1-10.1.1.100都将被保留,收到DHCPDISCOVER后,会从10.1.1.101开始分配。  

从DHCP Server分配出去的IP地址,租期默认都是1天,可以修改:

R3(dhcp-config)#lease 2     //改成2天

DHCP Relay(中继):

上例中R3(Client)从R1(DHCP Server)处于同一网段,用广播没问题。但现实中Client和DHCP Server几乎肯定处于不同网段中。假设上图中R1和R2间是处于12.1.1.0/24网段,但R2和R6处于30.1.1.0/24网段,这样R6就无法直接从R1(DHCP Server)获取到IP地址,因为R6发出的广播R1收不到。这就需要DHCP Relay,即将广播转为单播:

先配置R2:

R2(config)#inter f0/0  
R2(config-if)#ip addr 30.1.1.1 255.255.255.0  
R2(config-if)#ip helper-address 12.1.1.1    //配helper地址,收到30.1.1.0的广播,将转发给12.1.1.1(即R1的f2/0口)  
R2(config-if)#no shutdown  
R2(config-if)#inter f1/0  
R2(config-if)#ip addr 12.1.1.2 255.255.255.0  
R2(config-if)#no shutdown  

再配置

R1(config)#ip dhcp pool pool-2                         //新建一个dhcp池  
R1(dhcp-config)#network 30.1.1.0 255.255.255.0         //池中可分配的地址  
R1(dhcp-config)#default-router 30.1.1.1                //默认网关  
R1(dhcp-config)#dns-server 8.8.8.8                     //DNS  
R1(config)#ip router 30.1.1.1 255.255.255.0 12.1.1.2   //还需要配一条R1去往发送helper地址的静态路由,这样R6发广播向R1请求IP后,R1才能响应回去  

这样R6就能经由R2将广播转为单播,想R1(DHCP Server)请求IP地址了

Leave a Reply

Your email address will not be published. Required fields are marked *