首页 > 其他分享 >dpvs syn-proxy实现分析

dpvs syn-proxy实现分析

时间:2023-08-17 18:03:07浏览次数:48  
标签:seq ack SYN syn dpvs proxy th


1  syn flood

就是同步发送SYN数据包,这样的操作对于发送方(攻击者)来说是非常容易实现的,而对于接收方(目标)来说会需要消耗更多的资源去接收和处理数据包。除此之外,在发送完SYN数据包之后,我们不需要等待接收端返回的SYN/ACK数据包,我们只需要继续向对方发送SYN数据包并让服务器自己去处理就可以了。这样一来,当合法用户尝试连接服务器时,服务器已经有大量SYN连接需要去处理,因此将无法及时相应合法用户的请求。


2  Syn flood 原理

tcp三次握手,客户端首先通过发送SYN请求向处于监听状态的服务器发起连接,在经典的实现中服务器接受该数据包,并为该连接分配一定的资源,并发送SYN+ACK数据包。对服务器来说,接收到SYN并且回复SYN+ACK之后的状态变为SYN_RECV,此时该连接的状态称为半连接。而当客户端收到来自服务器的SYN+ACK之后,回复一个ACK给服务器,服务器收到这个ACK之后,连接状态变成ESTABLISHED,这个时候连接建立完成。在这个过程中,如果服务器一直没有收到来自客户端的ACK,那么服务器会在超时之后重传SYN+ACK。


如果恶意攻击者故意大量发送不断发送的伪造的SYN报文,那么服务器就会分配大量注定无用的资源,并且服务器保存半连接的队列是有长度限制的,如果当服务器收到大量攻击报文的时候,它就不能接收正常的连接了,换句话说,这台服务器就失去提供服务的能力了,这就是大名鼎鼎的SYN-Flood攻击的原理,它是一种典型的DoS攻击。






3  防止syn flood

(1)缩短SYN Timeout (连接等待超时)时间:减少syn ack 重试次数。

(2)syn cache & SYN Cookies:扩大缓存半连接表/无状态半连接

(3)根据源IP记录SYN连接:限制单ip连接数

(4)容忍策略(DNS方式):伪装服务器被攻击

(5)带宽控制技术(不了解)



4  Syn cookies原理

SYN cookies算法(和dpvs的不一样)

1. 设t为一个缓慢增长的时间戳(典型实现是每64s递增一次)

2. 设m为客户端发送的SYN报文中的MSS选项值

3. 设s是连接的元组信息(源ip,目的ip,源端口,目的端口)和t经过密码学运算之后得到的hash值,即s = hash(sip, dip, sport,dport, t),s的结果取低24位则初始序列号n为:

高5位为t mod 32

接下来的3位是m的编码值(实际上并不是编码值而是索引)

低24位为s

当客户端收到SYN+ACK报文之后,根据TCP标准,它会回复ACK报文,且报文中ack = n + 1,当服务器接收到ACK时,将ack的值减一就得到了它之前发送的n,服务器通过这种巧妙的方式间接保存了一部分SYN报文的信息。接下来,服务器对获得的n进行校验:

1. 将n的高五位与当前时间戳t%32进行比较,看看到达时间是否是正常的(基本上相等或者差1,太大了基本不对劲)

2. 根据t和连接元组重新计算s,看看是否与低24一致,如果不一致,说明这个报文是伪造的

3. 解码序号中隐藏的MSS信息


SYN Cookies技术由于在建立连接的过程中不需要在服务器端保存任何信息,实现了无状态的三次握手,从而有效的防御了SYN Flood攻击。但是该方法也存在一些弱点。由于cookie的计算只涉及到包头部分信息,在建立连接的过程中不在服务器端保存任何信息,所以失去了协议的许多功能,比如超时重传。此外,由于计算cookie有一定的运算量,增加了连接建立的延迟时间,因此,SYN Cookies技术不能作为高性能服务器的防御手段。通常采用动态资源分配机制,当分配了一定的资源后再采用cookie技术。还有一个问题是,当我们避免了SYN Flood攻击的同时,也提供了另一种拒绝服务攻击方式,攻击者发送大量的ACK报文,服务器忙于计算验证。



5  dpvs通过syn proxy实现syn cookies

分为以下三个阶段:

第一阶段:客户端与握手代理进行三次握手,第二步握手代理回复客户端的SYN-ACK报文携带的初始序列号(ISN1)由SYN Cookie算法生成。

第二阶段:当cookie验证通过后,握手代理充当客户端和服务端进行三次握手,并负责校正初始序列号(ISN2)和窗口大小;

第三阶段:在连接建立之后握手代理负责调整客户端和服务端之间数据传输过程中的序列号和确认号。



Syn cookies算法

相关代码:

syn_proxy_cookie_v4_init_sequence

secure_tcp_syn_cookie

check_tcp_syn_cookie

1)客服端发送syn包到syn proxy

dp_vs_pre_routing

|- dp_vs_synproxy_syn_rcv

|-syn_proxy_reuse_mbuf

         |-isn=syn_proxy_cookie_v4_init_sequence

th->ack_seq = htonl(ntohl(th->seq) + 1);

th->seq = htonl(isn);

th->window = 0;

((uint8_t *)th)[13] = 0x12;/* set syn-ack flag */

...

...

netif_xmit



2)客户端发送ack包到syn proxy

dp_vs_in

|-conn_sched

|-tcp_conn_sched

|-dp_vs_synproxy_ack_rcv

/* Do not check svc syn-proxy flag as it may be changed after syn-proxy step 1. */

|-syn_proxy_v4_cookie_check

|-dp_vs_schedule

|-dp_vs_conn_new

ack_mbuf->mbuf = mbuf;

list_add_tail(&ack_mbuf->list, &new->ack_mbuf);

new->ack_num++;

/* save ack_seq - 1 */

new->syn_proxy_seq.isn =

htonl((uint32_t) ((ntohl(th->ack_seq) - 1)));//proxy发送给client syn包的seq

/* save ack_seq */

new->fnat_seq.fdata_seq=ntohl(th->ack_seq);//client发送给proxy ack seq

cp->fnat_seq.isn = 0;


3)syn proxy发送syn包到rs

syn_proxy_send_rs_syn

syn_th->seq = htonl(ntohl(th->seq) - 1); //=client syn seq

syn_th->ack_seq = 0;

syn_th->window = htons(5000);



static inline void tcp_in_init_seq(struct dp_vs_conn *conn,

struct rte_mbuf *mbuf, struct tcphdr *th)

{

struct dp_vs_seq *fseq = &conn->fnat_seq;

uint32_t seq = ntohl(th->seq); 


if (fseq->isn != 0 && fseq->delta == fseq->isn - seq)

return; /* retransmit */

if (fseq->isn)

return;


fseq->isn = tcp_secure_sequence_number(conn->laddr.in.s_addr,

conn->daddr.in.s_addr, conn->lport, conn->dport);

//proxy发送给rs syn seq 初始值


fseq->delta = fseq->isn - seq; //两个syn包之间的差值

return;

}



static inline void tcp_in_adjust_seq(struct dp_vs_conn *conn, struct tcphdr *th)

{

th->seq = htonl(ntohl(th->seq) + conn->fnat_seq.delta);

/* recalc checksum later */

/* adjust ack_seq for synproxy,including tcp hdr and sack opt */

dp_vs_synproxy_dnat_handler(th, &conn->syn_proxy_seq);

return;

}


4)rs发送synack到syn proxy

dp_vs_synproxy_synack_rcv

cp->syn_proxy_seq.delta = ntohl(cp->syn_proxy_seq.isn) - ntohl(th->seq);


5)syn proxy发送ack到client

   ack包为保存的client到syn proxy的ack包,调整序列号后发送。

   同时发送ack到客户端,调整window:

syn_proxy_send_window_update


6)调整序列号

tcp_in_adjust_seq

th->seq = htonl(ntohl(th->seq) + conn->fnat_seq.delta);

tcph->ack_seq = htonl((uint32_t)(old_ack_seq - sp_seq->delta));


tcp_out_adjust_seq

tcph->ack_seq = htonl(ntohl(tcph->ack_seq)-conn->fnat_seq.delta);

tcph->seq = htonl((uint32_t)(old_seq+ cp->syn_proxy_seq.delta));


6  开启fullnat模式syn proxy

root@test:/usr/home/fengming5# ipvsadm -E -t 192.168.100.71:80 -j enable

root@test:/usr/home/fengming5# ipvsadm -ln

IP Virtual Server version 0.0.0 (size=0)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  192.168.100.71:80 wrr synproxy

  -> 192.168.100.72:80            FullNat 0      0          0


7  Syn flood 攻击工具

https://github.com/JuxhinDB/synner.git

标签:seq,ack,SYN,syn,dpvs,proxy,th
From: https://blog.51cto.com/u_13959518/7126121

相关文章

  • 关于async 和await关键字
    首先async关键字是标记当前方法为异步方法await关键字是为了等待异步方法结果。类似于getResult等待结果。在返回异步方法执行结果之前主线程会被阻塞。两张图解释  直接await甚至不会开启新线程。 ......
  • RTSP/Onvif视频服务器EasyNVR安防视频平台关于行业一体化监控平台的设计方案
    随着数字经济时代的到来,实体经济与数字技术的深度融合已经成为经济发展的主流思路。在这一背景下,传统能源行业的运营管理也面临着新的考验和机遇。很多大型能源企业开始积极应对这一趋势,逐步将视频监控、云计算、大数据和人工智能技术广泛应用于生产、维护、运输和配送等环节,以实......
  • 安防监控视频云存储平台EasyNVR通道频繁离线的原因排查与解决
    安防视频监控汇聚EasyNVR视频集中存储平台,是基于RTSP/Onvif协议的安防视频平台,可支持将接入的视频流进行全平台、全终端分发,分发的视频流包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等格式。为了满足用户的集成与二次开发需求,我们也提供了丰富的API接口供用户调用。有需要的用......
  • 服务端不回应客户端的syn握手,连接建立失败原因排查
    背景测试环境有一个后台服务,部署在内网服务器A上(无外网地址),给app提供接口。app访问这个后台服务时,ip地址是公网地址,那这个请求是如何到达我们的内网服务器A呢,这块我咨询了网络同事,我画了简图如下:请求会直接打到防火墙上,防火墙对请求先做了DNAT转换(将目的地址转换为后台服务器的......
  • async_await 源码分析
    async/await源码解析这篇文章主要是分析async/await这个语法糖,分析一下async和await是如何做到异步的。首先,我先抛出两个问题,各位可以先想一下。await之后的方法是何时执行,如何执行的?为什么await之后的代码会在不同的线程执行?demo要想知道async/await是怎么运......
  • 安防监控视频云存储平台EasyNVR通道频繁离线的原因排查与解决
    安防视频监控汇聚EasyNVR视频集中存储平台,是基于RTSP/Onvif协议的安防视频平台,可支持将接入的视频流进行全平台、全终端分发,分发的视频流包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等格式。为了满足用户的集成与二次开发需求,我们也提供了丰富的API接口供用户调用。有需要的用......
  • 安防视频监控平台EasyNVR视频监控汇聚平台页面无法上传授权文件的问题解决方案
    TSINGSEE青犀视频安防监控平台EasyNVR可支持设备通过RTSP/Onvif协议接入,并能对接入的视频流进行处理与多端分发,包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等多种格式。在智慧安防等视频监控场景中,EasyNVR可提供视频实时监控直播、云端录像、云存储、录像检索与回看、告警等......
  • Rsync实时同步工具
    一、rsync是什么rsync(remotesynchronize)是Liunx/Unix下的一个远程数据同步工具。它可通过LAN/WAN快速同步多台主机间的文件和目录,并适当利用rsync算法(差分编码)以减少数据的传输。rsync算法并不是每一次都整份传输,而是只传输两个文件的不同部分,因此其传输速度相当快。除此......
  • ( async/await)与(try、catch)
    避免再请求中使用then回调,将请求后的代码变成同步的,可使用async搭配awaitasync:是一个异步的方法;return返回值实际是Promise对象,不会阻塞后面的函数await:同步运算符(then的语法糖),可阻塞async函数内的await下的其他逻辑,直到执行完成后,返回请求结果(如果有的话);并不会阻塞异步方法的线......
  • SocketAsyncEventArgs内存占用太大引发OutOfMemoryExceptions
    最近把一个接收socket服务端软件升级为iocp方案,其实就是换成c#的socket的异步方法,主要参考的是微软写的Server类,然后再百度找到基于这个类实现的代码来改造上线一两天后,软件崩溃了,查日志发现报了很多OutOfMemoryExceptions错误,都是在发送方法上。因为我发送方法用的SocketAsyncE......