TCP标志位详解及tcp拦截配置.docx
《TCP标志位详解及tcp拦截配置.docx》由会员分享,可在线阅读,更多相关《TCP标志位详解及tcp拦截配置.docx(9页珍藏版)》请在冰豆网上搜索。
![TCP标志位详解及tcp拦截配置.docx](https://file1.bdocx.com/fileroot1/2023-1/23/4c78a700-683a-4370-9f95-8f823920534a/4c78a700-683a-4370-9f95-8f823920534a1.gif)
TCP标志位详解及tcp拦截配置
TCP标志位
URG:
此标志表示TCP包的紧急指针域(后面马上就要说到)有效,用来保证TCP连接不被中断,并且督促中间层设备要尽快处理这些数据;
ACK:
此标志表示应答域有效,就是说前面所说的TCP应答号将会包含在TCP数据包中;有两个取值:
0和1,为1的时候表示应答域有效,反之为0;
PSH:
这个标志位表示Push操作。
所谓Push操作就是指在数据包到达接收端以后,立即传送给应用程序,而不是在缓冲区中排队;
RST:
这个标志表示连接复位请求。
用来复位那些产生错误的连接,也被用来拒绝错误和非法的数据包;
SYN:
表示同步序号,用来建立连接。
SYN标志位和ACK标志位搭配使用,当连接请求的时候,SYN=1,ACK=0;连接被相应的时候,SYN=1,ACK=1;这个标志的数据包经常被用来进行端口扫描。
扫描者发送一个只有SYN的数据包,如果对方主机响应了一个数据包回来,就表明这台主机存在这个端口;但是由于这种扫描方式只是进行TCP三次握手的第一次握手,因此这种扫描的成功表示被扫描的机器不很安全,一台安全的主机将会强制要求一个连接严格的进行TCP的三次握手;
FIN:
表示发送端已经达到数据末尾,也就是说双方的数据传送完成,没有数据可以传送了,发送FIN标志位的TCP数据包后,连接将被断开。
这个标志的数据包也经常被用于进行端口扫描。
当一个FIN标志的TCP数据包发送到一台计算机的特定端口,如果这台计算机响应了这个数据,并且反馈回来一个RST标志的TCP包,就表明这台计算机上没有打开这个端口,但是这台计算机是存在的;如果这台计算机没有反馈回来任何数据包,这就表明,这台被扫描的计算机存在这个端口。
*SYN:
同步标志
同步序列编号(SynchronizeSequenceNumbers)栏有效。
该标志仅在三次握手建立TCP连接时有效。
它提示TCP连接的服务端检查序列编号,该序列编号为TCP连接初始端(一般是客户端)的初始序列编号。
在这里,可以把TCP序列编号看作是一个范围从0到4,294,967,295的32位计数器。
通过TCP连接交换的数据中每一个字节都经过序列编号。
在TCP报头中的序列编号栏包括了TCP分段中第一个字节的序列编号。
*ACK:
确认标志
确认编号(AcknowledgementNumber)栏有效。
大多数情况下该标志位是置位的。
TCP报头内的确认编号栏内包含的确认编号(w+1,Figure-1)为下一个预期的序列编号,同时提示远端系统已经成功接收所有数据。
*RST:
复位标志
复位标志有效。
用于复位相应的TCP连接。
*URG:
紧急标志
紧急(Theurgentpointer)标志有效。
紧急标志置位,
*PSH:
推标志
该标志置位时,接收端不将该数据进行队列处理,而是尽可能快将数据转由应用处理。
在处理telnet或rlogin等交互模式的连接时,该标志总是置位的。
*FIN:
结束标志
带有该标志置位的数据包用来结束一个TCP回话,但对应端口仍处于开放状态,准备接收后续数据。
.TCP的几个状态对于我们分析所起的作用。
在TCP层,有个FLAGS字段,这个字段有以下几个标识:
SYN,FIN,ACK,PSH,RST,URG.其中,对于我们日常的分析有用的就是前面的五个字段。
它们的含义是:
SYN表示建立连接,FIN表示关闭连接,ACK表示响应,PSH表示有DATA数据传输,RST表示连接重置。
其中,ACK是可能与SYN,FIN等同时使用的,比如SYN和ACK可能同时为1,它表示的就是建立连接之后的响应,如果只是单个的一个SYN,它表示的只是建立连接。
TCP的几次握手就是通过这样的ACK表现出来的。
但SYN与FIN是不会同时为1的,因为前者表示的是建立连接,而后者表示的是断开连接。
RST一般是在FIN之后才会出现为1的情况,表示的是连接重置。
一般地,当出现FIN包或RST包时,我们便认为客户端与服务器端断开了连接;而当出现SYN和SYN+ACK包时,我们认为客户端与服务器建立了一个连接。
PSH为1的情况,一般只出现在DATA内容不为0的包中,也就是说PSH为1表示的是有真正的TCP数据包内容被传递。
TCP的连接建立和连接关闭,都是通过请求-响应的模式完成的。
了解到了TCP标志位的含义,就可以了解TCP的三次握手是怎么进行的了:
发送端发送一个SYN=1,ACK=0标志的数据包给接收端,请求进行连接,这是第一次握手;接收端收到请求并且允许连接的话,就会发送一个SYN=1,ACK=1标志的数据包给发送端,告诉它,可以通讯了,并且让发送端发送一个确认数据包,这是第二次握手;最后,发送端发送一个SYN=0,ACK=1的数据包给接收端,告诉它连接已被确认,这就是第三次握手。
之后,一个TCP连接建立,开始通讯。
简述TCP协议连接建立时3次握手的过程。
根据TCP头部,说明下列3个包在连接建立过程中的次序,为什么?
该连接访问的服务是什么服务?
0020 005083aa46493edd339637a3a012 ...P..FI>.3.7...
0030 16a0c4c00000020405b40402080ad79b ................
0040 62b700564a2a01030302 b..VJ*....
(1)
0020 83aa0050339637a200000000a002 .....P3.7.......
0030 16d0841d0000020405b40402080a0056 ...............V
0040 4a2a0000000001030300 J*........
(2)
0020 83aa0050339637a346493ede8010 .....P3.7.FI>...
0030 16d0f34b00000101080a00564a36d79b ...K.......VJ6..
0040 62b7 b. (3)
解:
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。
第一次握手:
建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:
服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:
客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
完成三次握手,客户端与服务器开始传送数据。
(2)是第一次握手,flags位上为02,二进制是00000010,即表示有syn没有ack。
(1)是第二次握手,flags位上为12,二进制是00010010,即表示有syn和ack。
(3)是第三次握手,flags位上为10,二进制是00010000,即表示有ack没有syn。
该连接访问的是80端口,是为HTTP(HyperTextTransportProtocol,超文本传输协议)开放的
TCP拦截即TCPintercept,大多数的路由器平台都引用了该功能,其主要作用就是防止SYN泛洪攻击。
SYN攻击利用的是TCP的三次握手机制,攻击端利用伪造的IP地址向被攻击端发出请求,而被攻击端发出的响应报文将永远发送不到目的地,那么被攻击端在等待关闭这个连接的过程中消耗了资源,如果有成千上万的这种连接,主机资源将被耗尽,从而达到攻击的目的。
我们可以利用路由器的TCP拦截功能,使网络上的主机受到保护(以Cisco路由器为例)。
开启TCP拦截分为三个步骤:
1.设置TCP拦截的工作模式
TCP拦截的工作模式分为拦截和监视。
在拦截模式下,路由器审核所有的TCP连接,自身的负担加重,所以我们一般让路由器工作在监视模式,监视TCP连接的时间和数目,超出预定值则关闭连接。
格式:
iptcpinterceptmode(intercept|watch)
缺省为intercept
2.设置访问表,以开启需要保护的主机
格式:
access-list[100-199][deny|permit]tcpsourcesource-wildcard
destinationdestination-wildcard
举例:
要保护219.148.150.126这台主机
access-list101permittcpanyhost219.148.150.126
3.开启TCP拦截
iptcpinterceptlistaccess-list-number
示例:
我们有两台服务器219.148.150.126和219.148.150.125需要进行保护,可以这样配置:
iptcpinterceptlist101
iptcpinterceptmodewatch
........
ipaccess-list101permittcpanyhost219.148.150.125
ipaccess-list101permittcpanyhost219.148.150.126
经过这样的配置后,我们的主机就在一定程度上受到了保护。
/********************************************************************************************************************************/
/********************************************************************************************************************************/
TCP(TransmissionControlProtocol)传输控制协议
TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接:
位码即tcp标志位,有6种标示:
SYN(synchronous建立联机)ACK(acknowledgement确认)
PSH(push传送)FIN(finish结束)RST(reset重置)URG(urgent紧急)
Sequencenumber(顺序号码)Acknowledgenumber(确认号码)
第一次握手:
主机A发送位码为syn=1,随机产生seqnumber=1234567的数据包到服务器,主
机B由SYN=1知道,A要求建立联机;
第二次握手:
主机B收到请求后要确认联机信息,向A发送acknumber=(主机A的
seq+1),syn=1,ack=1,随机产生seq=7654321的包
第三次握手:
主机A收到后检查acknumber是否正确,即第一次发送的seqnumber+1,以及位
码ack是否为1,若正确,主机A会再发送acknumber=(主机B的seq+1),ack=1,主机B收到
后确认seq值与ack=1则连接建立成功。
完成三次握手,主机A与主机B开始传送数据。
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。
第一次握手:
建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待
服务器确认;
第二次握手:
服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN
包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;第三次握手:
客户端收到服
务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进
入ESTABLISHED状态,完成三次握手。
完成三次握手,客户端与服务器开始传送数据.
实例:
IP192.168.1.116.3337>192.168.1.123.7788:
S3626544836:
3626544836
IP192.168.1.123.7788>192.168.1.116.3337:
S1739326486:
1739326486ack3626544837
IP192.168.1.116.3337>192.168.1.123.7788:
ack1739326487,ack1
第一次握手:
192.168.1.116发送位码syn=1,随机产生seqnumber=3626544836的数据包到
192.168.1.123,192.168.1.123由SYN=1知道192.168.1.116要求建立联机;
第二次握手:
192.168.1.123收到请求后要确认联机信息,向192.168.1.116发送ack
number=3626544837,syn=1,ack=1,随机产生seq=1739326486的包;
第三次握手:
192.168.1.116收到后检查acknumber是否正确,即第一次发送的seqnumber+1,
以及位码ack是否为1,若正确,192.168.1.116会再发送acknumber=1739326487,ack=1,
192.168.1.123收到后确认seq=seq+1,ack=1则连接建立成功。
图解:
一个三次握手的过程(图1,图2)
(图1)
(图2)
第一次握手的标志位(图3)
我们可以看到标志位里面只有个同步位,也就是在做请求(SYN)
(图3)
第二次握手的标志位(图4)
我们可以看到标志位里面有个确认位和同步位,也就是在做应答(SYN+ACK)
(图4)
第三次握手的标志位(图5)
我们可以看到标志位里面只有个确认位,也就是再做再次确认(ACK)
(图5)
一个完整的三次握手也就是请求---应答---再次确认
四次分手:
由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。
这个原则是当一方完成它的
数据发送任务后就能发送一个FIN来终止这个方向的连接。
收到一个FIN只意味着这一方向上
没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。
首先进行关闭的一方将执行主
动关闭,而另一方执行被动关闭。
(1)客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送(报文段4)。
(2)服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1(报文段5)。
和SYN一样,一个FIN将占用一个序号。
(3)服务器B关闭与客户端A的连接,发送一个FIN给客户端A(报文段6)。
(4)客户端A发回ACK报文确认,并将确认序号设置为收到序号加1(报文段7)。
1.为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?
这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK
和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。
但关闭连接时,当收到
对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发
送给对方了,所以你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之
后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN
报文多数情况下都是分开发送的。
2.为什么TIME_WAIT状态还需要等2MSL后才能返回到CLOSED状态?
这是因为虽然双方都同意关闭连接了,而且握手的4个报文也都协调和发送完毕,按理可以
直接回到CLOSED状态(就好比从SYN_SEND状态到ESTABLISH状态那样);但是因为我们必须
要假想网络是不可靠的,你无法保证你最后发送的ACK报文会一定被对方收到,因此对方处于
LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以这个
TIME_WAIT状态的作用就是用来重发可能丢失的ACK报文。
tcpdump抓取TCP标识位
按每8位组算,TCP的标志位位于第13个8位组中,如下,第一行一共32位是0-3个8位组,第二行是4-7八位组,第三行是8-11八位组,dataoffset+reserved的前四个是第12个8位组,reserved中的后2位+6个标志位是第13个八位组.
因此第13个八位组结构为
--++++++
前面2个是保留的,都为0,后面的6个根据不同情况有不同值,例如syn包则为
00000010
这是二进制转化为十进制就是2
因此tcpdump-nieth0tcp[13]==2就表示syn包
同理,syn+ack包为
00010010
化为十进制就是18,因此tcpdump-nieth0tcp[13]==18表示syn+ack包
如果想同时抓syn和syn+ack包,则进行tcp[13]位值与掩码进行与运算:
tcp[13]&2==2
原理:
既然希望同时抓syn和syn+ack,说明syn位是我们要关心的位置,因此仿照网络掩码的与运算,只关心syn位的掩码是00000010,将
00010010SYN-ACK 00000010SYN
AND00000010(wewantSYN) AND00000010(wewantSYN)
-------- --------
=00000010 =00000010
与运算的结果都是2,因此
tcp[13]&2的结果应等于2,即tcp[13]&2==2
---------
如果觉得记忆和计算这些很难,则可以利用
tcp[tcpflags]=tcp-syn这种格式来写,后面的值可以为tcp-fin,tcp-syn,tcp-rst,tcppush,
tcp-ack,tcp-urg任意一种。