DHCP基本知识点
1 DHCP协议在RFC2131种定义,使用udp协议进行数据报传递,使用的端口是67以及68。
2 DHCP最常见的应用是,自动给终端设备分配ip地址,掩码,默认网关,但是DHCP也同样可以给终端设备自动配置其他options,比如DNS server, 域名,time zones, NTP servers 以及其他的配置内容,更有些厂家,利用自己开发的第3放软件,把自己的一些配置信息,利用dhcp协议来实现对终端设备的自动配置。
3 DHCP服务的系统最基本的构架是 client/server模式,并且如果client 和server不再同一个2层网络内(即广播可以到达的网络范围),则必须要有能够透过广播报文的中继设备,或者能把广播报文转化成单播报文的设备(cisco的ios就引经了这种功能)
4 CISCO的路由器(IOS12.0 T1以后),可以配置为dhcp的中继设备,DHCP的客户端设备,也可以配置为DHCP的服务器。
5 同一个网段DHCP服务器可以有多个,这不会影响终端设备从服务器获取配置信息,终端设备以接受到的第一组配置信息为准。以后又服务器段返回的DHCP配置信息被抛弃。
6 DHCP 服务器往往遵守先来先服务的规则(first-come, first-served),或者说他能够建立一个IP地址和终端设备MAC地址之间的映射表(或者叫做database),由此可以保证特定的终端(也就是特定的MAC)每次开机后都能够获得此相同的ip地址。
如何在路由器上去做一台DHCP服务器?
Router1#configure terminal
Enter configuration commands, one per line. End with CNTL/Z.
Router1(config)#service dhcp //开启 DHCP 服务
Router1(config)#ip dhcp pool 172.25.1.0/24 //定义DHCP地址池
Router1(dhcp-config)#network 172.25.1.0 255.255.255.0 // 用network 命令来定义网络地址的范围
Router1(dhcp-config)#default-router 172.25.1.1 //定义要分配的网关地址
Router1(dhcp-config)#dns-server 172.25.1.1 10.1.2.3 //定义DNS
Router1(dhcp-config)#exit
Router1(config)#ip dhcp excluded-address 172.25.1.1 172.25.1.50 //该范围内的ip地址不能分配给客户端
Router1(config)#ip dhcp excluded-address 172.25.1.200 172.25.1.255 //该范围内的ip地址不能分配给客户端
Router1(config)#end
Router1#
好处:1 CISCO路由器的dhcp服务器功能也是在ios 12.0(1)T.以后才出现的,这一功能的出现,使我们没有必要在专门网络的中心(或者说企业本部)另外配置一台DHCP server,从而降低了网络构建成本。
2 在路由器上直接配置dhcp服务器相比于传统的在专门服务器上实现dhcp有其独到的优点。
比如
A 由于传统的构建方法是,在企业的总部设立DHCP服务器,各分支机构通过路有器去获取ip地址,所以当dhcp服务器出现问题的时候,整个企业的网络都会受到影响,而如果把dhcp 服务器功能设在各个分支机构的路由器上实现,则某个分支机构的路由器DHCP出现问题,就只能影响该分支机构的网络本身,而其他分支机构则不受任何影响。从而可见,实现了问题的局部化。
B 在各分支机构的路由器上实现DHCP服务器功能后,大量的DHCP UDP请求报文将不会通过wan link 转发到 中心机构上去,由此,相比于传统的方式,它有减少广域网负荷的优点。
C 同样的道理,在各分支机构的路由器上实现DHCP服务器功能后,如果某条广域网连路坏了,本地的局域网依然能够正常运行
D基于路由器的DHCP 具有很高的可管理性,它通过ios的命令界面是比较容易配置的。
当路由器给客户端动态分配地址后,就会绑定(binding)分配的ip地址以及客户端设备的mac地址信息,保存在路由器的配置中,以便下一次相同的mac地址请求dhcp服务也能够获得同样的ip地址。下面给出的例子是,用show ip dhcp binding 命令显示的 ip binding的信息。其中Lease expiration 表示该ip 地址,客户端还能占有的时间,(当然客户端可以在期满之前再次发送dhcp请求报,事实上dhcp的规范也是有这样的规定的,即在租期还有一半时间的时候就会发出dhcp请求,如果租期更新失败,那么再过省下时间的一半的时候,他还会发出dhcp的请求,依此类推。)
Router1#show ip dhcp binding
IP address Hardware address Lease expiration Type
172.25.1.51 0100.0103.85e9.87 Apr 10 2003 08:55 PM Automatic
172.25.1.52 0100.50da.2a5e.a2 Apr 10 2003 09:00 PM Automatic
172.25.1.53 0100.0103.ea1b.ed Apr 10 2003 08:58 PM Automatic
Router1#
DHCP的租期

基本的配置如下;
Router1#configure terminal
Enter configuration commands, one per line. End with CNTL/Z.
Router1(config)#ip dhcp pool 172.25.2.0/24
Router1(dhcp-config)#lease 2 12 30
Router1(dhcp-config)#end
Router1#
关于配置的讨论;
1 lease 命令的基本格式是 lease [days] [hours] [minutes]
上面的例子,表示设定DHCP租约为2天12小时30分。 你可以配置最大值为365天23小时59秒,也可以设置最小值1秒。默认的DHCP租约是1天。
2 记住,客户端在自己的租约还有一半的时候,就会向服务器发出更新租约的请求,如果成功,则租约从新恢复为完整的租期,如果失败,则又过剩下的一半租约后,再发出更新请求,如此规律,直到成功更新为止。
3一种比较极端的配置是,你可以规定租约为永久,即一旦客户端获得了ip地址后,只要他不物理断网,以后就再也不会向服务器发送dhcp租约更新请求了。这种配置在现实中就更加少见了。
配置命令如下;
Router1#configure terminal
Enter configuration commands, one per line. End with CNTL/Z.
Router1(config)#ip dhcp pool COOKBOOK
Router1(dhcp-config)#lease infinite //规定租约为无限制
Router1(dhcp-config)#end
Router1#
6 你可以用show ip dhcp binding 命令察看dhcp租约。
Router1#show ip dhcp binding
IP address Hardware address Lease expiration Type
172.25.1.33 0100.0103.85e9.87 Infinite Manual
172.25.1.53 0100.0103.ea1b.ed Apr 11 2003 08:58 PM Automatic
172.25.1.57 0100.6047.6c41.a4 Apr 11 2003 09:17 PM Automatic
Router1#
DHCP 服务器给路由器的接口分配IP地址
用ip address dhcp client-id 命令来配置路由器为DHCP的客户端,由此动态获取ip地址
Router1#configure terminal
Enter configuration commands, one per line. End with CNTL/Z.
Router1(config)#interface Ethernet0
Router1(config-if)#ip address dhcp client-id Ethernet0 //开启DHCP的客户端,以使得该接口动态的从DHCP服务器端获得IP地址
Router1(config-if)#end
Router1#
Interface Ethernet0 assigned DHCP address 172.25.1.57, mask 255.255.255.0
Router1#
路由器动态获得默认路由的情况下的输出,输出显示由DHCP动态获得的路由条目为S(静态),AD(管理距离为254),这里值得注意的是AD自动被设置为254,由此保证由DHCP获得的路由是作为最后路由被路由器选择的,也就是说只有在静态路由,以及其他动态路由协议的路由表中不存在相应的路由条目的时候才被选择。
Router1#show ip route
Codes: C - connected, S - static, I - IGRP, R - RIP, M - mobile, B - BGP
D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
E1 - OSPF external type 1, E2 - OSPF external type 2, E - EGP
i - IS-IS, L1 - IS-IS level-1, L2 - IS-IS level-2, ia - IS-IS inter area
* - candidate default, U - per-user static route, o - ODR
P - periodic downloaded static route
Gateway of last resort is 172.25.1.1 to network 0.0.0.0
172.25.0.0/24 is subnetted, 1 subnets
C 172.25.1.0 is directly connected, Ethernet0
S* 0.0.0.0/0 [254/0] via 172.25.1.1
Router1#
开启路由器上的DHCP 中继
使用命令IP Helper Addresses 开启
Router1#configure terminal
Enter configuration commands, one per line. End with CNTL/Z.
Router1(config)#interface Ethernet0
Router1(config-if)#ip helper-address 172.25.1.1 /*指定dhcp服务器的地址,表示通过Ethernet0向该服务器发送DHCP请求包*/
Router1(config-if)#ip helper-address 172.25.10.7 /*作用同上*/
Router1(config-if)#end
Router1#
1 在客户端设备和DHCP服务器不再同一广播域内的时候,中间设备即路有器(路有功能的设备)必须要能够转发这种广播包,具体到cisco的设备上,则启用ip helper-address命令,来实现这种中继。
2 DHCP服务器要给终端设备分配地址则需要掌握两个重要的信息,第一,该客户端设备所在网络的子网掩码,DHCP服务器依据子网掩码的信息来判断,服务器该分配哪个IP地址,以使得该ip地址在那个子网内,第二,DHCP服务器必须知道客户端的MAC地址,以维护DHCP服务器的ip 地址和MAC之间的映射关系,由此保证同样一台客户机,每次启动后能获得和前一次相同的ip地址。
3 配置了ip helper-address命令之后的路由器在中继DHCP请求时的工作过程如下
a,DHCP客户端发送请求,由于没有ip地址,所以自己的源IP地址为0.0.0.0,而且也不知道目的DHCP服务器的地址,所以为广播255.255.255.255。该数据报中当然还包含其他信息,比如二层的信息,源mac地址,和目的mac地址FFFFFFFFFFFF。
b,当路由器接收到该数据报的时候,他就用自己的接口地址(接收到数据报的接口)来取代源地址0.0.0.0,并且用ip help-address 命令中指定的地址(上例中为172.25.1.1以及172.25.10.7)来取代目的地址255.255.255.255
c 当DHCP服务器接收到路有器转发过来的DHCP请求包时,他有了足够的信息,(由源IP地址中的地址,确定客户机所在的子网掩马,由此分配相应地址池中的空闲地址,并且知道了客户记得MAC地址,把它写入自己的数据库,建立IP地址和MAC的映射关系)然后DHCP服务器做出响应,并且由路有器把数据报转发会客户端。(整个过程应该在客户机和服务器之间还有一次会话,由于这不是路由器DHCP配置的讨论重点,这里不谈)
4 例子中配置了两个DHCP服务器,我们必须分别用ip helper-address 命令指明,路有器会转发DHCP请求包到所有的DHCP服务器上。很多企业的做法都是至少有两台DHCP服务器,有提高冗余和可靠性的作用。此时,如果客户端受到几个来自不同DHCP服务器的应答,则只选择最先接收到的应答数据报。
5 必须要注意的是;ip helper-address 命令不仅仅是只转发DHCP请求包,事实上,在默认情况下,他还转发其他的UDP报(比如DNS请求)到ip helper-address命令所指定的服务器上,所以这种额外的数据流量可能会增加DHCP服务器链路的负担以及服务器CPU负担,可能会引起问题,关于解决办法,将在后面讨论。
最后 用show ip interface 显示相关的ip help-address配置信息:
Router1#show ip interface Ethernet0
Ethernet0 is up, line protocol is up
Internet address is 192.168.30.1/24
Broadcast address is 255.255.255.255
Address determined by setup command
MTU is 1500 bytes
Helper addresses are 172.25.1.3
172.25.1.1
Directed broadcast forwarding is disabled
禁止无意义udp广播报的转发
CISCO路由器允许用no ip forward-protocol udp 命令来禁止对所无意义的UDP`数据报的转发
Router1#configure terminal
Enter configuration commands, one per line. End with CNTL/Z.
Router1(config)#no ip forward-protocol udp tftp
//禁止转发tftp请求数据报文
Router1(config)#no ip forward-protocol udp nameserver
//禁止转发nameserver请求数据报文
Router1(config)#no ip forward-protocol udp domain
//禁止转发domain请求数据报文
Router1(config)#no ip forward-protocol udp time
//禁止转发time请求数据报文
Router1(config)#no ip forward-protocol udp netbios-ns
//禁止转发netbios-ns请求数据报文
Router1(config)#no ip forward-protocol udp netbios-dgm
//禁止转发netbios-dgm请求数据报文
Router1(config)#no ip forward-protocol udp tacacs
//禁止转发tacacs请求数据报文
Router1(config)#end
Router1#
在windows的网络环境中,在没有配置no ip forward-protocol udp 的情况下,DHCP 服务器会接受到来自各个不同网段的大量的NetBIOS 请求报文,这通常是引起网络拥挤,阻塞的一个很大的原因,所以作为一个基本的配置准则,我们推荐你使用no ip forward-protocol udp netbios-ns 和 no ip forward-protocol udp netbios-dgm 这两条配置命令来限制路由器向DHCP服务器转发NetBIOS请求报文。
3 上面的实例中禁止了所有不必要的协议的转发,在实际的应用中,很多大公司通常只禁止NetBIOS 请求报文的转发,这主要是因为NetBIOS 报文是引起网络问题的关键原因所在。
4 必须认识到,配置了udp中继(ip help-address x.x.x.x.)的路由器并没有实现针对不同协议,转发到不同的(或者说指定的服务器上)的功能。她会傻傻的,一古脑儿的把所有的协议(上表中所列的协议),义无反顾的发往所有的服务器。
例如,有server1 为dhcp 服务器(1.1.1.1 ) server2 为dns服务器(2.2.2.2)