前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >GNS3之DHCP基础

GNS3之DHCP基础

作者头像
py3study
发布2020-01-06 11:37:45
9000
发布2020-01-06 11:37:45
举报
文章被收录于专栏:python3python3

   关于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.

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-09-21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档