长衫大佬可以坐下来,听听我讲(tree)故(new)事(bee):
【DDoS】TCP DDoS攻击防范
作者
今年中秋节那天去北京,这篇文章写于火车上。
TCP DDoS分类?什么是TCP?什么是TCP DDoS?
这个话题有点久远,现在我们已经很少听到TCP DDoS了,因为现代传统防火墙已经完全可以防御TCP层的DDoS攻击了,当然,你一定知道SYN Flood攻击,通俗的说SYN Flood就是攻击者作为客户端发送大量的SYN报文,但是不发送ACK报文,消耗服务端的TCP连接队列,也就是消耗服务端的资源,消耗完了,服务端就无法新建TCP连接,导致服务端网站无法提供正常的服务。
再来抓包看看TCP连接的整个过程:
划重点,考试考序号,进阶的同学请掌握TCP/IP状态转换图。
//三次握手阶段
1.(c->s)syn seq=3126253162 ack=0
2.(s->c)syn,ack seq=1566394084 ack=3126253163
3.(c->s)ack seq=3126253162 ack=1566394085
//HTTP交互过程
4.(c->s)get /hackbiji.html seq=3126253163 ack=1566394085
5.(s->c)ack seq=1566394085 ack=3126253249 (249-163=86 TCP载荷长度 GET)
6.(s->c)200OK seq=1566394085 ack=3126253249
7.(c->s)ack seq=3126253249 ack=1566394325 (325-085=240 TCP载荷长度 200OK)
//四次挥手阶段
8.(c->s)fin,ack syn=3126253249 ack=1566394325
9.(s->c)fin,ack syn=1566394325 ack=3126253250
10.(c->s)ack syn=3126253250 ack=1566394326
TCP首部大小20字节
你需要掌握的网络编程基础是什么?
IPv4套接字地址结构
struct in_addr{
in_addr_t s_addr; // 32位无符号整型 网络序 IP地址
}
struct sockaddr_in{
uint8_t sin_len; // 8位无符号整型
sa_family_t sin_family; // 8或16位无符号整型 地址族
in_port_t sin_port; // 16位无符号整型 端口号
struct in_addr sin_addr; // IP地址
char sin_zero[8];
}
通用套接字地址结构
struct sockaddr{
uint8_t sa_len;
sa_family_t sa_family;
char sa_data[14];
}
通用套接字地址结构的唯一用途就是:
对指向特定于协议的套接字地址结构的指针执行类型强制转换
函数
int socket(int family,int type,int protocol);
返回:成功非负描述符 出错-1
参数1:AF_INET IPv4协议
参数2:SOCK_STREAM 字节流套接字
SOCK_DGRAM 数据报套接字
SOCK_RAW 原始套接字
参数3:IPPROTO_TCP TCP传输
IPPROTO_UDP UDP传输
AFXXX和 的区别?其实他们的实现是一致的。
AF_表示地址族
PF_表示协议族
函数
int connect(int sockfd,const struct sockaddr* servaddr,socklen_t addrlen);
建立与TCP服务器的连接
返回:成功0 出错-1
参数1:socket函数返回的套接字描述符
参数2:指向一个套接字地址结构的指针
参数3:该地址结构的大小
bind函数
int bind(int sockfd,const struct sockaddr* myaddr,socklen_t addrlen);
把一个本地协议地址赋予一个套接字
返回:成功0 失败-1
参数1:socket函数返回的套接字描述符
参数2:指向一个特定于协议的地址结构的指针
参数3:该地址结构的大小
服务器在启动时绑定它们众所周知端口。
函数
int listen(int sockfd,int backlog);
TCP服务器调用,侦听连接
返回:成功0 失败-1
参数1:socket函数返回的套接字描述符
参数2:规定内核应该为相应的套接字排队的最大连接数
函数
int accept(int sockfd,struct sockaddr* cliaddr,socklen_t* addrlen);
返回:成功返回非负描述符 失败-1
TCP服务器调用,用于从已完成队列队头返回下一个已完成连接
参数1:socket函数返回的套接字描述符
参数2:出参客户进程的协议地址
参数3:出参该地址的大小
close函数
int close(int sockfd);
返回:成功0 失败-1
关闭套接字
参数1:套接字描述符
什么叫网络字节序?
其实就是大端存储
笔试/面试题:请编程判断系统是大端存储还是小端存储?
什么叫大端?
高字节在低位
什么叫小端?
高字节在高位
TCP伪造源IP的攻击的原始套接字是怎么实现的?
为了隐藏自己的攻击者身份,黑客们通常都会用虚假的源IP,里面的智慧只有玩过狼人杀游戏才会明白。如何伪装?请看我的这篇文章:SYN Flood隐藏源IP攻击
:SYN Flood隐藏源IP攻击
TCP反射型DDoS是什么?什么是代理?什么是反向代理?
什么是代理?
相信很多大佬都玩过VPN,用于科学上网或者逛逛暗网,VPN服务器就是代理。代理的特点就是对服务器而言,他不知道客户端是谁?比如我的VPN账号可以给我的朋友用,我朋友和我都在使用VPN访问谷歌,谷歌服务器不知道请求客户端是我还是我的朋友。
什么是反向代理?
你拨打10010,有联通客服接你电话,给你办事,你不管具体是谁给你办事,反正有人给你办事,10010就是反向代理。反向代理的特点就是对客户端来说,他不知道服务端是谁?10010有很多客服,你打电话的时候,并不知道哪一个客服接了你的电话?如果机会好的话,还会接到男客服的电话。
TCP反射型DDoS则是利用公网中的代理或反向代理服务器,黑客冒充代理服务器给目标服务器发送TCP报文accept函数,目标服务器将会应答攻击报文,并将应答报文发往代理服务器,代理服务器有完整的协议栈accept函数,自然会真实的应答目标服务器的TCP报文,导致他们2个掐架起来,攻击者躲在暗处开心
传统防火墙是如何防御TCP DDoS攻击的?
限时特惠:本站持续每日更新海量各大内部创业课程,一年会员仅需要98元,全站资源免费下载
点击查看详情
站长微信:Jiucxh