一台计算机如果想要接入互联网,则必须要配置以下四项参数:
- IP地址
- 子网掩码
- 缺省网关
- DNS服务器IP地址
但通常我们利用网线连接路由器的网口或者连接上无线路由器WIFI之后,也没有手动配置过这些信息,但是我们就已经可以上网了,此时我们在命令行下运行ipconfig -all
(Linux下运行ifconfig
)就可以看到,以上所需的信息都已经自动配置完成了,这就是DHCP服务的功劳啦!
什么是DHCP
DHCP(Dynamic Host Configuration Protocol,动态主机配置协议) 是用于内部网络自动分配IP地址的网络协议。目前我们买到的路由器都具备DHCP服务器的功能,当我们连接上路由器后,我们的电脑就会在网络中寻找DHCP服务器,而DHCP服务器接收到消息后便会响应电脑的请求,分配空闲的IP地址给我们的电脑。
DHCP工作过程
1 客户端寻找DHCP服务器
当客户端首次连接上路由器时,并没有任何的IP地址设定,因此它将以广播(broadcast)的方式,采用UDP协议在网络中发送DHCP Discover报文来寻找DHCP服务器(目的端口68,源端口67)。网络中所有安装了TCP/IP协议的主机都会接收到这个消息,但是只有DHCP服务器会作出响应。
2 DHCP服务器给客户端分配IP参数
服务器接收到客户端发来的DHCP Discover报文,会从IP地址池中选择一个空闲的IP地址,对应的子网掩码、缺省网关、DNS服务器IP地址,以单播(unicast)的方式,采用UDP协议发送给客户端一个包含以上信息的DHCP Offer报文(目的端口67,源端口68)。
3 客户端接受IP参数
DHCP客户端接收到DHCP Offer报文,选择接收到的第一个信息(若网络中存在多个DHCP服务器,则只接收第一个收到的DHCP报文),以单播方式回答一个DHCP Request报文,里面包含其所选定的DHCP服务器请求IP地址的内容。
4 IP地址分配确认
DHCP服务器接收到DHCP客户端响应的DHCP Request报文后,便以单播的形式向客户端发送DHCP Ack报文,告诉客户端可以使用其提供的IP地址。客户端接收到DHCP Ack报文后,会尝试用获得的参数配置TCP/IP协议栈,同时还要尝试ARP广播请求自己IP对应的MAC地址,这个为了确定这个IP地址是唯一,不会引起IP冲突,若没有受到任何回复则可以完成配置工作。
DHCP中继代理
DHCP服务器正常工作,要求和客户端处于同一个网段内,若一个公司具有数十个子网,便需要数十个DHCP服务器,这是很浪费的。这个问题可以通过DHCP中继处理来解决。即在每个网段内有一个DHCP中继代理,之后将每个中继代理和DHCP服务器处于同一网段下即可,DHCP中继代理就充当让客户端与服务器相互发现彼此的中介机构。
DHCP中继代理的工作过程如下:
- 接受网段内DHCP广播报文
- 添加[中继代理 xx.xx.xx.xx]字段
- 将广播转单播发给DHCP服务器
- 接收DHCP服务器报文并法给客户端
DHCP优化
DHCP服务器能够实现上述功能,看上去已经很好了,但是仍然存在一些问题,但聪明的程序员已经想到了解决方案。
多DHCP服务共存
当多个网段处于同一个广播域下,存在多个DHCP服务器时,申请IP地址时,每个DHCP服务器都会响应客户端的报文,则客户端会以第一个收到的DHCP报文中包含的IP地址作为自己的IP地址,这在很多时候是不被允许的,客户端所处的网段是需要可控的。
解决方法 可利用VLAN(虚拟局域网)技术来解决,VLAN可以隔离广播,限制不同网段之间的访问,这样就可以有效的避免DHCP广播报文在不同网段内的传播,提高了安全性。
DHCP欺诈
由于DHCP就是通过DHCP报文来分配IP地址的,那么在网络下若存在一台计算机,伪造了大量的MAC地址,并利用这些地址发送DHCP报文申请IP地址,则地址资源就要被耗尽,会造成同一个网段下其他用户无法上网。
解决方法 DHCP窥探(DHCP Snooping)监视端口,当DHCP Discover信息经过的时候,会在原报文基础上增加一个安全选项[Option 82],这里面记录了交换机名称、端口号等信息,这样若发现端口申请了多个IP,则拒绝继续分配IP地址。
ARP漏洞
计算机利用ARP广播协议在网络中发现彼此的MAC地址,若计算机A在发送ARP报文时,被网络中的一台伪造MAC地址的计算机B回答了,则本应发给目标计算机C的消息全部发送给了伪造MAC地址的计算机B,计算机B看到了内容之后再将消息转发给C,这样A和C之间的消息都被B给劫持了,这就是网络流量的劫持。
解决方法 同样利用DHCP窥探,在DHCP窥探时,会生成一张绑定表,里面记录了端口号、主机MAC地址、IP地址等信息,因此若发现报文中MAC地址、IP地址与端口号有任何一个不符合都被认为是欺诈行为。