Linux云计算运维网络部分面试题库 如何防范黑客攻击服务器?

    /    2019-04-09

1.9 简述TCP三次握手的过程?

答:在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状态,完成三次握手。完成三次握手,客户端与服务器开始传送数据

简版:首先A向B发SYN(同步请求),然后B回复SYN+ACK(同步请求应答),最后A回复ACK确认,这样TCP的一次连接(三次握手)的过程就建立了。

三次握手

我们先明确两个定义:

1,client为数据发送方

2,server为数据接收方

好,下面进行三次握手的总结:

1,client想要向server发送数据,请求连接。这时client想服务器发送一个数据包,其中同步位(SYN)被置为1,表明client申请TCP连接,序号为j。

2,当server接收到了来自client的数据包时,解析发现同步位为1,便知道client是想要简历TCP连接,于是将当前client的IP、端口之类的加入未连接队列中,并向client回复接受连接请求,想client发送数据包,其中同步位为1,并附带确认位ACK=j+1,表明server已经准备好分配资源了,并向client发起连接请求,请求client为建立TCP连接而分配资源。

3,client向server回复一个ACK,并分配资源建立连接。server收到这个确认时也分配资源进行连接的建立。

那么问题来了

为什么需要第三次握手?

第三次握手失败了怎么办?

三次握手有什么缺陷可以被黑客利用,用来对服务器进行攻击?

怎么防范这种攻击?

接下来进行一一解答。

1.9.1 为什么需要第三次握手?

答:如果没有第三次握手,可能会出现如下情况:

如果只有两次握手,那么server收到了client的SYN=1的请求连接数据包之后,便会分配资源并且向client发送一个确认位ACK回复数据包。

那么,如果在client与server建立连接的过程中,由于网络不顺畅等原因造成的通信链路中存在着残留数据包,即client向server发送的请求建立连接的数据包由于数据链路的拥塞或者质量不佳导致该连接请求数据包仍然在网络的链路中,这些残留数据包会造成如下危害

危害:当client与server建立连接,数据发送完毕并且关闭TCP连接之后,如果链路中的残留数据包才到达server,那么server就会认为client重新发送了一次连接申请,便会回复ACK包并且分配资源。并且一直等待client发送数据,这就会造成server的资源浪费。

1.9.2 第三次握手失败了怎么办?

答:当client与server的第三次握手失败了之后,即client发送至server的确认建立连接报文段未能到达server,server在等待client回复ACK的过程中超时了,那么server会向client发送一个RTS报文段并进入关闭状态,即:并不等待client第三次握手的ACK包重传,直接关闭连接请求,这主要是为了防止泛洪攻击,即坏人伪造许多IP向server发送连接请求,从而将server的未连接队列塞满,浪费server的资源。

1.9.3 三次握手有什么缺陷可以被黑客利用,用来对服务器进行攻击?

答:黑客仿造IP大量的向server发送TCP连接请求报文包,从而将server的半连接队列(上文所说的未连接队列,即server收到连接请求SYN之后将client加入半连接队列中)占满,从而使得server拒绝其他正常的连接请求。即拒绝服务攻击

1.9.4 怎么防范这种攻击?

1,缩短服务器接收客户端SYN报文之后的等待连接时间,即SYNtimeout时间,也就是server接收到SYN报文段,到最后放弃此连接请求的超时时间,将SYNtimeout设置的更低,便可以成倍的减少server的负荷,但是过低的SYNtimeout可能会影响正常的TCP连接的建立,一旦网络不通畅便可能导致client连接请求失败

2,SYNcookie + SYN proxy 无缝集成(较好的解决方案)

SYNcookie:当server接收到client的SYN之后,不立即分配资源,而是根据client发送过来的SYN包计算出一个cookie值,这个cookie值用来存储server返回给client的SYN+ACK数据包中的初始序列号,当client返回第三次握手的ACK包之后进行校验,如果校验成功则server分配资源,建立连接。

SYNproxy代理,作为server与client连接的代理,代替server与client建立三次握手的连接,同时SYNproxy与client建立好了三次握手连接之后,确保是正常的TCP连接,而不是TCP泛洪攻击,那么SYNproxy就与server建立三次握手连接,作为代理(网关?)来连通client与server。(类似VPN了解一下。)


(2)

分享至