TCP/IP协议族的传输层协议主要有两个
TCP(Transmission Control Protocol )
传输控制协议
UDP(User Datagram Protocol )
用户数据报协议
①简介
TCP是面向连接的、可靠的进程到进程通信的协议
TCP提供全双工服务,即数据可在同一时间双向传输
TCP报文段
TCP将若干个字节构成一个分组,叫报文段(Segment)
TCP报文段封装在IP数据报中
②TCP报文段
端口:端口是运输层与应用层的服务接口
序号:发送端为每个字节进行编号,便于接收端正确重组
确认号:用于确认发送端的信息
首部长度:确定首部数据结构的字节长度,可以在20-60字节之间
保留:目前未被使用,用于今后扩展
窗口大小:用来控制本地可接受数据段的数目,此值大小可变化,流量控制机制就是依靠此属性的大小实现的。
紧急比特URG---当URG=1时,表明紧急指针字段有效,它告诉系统此报文字段中有紧急数据,应尽快发送
确认比特ACK---只有当ACK=1时确认号才有效,当ACK=O确认号则无效,用于确认发送方的数据
推送比特PSH---接受TCP收到推送比特置1的报文段,就尽快的交付给接受应用进程,而不是再等到整个缓存填满后再向上交付
推送比特PSH---接受TCP收到推送比特置1的报文段,就尽快的交付给接受应用进程,而不是再等到整个缓存填满后再向上交付
复位比特RST---当RST=1时,表明TCP连接中出现严重差错(如主机崩溃或其他原因),必须释放连接,再重新建立连接
同步比特SYN---同步比特SYN置为1,表示这是一个连接请求或者连接接受报文
终止比特FIN---用来释放一个连接,当FIN=1时,表明此报文段的发送端的数据已发送完毕,并要求释放连接
校验和:校验和字段检验的范围包括首部和数据。
紧急指针:指出在本报文段中的紧急数据的最后一个直接的序号。
选项:长度可变,TCP只规定了一种选择,即最大报文段长度
接收方希望收到对方下次发送的数据的第一个字节的序号
0-1023为公认端口,即固定分配给了一些服务使用
1024-49151为注册端口,即灵活使用,用户可随意定义端口与服务
③TCP端口号
端口号用来区分不同的网络服务
每台主机可以拥有多个应用端口,每对端口号、源和目标IP地址的组合唯一地标识了一个会话。端口分为知名端口和动态端口。有些网络服务会使用固定的端口,这类端口称为知名端口,端口号范围为0-1023。如FTP、HTTP、Telnet、SNMP服务均使用知名端口。动态端口号范围从1024到65535,这些端口号一般不固定分配给某个服务,也就是说许多服务都可以使用这些端口。只要运行的程序向系统提出访问网络的申请,那么系统就可以从这些端口号中分配一个供该程序使用。
FTP:21、22
HTTP:80
SSH:22
Telnet:23
SMTP:25
①TCP建立连接的过程称为三次握手
第一次握手:主机A将标志位SYN置为1,随机产生一个值seq=x,并将该数据包发送给主机B,主机A进入SYN_SENT状态,等待主机B确认。
第二次握手:主机B收到数据包后由标志位SYN=1知道主机A请求建立连接,主机B将标志位SYN和ACK都置为1,ack=x+1,随机产生一个值seq=y,并将该数据包发送给主机A以确认连接请求,主机B进入SYN_RCVD状态。
第三次握手:主机A收到确认后,检查ack是否为x+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=y+1,并将该数据包发送给主机B,主机B检查ack是否为y+1,ACK是否为1,如果正确则连接建立成功,主机A和主机B进入ESTABLISHED状态,完成三次握手,随后主机A与主机B之间可以开始传输数据了。
②TCP传输过程
TCP的可靠传输还体现在TCP使用了确认技术来确保目的设备收到了从源设备发来的数据,并且是准确无误的。
确认技术的工作原理如下:
目的设备接收到源设备发送的数据段时,会向源端发送确认报文,源设备收到确认报文后,继续发送数据段,如此重复。
③TCP流量控制
TCP滑动窗口技术通过动态改变窗口大小来实现对端到端设备之间的数据传输进行流量控制。
TCP断开连接的四次挥手
1.发送FIN/ACK(FIN=1,ACK=1,seq=b)
2.发送ACK报文(ACK=1,ack=b+1)
3.发送FIN/ack报文(FIN=1,ACK=1,ack=b+1,seq=c)
4.发送ACK报文(ACK=1,ack=c+1)
UDP协议
无连接、不可靠的传输协议
花费的开销小、效率高
UDP报文的首部格式
源端口号(16)
目标端口号(16)
UDP长度(16)
UDP校验和(16)
UDP长度:用来指出UDP的总长度,为首部加上数据
校验和:用来完成对UDP数据的差错检验,它是UDP协议提供的唯一的可靠机制
常用的UDP端口号及其功能
69-TFTP:简单文件传输协议
111-RPC:远程过程调用
123-NTP:网络时间协议
162/161-SNMP:简单网络管理协议
67/68-DHCP:动态主机配置协议
53-DNS:域名解析服务
使用UDP传输数据时,由应用程序根据需要提供报文到达确认、排序、流量控制等功能。
UDP不提供重传机制,占用资源小,处理效率高。
一些时延敏感的流量,如语音、视频等,通常使用UDP作为传输层协议。
一个网络如果要正常地运行,则网络中的主机(Host)必需要知道某些重要的网络参数,如IP地址、网络掩码、网关地址、DNS服务器地址、网络打印机地址等等。显然,在每台主机上都采用手工方式来配置这些参数是非常困难的、或是根本不可能的。
为此,IETF于1993年发布了动态主机配置协议(DHCP:Dynamic Host Configuration Protocol)。DHCP的应用,实现了网络参数配置过程的自动化。那么DHCP技术具体是如何实现的呢?面对网络规模的扩大,DHCP又是如何应对的?面对网络中的攻击, DHCP又是如何防护的呢?
传统的手工配置网络参数需要每个用户都手动配置IP地址、掩码、网关、DNS等多个参数。
这样就会存在一些问题:
人员素质要求高
主机的使用者需要懂得如何进行网络参数的配置操作方法,这在实际中是难以做到的。
容易出错
手工配置过程中非常容易出现人为的误操作情况。
灵活性差
网络参数发生改变时,需要重新进行配置操作。例如,如果某主机在网络中的位置发生了变化,则该主机的网关地址也可能会发生变化,这时就需要重新配置该主机的网关地址。
IP地址资源利用率低
IP地址无法得到重复利用。
工作量大
配置工作量会随着主机数量的增加而增大。
随着用户规模的扩大及用户位置的不固定性,传统的静态手工配置方式已经无法满足需求,为了实现网络可以动态合理地分配IP地址给主机使用,需要用到动态主机配置协议DHCP。
DHCP相对于静态手工配置有如下优点:
效率高
灵活性强
易于管理
DHCP采用了Client/Server模型;DHCP Client需要从DHCP Server那里获得各种网络配置参数,这个过程是通过DHCP Client与DHCP Server之间交互各种DHCP消息来实现的。DHCP消息是封装在UDP报文中的,DHCP Server使用端口号67来接收DHCP消息,DHCP Client使用端口号68来接收DHCP消息。我们主要关心DHCP Client是如何获得自己的IP地址的。
DHCP Client通过DHCP来申请获取自己的IP地址的基本过程,这一过程包含了四个阶段:
发现阶段:
发现阶段也就是PC上的DHCP Client寻找DHCP Server的阶段。PC上的DHCP Client开始运行后,会以广播的方式发送一个DHCP Discover消息。
需要说明的是,图中所示的二层广播域中除了路由器R上运行了DHCP Server外,可能还有其它设备也运行了DHCP Server。如果是这样,那么所有这些DHCP Server都会接收到PC发送的DHCP Discover消息,也都会对所收到的DHCP Discover消息做出回应。
提供阶段
提供阶段也就是DHCP Server向DHCP Client提供IP地址的阶段,每一个接收到DHCP Discover消息的DHCP Server(包括路由器R上运行的DHCP Server)都会从自己维护的地址池中选择一个合适的IP地址,并通过DHCP Offer消息将这个IP地址发送给DHCP Client。DHCP Server是以单播的方式来发送DHCP Offer消息的。
请求阶段
在请求阶段中,PC上的DHCP Client会在若干个收到的Offer(即若干个收到的DHCP Offer消息)中根据某种原则来确定出自己将要接受哪一个Offer。通常情况下,DHCP Client会接受它所收到的第一个Offer(即最先收到的那个DHCP Offer消息)。图中,假设PC最先收到的DHCP Offer消息是来自路由器R。于是,PC上的DHCP Client会以广播方式发送一个DHCP Request消息,其意图就是向路由器R上的DHCP Server提出请求,希望获取到该DHCP Server发送给自己的DHCP Offer消息中所提供的那个IP地址。注意,这个DHCP Request消息中携带有R上的DHCP Server的标识(称为Server Identifier),表示PC上的DHCP Client只愿意接受R上的DHCP Server所给出的Offer。
显然,该二层广播域中所有的DHCP Server都会接收到PC上的DHCP Client发送的DHCP Request消息。R上的DHCP Server收到并分析了该DHCP Request消息后,会明白PC已经愿意接受自己的Offer了。其他的DHCP Server收到并分析了该DHCP Request消息后,会明白PC拒绝了自己的Offer。于是,这些DHCP Server就会收回自己当初给予PC的Offer。也就是说,当初准备提供给PC使用的IP地址现在可以用来分配给别的设备使用了。
确认阶段
在确认阶段,R上的DHCP Server会向PC上的DHCP Client发送一个DHCP Ack消息。注意,由于种种原因,R上的DHCP Server也可能会向PC上的DHCP Client发送一个DHCP Nak消息。如果PC接收到了DHCP Nak消息,就说明这次获取IP地址的尝试失败了。在这种情况下,PC只能重新回到发现阶段来开始新一轮的IP地址申请过程。
DHCP Server每次给DHCP Client分配一个IP地址时,只是跟DHCP Client定立了一个关于这个IP地址的租约(Lease)。每个租约都有一个租约期(Duration of Lease),DHCP协议规定租约期的缺省值不得小于1个小时,而实际部署DHCP时,租约期的缺省值通常都是24小时。在租约期内,DHCP Client才能使用相应的IP地址。当租约期到期之后,DHCP Client是不被允许继续使用这个IP地址的。在租约期还没有到期的时候,DHCP Client可以申请续租这个IP地址。
DHCP Server配置基于接口的地址分配方式,只会响应该接口接收的DHCP请求;配置基于全局地址池的地址分配方式,可以响应所有端口接收的DHCP请求。
dhcp enable //使能DHCP功能,在配置DHCP服务器时必须先执行该命令,才能配置DHCP的其他功能并生效
ip pool HW //设置一个名为HW的全局地址池
gateway-list 192.168.1.1 //设置分配的网关IP
network 192.168.1.0 mask 255.255.255.0 //设置分配的地址网段
excluded-ip-address 192.168.1.2 //设置不参与自动分配的IP地址范围
lease day 3 hour 0 minute 0 //设置地址池中IP地址的租用有效期限,默认1天
dns-list 192.168.1.2 //设置分配的DNS服务器地址
interface GigabitEthernet0/0/0
ip address 192.168.1.1 255.255.255.0
dhcp select global //接口下使能全局方式分配地址
interface g0/0/0
ip address 192.168.1.1 24
dhcp select interface //使能接口分配地址方式且关联接口地址池
dhcp server dns-list 192.168.1.2 //指定分配的DNS服务器地址
dhcp server excluded-ip-address 192.168.1.2 //配置接口地址池中不参与自动分配的IP地址范围
dhcp server lease day 2 hour 0 minute 0 //配置接口地址池中IP地址的租用有效期,默认1天
从前面的描述中可知,DHCP Discover、DHCP Offer等消息都是以广播报文的方式发送的,也就是说,DHCP Client和DHCP Server必须在同一个二层广播域中才能接收到彼此发送的DHCP消息。DHCP消息无法跨越二层广播域传递。
一个实际的IP网络通常都包含了多个二层广播域,如果需要部署DHCP,那么可以有两种方法:
方法一:在每一个二层广播域中都部署一个DHCP Server(代价太大,现实中一般不推荐此方法)。
方法二:部署一个DHCP Server来同时为多个二层广播域中的DHCP Client服务,这就需要引入DHCP Relay。
配置DHCP-Server: //DHCP服务器可以采用全局地址分配或者接口地址分配,此处以全局地址池分配地址为例
dhcp enable
ip pool DHCP-relay //"DHCP-relay"仅为DHCP地址池名称
ip route-static 192.168.1.0 24 10.1.1.2 //由于中继后的DHCP报文是一个源地址为192.168.1.1的单播报文,需要有回去的路由,当前为了简单,使用静态路由完成,正常网络内可以配置IGP使得地址能够通信
配置DHCP中继(GW):
dhcp server group DHCP //配置DHCP服务器组名
dhcp-server 10.1.1.1 //设定DHCP服务器地址
dhcp enable //中继设备也需要开启DHCP,否则后面接口下的命令不能使能
interface g0/0/1 //进入连接客户端的接口
ip address 192.168.1.1 24
dhcp select relay //启动DHCP Relay功能
dhcp relay server-select DHCP //设定DHCP Relay要使用的服务器组
网络攻击行为无处不在,针对DHCP的攻击行为也不例外。例如,某公司突然出现了大面积用户无法上网的情况,经检查用户终端均未获取到IP地址,且DHCP Server地址池中的地址已经全部被分配出去了,这种情况很有可能就是DHCP受到了饿死攻击而导致的。
DHCP在设计上未充分考虑到安全因素,从而留下了许多安全漏洞,使得DHCP很容易受到攻击。实际网络中,针对DHCP的攻击行为主要有以下三种:
DHCP饿死攻击
仿冒DHCP Server攻击
DHCP中间人攻击
①DHCP饿死攻击
攻击原理:攻击者持续大量地向DHCP Server申请IP地址,直到耗尽DHCP Server地址池中的IP地址,导致DHCP Server不能给正常的用户进行分配。
漏洞分析:DHCP Server向申请者分配IP地址时,无法区分正常的申请者与恶意的申请者。
②仿冒DHCP Server攻击
攻击原理:攻击者仿冒DHCP Server,向客户端分配错误的IP地址及提供错误的网关地址等参数,导致客户端无法正常访问网络。
漏洞分析:DHCP客户端接收到来自DHCP Server的DHCP消息后,无法区分这些DHCP消息是来自仿冒的DHCP Server,还是来自合法的DHCP Server。
③DHCP中间人攻击
攻击原理:攻击者利用ARP机制,让PC-A学习到IP-S与MAC-B的映射关系,又让Server学习到IP-A与MAC-B的映射关系。如此一来,PC-A与Server之间交互的IP报文都会经过攻击者中转。
漏洞分析:从本质上讲,中间人攻击是一种Spoofing IP/MAC攻击,中间人利用了虚假的IP地址与MAC地址之间的映射关系来同时欺骗DHCP的客户端和服务器。
为了增强网络安全,防止DHCP受到攻击,一种称为DHCP Snooping的技术应运而生。DHCP Snooping不是一种标准技术,尚未有统一的标准规范,不同的网络设备制造商在DHCP Snooping的实现上也不尽相同。
DHCP Snooping部署在交换机上,其作用类似于在DHCP客户端与DHCP服务器端之间构筑了一道虚拟的防火墙。
①DHCP Snooping用于防止DHCP饿死攻击
DHCP饿死攻击是攻击者通过持续大量地向DHCP Server申请IP地址来实现的,其目的是耗尽DHCP Server地址池中的IP地址,导致DHCP Server没有IP地址分配给正常的用户。DHCP消息中有一个名叫CHADDR(Client Hardware Address)的字段,该字段是由DHCP客户端填写的,表示的是客户端的硬件地址(也就是客户端的MAC地址)。DHCP Server是针对CHADDR来分配IP地址的,对于不同的CHADDR,DHCP Server会分配不同的IP地址;DHCP Server无法区分什么样的CHADDR是合法的,什么样的CHADDR是非法的。利用这个漏洞,攻击者每申请一个IP地址时,就在DHCP消息的CHADDR字段中填写一个不同的值,以此来冒充是不同的用户在申请IP地址。
为了弥补上述漏洞,从而阻止饿死攻击,DHCP Snooping技术支持在端口下对DHCP Request报文的源MAC地址与CHADDR进行一致性检查:如果二者相同,则转发报文;如果二者不相同,则丢弃。如果要在某端口下实施源MAC地址与CHADDR的一致性检查,可以在该端口下使用命令 dhcp snooping check dhcp-chaddr enable。
还可能存在这样一种饿死攻击,就是攻击者不断同时变换MAC地址和CHADDR,并且每一次变换时,都让CHADDR与MAC地址相同,如此一来,便可以躲过上述源MAC地址与CHADDR的一致性检查!
②DHCP Snooping用于防止仿冒DHCP Server攻击
DHCP Snooping将交换机上的端口分为两种类型,即信任端口(Trusted端口)和非信任端口(Untrusted端口);与合法的DHCP Server相连接的端口应配置为Trusted端口,其他端口应配置为Untrusted端口。
交换机从Trusted端口接收到DHCP响应报文(例如DHCP Offer报文、DHCP Ack报文等等)后,会转发这些报文,从而保证合法的DHCP Server可以正常地分配IP地址及提供其他网络参数;交换机从Untrusted端口接收到DHCP响应报文(例如DHCP Offer报文、DHCP Ack报文等等)后,会丢弃这些报文,从而阻止仿冒的DHCP Server分配IP地址及提供其他网络参数。
关键配置命令:交换机的端口默认是Untrusted端口。如果需要将交换机的某个端口配置为Trusted端口,可以在该端口视图下使用命令dhcp snooping trusted。如果需要将某个Trusted端口恢复为Untrusted端口,可以在该端口视图下使用命令undo dhcp snooping trusted。
③DHCP Snooping用于防止DHCP中间人攻击
我们已经知道,DHCP中间人攻击本质上是一种Spoofing IP/MAC攻击。要想防止DHCP中间人攻击,其实就是要防止Spoofing IP/MAC攻击。
运行了DHCP Snooping的交换机会“侦听(Snooping)”往来于用户与DHCP Server之间的DHCP消息,并从中收集用户的MAC地址(这里的MAC地址是指DHCP消息中CHADDR字段的值)、用户的IP地址(这里的IP地址是指DHCP Server分配给相应CHADDR的IP地址)等信息,这些信息会集中存放在一个数据库中,该数据库也被称为DHCP Snooping绑定表。运行了DHCP Snooping的交换机会建立并动态维护DHCP Snooping绑定表,绑定表中除了包含了用户的MAC地址、用户的IP地址外,还包括IP地址租用期、VLAN-ID等等信息。
如图所示,假设DHCP Server给PC-A分配了IP地址IP-A,给PC-B分配了IP地址IP-B,那么IP-A与MAC-A就形成了绑定关系,IP-B与MAC-B也形成了绑定关系,这种绑定关系都存放于DHCP Snooping绑定表中。攻击者为了让Server学习到IP-A与MAC-B的映射关系,会发送ARP请求报文(将ARP报文中的源IP地址填为IP-A,源MAC地址填为MAC-B)。交换机接收到ARP请求报文后,会检查该ARP请求报文中的源IP地址和源MAC地址,发现该IP/MAC(IP-A/MAC-B)映射关系不能匹配DHCP Snooping绑定表中的条目,于是会丢弃该ARP请求报文,这样就有效地防止了Spoofing IP/MAC攻击。
如果需要使用上面所描述的防止Spoofing IP/MAC攻击(进而防止中间人)的方法,就必须在交换机的系统视图下执行配置命令arp dhcp-snooping-detect enable。
④DHCP Snooping与IPSG技术的联动
网络中经常会存在针对源IP地址进行欺骗的攻击行为,例如,攻击者仿冒合法用户的IP地址来向服务器发送IP报文。针对这类攻击,相应的防范技术称为IPSG(IP Source Guard)技术。
交换机使能IPSG功能后,会对进入交换机端口的报文进行合法性检查,并对报文进行过滤(如果合法,则转发;如果非法,则丢弃)。
DHCP Snooping技术可与IPSG技术进行联动,即:对于进入交换机端口的报文进行DHCP Snooping绑定表匹配检查,如果报文的信息和与绑定表一致,则允许其通过,否则丢弃报文。
报文的检查项可以是源IP地址、源MAC地址、VLAN和物理端口号的若干种组合。例如,在交换机的端口视图下可支持IP+MAC、IP+VLAN、IP+MAC+VLAN等组合检查,在交换机的VLAN视图下可支持:IP+MAC、IP+物理端口号、IP+MAC+物理端口号等组合检查。
关键配置命令:在交换机的端口视图下或VLAN视图下执行配置命令ip source check user-bind enable。