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.
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341