GNS3之DHCP基础

   关于DHCP需要牢记的是当一台没有IP地址的主机接入网络后,会向网络上发送DHCP请求获得IP地址时,又因为它自己还没有IP地址,所以发送数据包时,源IP为0.0.0.0,源MAC就为烧在网卡上的,因为此刻是不可能知道谁是DHCP服务器的,所以数据包是目标IP地址为255.255.255.255、目标MAC地址为FFFFFF的广播包。


   如果本地网络中存在DHCP服务器,那么DHCP服务器从某个网卡收到请求后,便向客户端发送一个地址信息,其中包含我们需要使用的IP地址,子网掩码,网关,DNS等信息,同时这些信息会携带一个租约时间(即这个地址客户端可以使用多久,过了这个时间,那么服务器将该地址提供给其它客户端使用),当然,客户端也可以提前结束该地址的使用。当这个时间过去一半的时候,客户端会向服务器续约,以请求继续使用该地址,服务器同意后,该地址的使用时间会被刷新,如果在时间过去一半时,续约不成功,便会在总时间过去75%的时候再续约一次,如果还不成功,就会放弃该地址的使用权。


   需要注意的是服务器与客户端之间并没有hello这样的数据包来保持会话状态,所以当一台客户端得到一个IP地址的使用权后,中途离开网络,服务器是无法知道的,也就无法将该IP地址重新分配给他人使用,所以建议大家在配置服务器时,可以将租约配的越短越好,以免造成一个地址发给客户使用,而这台客户机已经离开了,该IP地址还长时间不能重新发给新的客户使用,建议租约配置为1分钟,因为一个地址在租约过半时,客户端会续约,也就是可以再次使用同一个地址,所以不用担心一分钟之后,客户端会重新获得别的IP地址。当一台DHCP客户端收到服务器提供的IP地址后,会使用Gratuitous ARP来查讯网络,即使用该IP地址为目的IP,目标MAC为FFFFFF发到网络里,如果有人回答该数据包,则证明该IP地址在网络中已经有他人在使用,那么将向DHCP服务器重新请求获得别的IP地址。(注:Gratuitous ARP通过正常手段无法关闭)

   下面来看看在GNS3上关于DHCP server和client的配置

配置DHCP Server

R1(config)#int fa0/0

R1(config-if)#ip ad 12.1.1.1 255.255.255.0

R1(config-if)#no sh

R1(config)#service dhcp \\开启dhcp功能

R1(config)#ip dhcp pool ccie1 \\创建一个地址池名为ccie1

R1(dhcp-config)#network 12.1.1.0 255.255.255.0 \\供客户端使用的网段

R1(dhcp-config)#default-router 12.1.1.1 \\指定网关

R1(dhcp-config)#dns-server 12.1.1.1  \\指定DNS

R1(dhcp-config)#lease 1 1 1 \\租期为1天1小时1分

R1(config)#ip dhcp excluded-address 12.1.1.1 12.1.1.10\\排除掉不提供给客户端的地址


R1(config)#ip dhcp pool ccie2\\创建第二个地址池名为ccie2

R1(dhcp-config)#network 20.1.1.0 255.255.255.0

R1(dhcp-config)#default-router 20.1.1.1

R1(dhcp-config)#dns-server 20.1.1.1

R1(dhcp-config)#lease 1 1 1


配置DHCP Client

R2(config)#int fa0/0

R2(config-if)#ip address dhcp

R2(config-if)#no sh

*Mar  1 00:10:13.883: %DHCP-6-ADDRESS_ASSIGN: Interface FastEthernet0/0 assigned DHCP address 12.1.1.11, mask 255.255.255.0, hostname R2

配置完不久控制台就会蹦出消息


查看服务器上把哪些地址分配给了客户端

R1#show ip dhcp binding

Bindings from all pools not associated with VRF:

IP address          Client-ID/              Lease expiration        Type

                   Hardware address/

                   User name

12.1.1.11          0063.6973.636f.2d63.    Mar 02 2002 01:11 AM    Automatic

                   6330.312e.3237.3934.

                   2e30.3030.302d.4661.

                   302f.30

查看客户端的路由表:

R2#show ip route

Gateway of last resort is 12.1.1.1 to network 0.0.0.0


    12.0.0.0/24 is subnetted, 1 subnets

C       12.1.1.0 is directly connected, FastEthernet0/0

S*   0.0.0.0/0 [254/0] via 12.1.1.1

可以看到接口被分配的地址为12.1.1.11,然后还产生了一条默认路由,如果是PC就是默认网关了!


   值得注意的是,我们在服务器上明明是配置了两个不同网段的地址池,为什么客户端在向服务器请求地址的时候,服务器就偏偏把12.1.1.0/24网段的地址分发给客户端,而不会错把20.1.1.0/24的网段分发给客户啦?

   只是因为服务器从哪个接口收到DHCP请求,就只能向客户端发送地址段和接收口地址相同的网段,如果不存在相同的网段,不好意思,直接丢弃请求数据包!


DHCP中继

   如上图所示,如果R4的接口配置为使用DHCP获得地址,那么将从F0/0发出目的地255.255.255.255的广播请求包,如果R3为DHCP服务器,便会响应客户端,但它不是DHCP服务器,因此R3收到此广播包后便默认丢弃该请求包。而真正的DHCP服务器是R1,R4的广播包又如何能到达R4这台服务器呢,R4又如何向R1客户端发送正确的IP地址呢。

   我们知道路由器是不能够转发广播的,因此,除非能够让R3将客户端的广播包通过单播发向R4这台服务器。所以我们的做法就是让R3将广播包通过单播继续前转到R1这台服务器,称为DHCP中继,通过IP help-address功能来实现


R1,R2,R3运行OSPF

DHCP Sevrer配置

R1(config)#service dhcp

R1(config)#ip dhcp pool ccie3

R1(dhcp-config)#network 34.1.1.0 255.255.255.0

R1(dhcp-config)#default-router 34.1.1.1

R1(config)#ip dhcp excluded-address 34.1.1.1 34.1.1.10


R3配置

R3(config-router)#int fa0/0

R3(config-if)#ip helper-address 12.1.1.1


R4客户端配置

R4(config)#int fa0/0

R4(config-if)#ip address dhcp

R4(config-if)#no sh

*Mar  1 00:15:21.867: %DHCP-6-ADDRESS_ASSIGN: Interface FastEthernet0/0 assigned DHCP address 34.1.1.11, mask 255.255.255.0, hostname R4


查看结果

R1#show ip dhcp binding

Bindings from all pools not associated with VRF:

IP address          Client-ID/              Lease expiration        Type

                   Hardware address/

                   User name

34.1.1.11           0063.6973.636f.2d63.    Mar 02 2002 12:15 AM    Automatic

                   6330.342e.3237.3934.

                   2e30.3030.302d.4661.

                   302f.30

   可以看到接口F0/0的IP地址为10.1.1.11,那么DHCP服务器R1又是根据什么来判断出客户端需要的是哪个网段的IP地址呢,为什么还是没有错把12.1.1.0/24网段的地址发给客户呢?不是说服务器从哪个接口收到请求,就把这个接口相同网段的地址发给客户端吗?按照之前的理论,应该是发送12.1.1.0/24的地址给客户啊。

   在这里,能够指导服务器发送正确IP地址给客户端,是因为有一个被称为option 82的选项,这个选项只要DHCP请求数据包被中继后便会自动添加此选项,中继路由器会在里面的giaddr位置写上参数,这个参数,就是告诉服务器,客户端需要哪个网段的IP地址才能正常工作。中继路由器从哪个接口收到客户的DHCP请求,就在option 82的giaddr位置写上该接收接口的IP地址,然后服务器根据giaddr位置上的IP地址,从地址池中选择一个与该IP地址相同网段的地址给客户,如果没有相应地址池,则放弃响应,所以,服务器R1能够正确发送34.1.1.0/24的地址给客户,正是因为R3在由于IP help-address的影响下,将giaddr的参数改成了自己接收接口的地址,即将giaddr参数改成了34.1.1.1,通过debug会看到如下过程:

R3#debug ip dhcp server packet

R3#

*Mar  1 00:20:55.879: DHCPD: setting giaddr to 34.1.1.1.

*Mar  1 00:20:55.883: DHCPD: BOOTREQUEST from 0063.6973.636f.2d63.6330.342e.3237.3934.2e30.3030.302d.4661.302f.30 forwarded to 12.1.1.1.

   从上面debug信息可以看到R2是将giaddr 改成 34.1.1.1后发中继发向12.1.1.4的,需要知道的是,经过中继后发来的DHCP请求包如果giaddr位置不是某个IP地址而是0.0.0.0的话,服务器是丢弃该请求而不提供IP地址的。


不同VLAN分配不同的地址

   如图所示,两个DHCP客户端分别位于交换机上两个不同的VLAN,交换机上的VLAN接口将作为他们的网关,R3是DHCP服务器,这两个客户端必须得到不同网段的地址,否则无法与外网通信,在这种情况下,服务器R3也必须正确为R1分配10.1.1.0/24网段的地址,必须为R2分配20.1.1.0/24的地址,配置如下:

1.配置DHCP Server

R3(config)#int fa0/0

R3(config-if)#ip ad 30.1.1.3 255.255.255.0

R3(config-if)#no sh

R3(config-if)#exit

开启DHCP功能

R3(config)#service dhcp

配置DHCP地址池

R3(config)#ip dhcp poo ccie1

R3(dhcp-config)#network 10.1.1.0 255.255.255.0\\地址池1的网段

R3(dhcp-config)#default-router 10.1.1.1\\默认路由

R3(dhcp-config)#exit

R3(config)#ip dhcp pool ccie2

R3(dhcp-config)#network 20.1.1.0 255.255.255.0

R3(dhcp-config)#default-router 20.1.1.1

R3(dhcp-config)#exit

配置需要排除的地址范围

R3(config)#ip dhcp excluded-address 10.1.1.1 10.1.1.10

R3(config)#ip dhcp excluded-address 20.1.1.1 20.1.1.10

配置正确的地址池路由

R3(config)#ip route 10.1.1.0 255.255.255.0 30.1.1.1

R3(config)#ip route 20.1.1.0 255.255.255.0 30.1.1.1

2.配置交换机

sw#vlan database

sw(vlan)#vlan 10

sw(vlan)#vlan 20

sw(config-if)#int fa1/2

sw(config-if)#ip add 30.1.1.1 255.255.255.0

sw(config-if)#no sh

sw(config-if)#int fa1/0

sw(config-if)#switchport mo access

sw(config-if)#switchport access vlan 10

sw(config-if)#int fa1/1

sw(config-if)#switchport mo access

sw(config-if)#switchport access vlan 20

sw(config-if)#int vlan 10

sw(config-if)#ip add 10.1.1.1 255.255.255.0

sw(config-if)#no sh

sw(config-if)#ip helper-address 30.1.1.3

sw(config-if)#int vlan 20

sw(config-if)#ip add 20.1.1.1 255.255.255.0

sw(config-if)#no sh

sw(config-if)#ip helper-address 30.1.1.3

3.配置DHCP Client

R1(config)#int fa0/0

R1(config-if)#ip address dhcp

R1(config-if)#no sh


R2(config)#int fa0/0

R2(config-if)#ip address dhcp

R2(config-if)#no sh

4.查看结果:

   按上述配置完之后,客户端R1的F0/0便能够收到地址10.1.1.11,客户端R2便能够收到地址20.1.1.11,然后就可以全网通信。在上述的情况下,服务器R3能够正确为R1分配10.1.1.0/24网段的地址,能够正确为R2分配20.1.1.0/24网段的地址,同样也是因为交换机在收到R1的DHCP广播包后,将giaddr的参数改成了10.1.1.1,收到R2的广播包后,将giaddr的参数改成了20.1.1.1,所以最后服务器R3能够根据giaddr=10.1.1.1的包分配10.1.1.0/24的地址,根据giaddr=20.1.1.1的包分配20.1.1.0/24的地址。

sw#debug ip dhcp server packet

*Mar  1 00:19:38.507: DHCPD: setting giaddr to 10.1.1.1.

*Mar  1 00:19:38.511: DHCPD: BOOTREQUEST from 0063.6973.636f.2d63.6330.302e.3230.6434.2e30.3030.302d.4661.302f.30 forwarded to 30.1.1.3.

*Mar  1 00:19:46.007: DHCPD: setting giaddr to 20.1.1.1.

*Mar  1 00:19:46.011: DHCPD: BOOTREQUEST from 0063.6973.636f.2d63.6330.312e.3230.6434.2e30.3030.302d.4661.302f.30 forwarded to 30.1.1.3.


你可能感兴趣的:(DHCP)