DDOS 攻击
-
分布式拒绝服务(Distributed Denial of service)
-
多计算机联合发起DOS攻击,造成目标机器资源耗尽、系统过载
DDOS 攻击方式
-
Ping flood:大量ping包
-
Ping of Death:修改后的ping包,如造成逻辑错误、加长数据包使其超过IP报文限制
-
Teardrop attacks:损坏的IP包,如重叠的包或过大的包负荷
-
UDP Flood:大量udp小包
-
SYN flood:利用tcp连接过程,消耗系统资源(大量syn包)
-
CC(challenge Collapsar) : 针对业务,构造大量消耗服务器资源的业务请求
DDOS 攻击现象
-
服务器上大量TIME_WAIT包
-
网络中大量无用包
-
源地址为假
-
重复的服务请求
-
服务器死机、重启
-
网络拥塞、访问慢
-
服务器CPU满负荷
DDOS 防护措施
-
主机防护
-
关闭非必要的服务和端口
-
同一时间段内限制打开的syn半连接数量
-
缩短syn半连接的超时时间
-
及时打补丁
-
-
网络防护
-
禁止对主机非开放服务的访问
-
限制同时打开的syn最大连接数
-
限制特定IP访问
-
启用防火墙防DDoS属性
-
DDOS 防御脚本
该脚本主要用于测试,目的是将一些连接数多的IP加入到iptables并DROP掉,生产环境中基本没有作用
脚本内容
vim dropip.sh # 自动提取攻击 ip#!/bin/bash
netstat -na | awk '/ESTABLISHED/{split($5,T,":");print T[1]}' | sort | grep -v -E '192.168|127.0' | uniq -c | sort -rn | head -10 | awk '{if ($2!=null && $1>4) {print $2}}' > /var/log/rejectipfor i in $(cat /var/log/rejectip)
dorep=$(iptables-save | grep $i)if [[ -z $rep ]];then/sbin/iptables -A INPUT -s $i -j DROPecho "$i kill at `date`">>/var/log/ddos-ipfi
done
脚本逻辑
脚本的执行过程:
-
首先通过 netstat -na 查看所有的连接
-
然后通过 awk 提取所有已经成功建立连接的远程 IP 地址(也就是疑似攻击者的 IP)
-
awk 只对包含 ESTABLISHED 关键字的行做处理
-
split 指定处理第五列(也就是远程 IP 的列),将处理的数据存放入 T 数组中,指定以 : 来分隔
-
-
接着通过 sort 排序,此时会将相同的 IP 放在一起(因为 uniq 统计的时候是按行处理的,分开的相同行处理不到)
-
我们将本地的连接剔除统计
-
随后通过 uniq 命令对相同的 IP 做统计,统计出其出现的次数
-
再通过 sort 命令做反向的排序( -r 参数出现次数高的排前,低的排后)
-
使用 head 命令来读取前十个 IP 地址
-
随后我们再次使用 awk 过滤出连接数超过 4 次的 IP 地址
-
然后将过滤出来的 IP 地址重定向至 /var/log/rejectip 中
-
使用 for 循环读取文本中的 IP 地址
-
首先检查这个 IP 地址是否已经加入了 iptables 的规则中
-
若是已经加入则不处理
-
若是还未加入则使用 iptables 将其 drop 掉并记录至日志中
-
-
SYN攻击
大量连接处于SYN RECV(半连接),导致服务器资源耗费。此状况称为 ** SYN flood**
在tcp连接过程中,客户端发送了SYN,服务端响应了请求,TCP连接会变成 SYN_RCVD状态(服务端发送回确认信息以及请求信号,并将该信息加入到未连接队列中)。此时TCP状态变化为:LISTEN->SYN RECV 此时若客户端不做处理,则会一直处于该状态等待超时。该状态将造成资源的耗费。
SYN攻击的模拟测试
# 安装apache,因为要使用ab
yum -y install httpd
systemctl restart httpd
# ab发起并发请求
ab -n 1000000 -c 600 http://localhost/index.html # -n 总请求数 -c 并发数
# 服务器过滤连接情况
netstat -an | grep SYN
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a,S[a]}'
Iptables层面的防护
#使用 limit 对 syn 的每秒钟最多允许 1 个新链接,接收第三个数据包的时候触发
iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT
#或者针对每个客户端做出限制,每个客户端限制并发数为 10 个,这里的十个只是为了模拟,可以自己酌情考虑
iptables -I INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 10 -j REJECT
SYN 防范配置文件
vim /etc/sysctl.conf
# 表示开启 SYN Cookies。当出现 SYN 等待队列溢出时,启用 cookies 来处理,可防范少量 SYN 攻击,默认为 0,表示关闭
net.ipv4.tcp_syncookies = 1
# 表示开启重用。允许将 TIME-WAIT sockets 重新用于新的 TCP 连接,默认为 0,表示关闭;
net.ipv4.tcp_tw_reuse = 1
# 表示开启 TCP 连接中 TIME-WAIT sockets 的快速回收,默认为 0,表示关闭。
net.ipv4.tcp_tw_recycle = 1
# 表示开启 TCP 连接的最大数量的限制
net.ipv4.tcp_max_tw_buckets = 5000
CC攻击
-
发送大量数据包给服务器,导致服务器资源耗尽
-
主要用来攻击页面,导致访问慢
-
模拟大量用户发起访问
-
完整请求,属于TCP全连接攻击
防御方法
-
域名欺骗解析,比如解析成127.0.0.1
-
更改web端口,改成非常用端口
-
IIS屏蔽IP