------------------------本文为本身实践所总结,概念性的东西不全,这里粗劣提下而已,网上不少,本文主要说下目前较流行的syn洪水攻击和cc攻击-------------------------------------web
SYN Flood是一种广为人知的DoS(拒绝服务攻击)是DDoS(分布式拒绝服务攻击)的方式之一,这是一种利用TCP协议缺陷,发送大量伪造的TCP链接请求,从而使得被攻击方资源耗尽(CPU满负荷或内存不足)的攻击方式(TCP协议的缺陷,因此没办法根除,除非重作TCP协议,目前不可能)。vim
正常原理是:一、TCP三次握手,客户端向服务器端发起链接的时候发送一个包含SYN标志的TCP报文,SYN即同步(Synchronize),同步报文会指明客户端使用的端口以及TCP链接的初始序号服务器
二、服务器在收到客户端的SYN报文后,将返回一个SYN+ACK的报文,表示客户端的请求被接受,同时TCP序号被加一,ACK即确认(Acknowledgment),夹带也发送一个SYN包给客户端,而且服务器分配资源给该链接。cookie
三、客户端也返回一个确认报文ACK给服务器端,一样TCP序列号被加一,到此一个TCP链接完成。网络
syn flood攻击利用TCP三次握手的缺陷,在TCP链接的第三次握手中,当服务器收到客户端的SYN包后而且返回客户端ACK+SYN包,因为客户端是假冒IP,对方永远收不到包且不会回应第三个握手包。致使被攻击服务器保持大量SYN_RECV状态的“半链接”,而且会有重试默认5次回应第二个握手 包,塞满TCP等待链接队列,资源耗尽(CPU满负荷或内存不足),让正常的业务请求链接不进来。一般SYN Flood会和ARP欺骗一块儿使用,这样就形成了SYN攻击。tcp
CC攻击(Challenge Collapsar)是DDOS(分布式拒绝服务)的一种,也是一种常见的网站攻击方法,攻击者经过代理服务器或者肉鸡(被黑客黑的电脑)向受害主机不停地发大量数据包,形成对方服务器资源耗尽,一直到宕机崩溃。CC主要是用来攻击页面的,每一个人都有这样的体验:当一个网页访问的人数特别多的时候,打开网页就慢了,CC就是模拟多个用户(多少线程就是多少用户)不停地进行访问那些须要大量数据操做(就是须要大量CPU时间)的页面,形成服务器资源的浪费,CPU长时间处于100%,永远都有处理不完的链接直至就网络拥塞,正常的访问被停止。分布式
当你发现发服务器很卡,web访问很慢 甚至连SSH操做都开始有点卡的时候,你就要很是注意了。工具
检测能够这样作:网站
top 查看CPU使用率和CPU负载状况spa
负载通常小于CPU核数*0.7算正常,负载内等于或者稍大于核数。说明CPU负载开始严重了,若是超过,说明有问题。
看看哪些程序CPU使用率较高,是否为正常占用,可使用 pidof 进程名 查看该进程名的全部进程号,而后ll /proc/进程号/exe、fd查看是否为正常信息。
netstat查看端口状态
netstat -n | grep "^tcp" | awk '{print $6}' | sort | uniq -c | sort -n
1 SYN_RECV
13 FIN_WAIT1
64 TIME_WAIT
149 ESTABLISHED
能够查看当前链接状态的数量,从而进行判断。
还有vmstat、sar、等检测命令,网上有使用方法!
第一种:缩短SYN Timeout时间,因为SYN Flood攻击的效果取决于服务器上保持的SYN半链接数,这个值=SYN攻击的频度 x SYN Timeout,因此经过缩短从接收到SYN报文到肯定这个报文无效并丢弃改链接的时间。
第二种:设置SYN Cookie,就是给每个请求链接的IP地址分配一个Cookie,若是短期内连续受到某个IP的重复SYN报文,就认定是受到了攻击,之后从这个IP地址来的包会被丢弃。
(缺陷:缩短SYN Timeout时间仅在对方攻击频度不高的状况下生效,SYN Cookie更依赖于对方使用真实的IP地址,若是攻击者以数万/秒的速度发送SYN报文,同时利用ARP欺骗随机改写IP报文中的源地址,以上的方法将毫无用武之地。)
vim /etc/sysctl.conf
增长或者修改以下:(修改保存后记得sysctl -p 使之生效)
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_max_syn_backlog = 262144
net.core.netdev_max_backlog = 262144
net.ipv4.tcp_max_orphans = 262144
net.ipv4.tcp_keepalive_time = 30
iptables性质防护:
限制syn的请求速度(这个方式须要调节一个合理的速度值,否则会影响正经常使用户的请求)
iptables -N syn-flood (新建一条链)
iptables -A INPUT -p tcp --syn -j syn-flood
iptables -A syn-flood -p tcp -m limit --limit 2/s --limit-burst 50 -j RETURN
iptables -A syn-flood -j DROP
Tips:攻击这东西只能防护不能彻底根除!只能缓解,下降到最低的风险。有钱能够上第三方公司的产品服务!嘿嘿。
一、通常而言,CC攻击都是真实的IP,因此通常的作法通俗点就是封IP
二、更改web端口,默认CC攻击都是攻击服务器的80端口
三、域名欺骗,咱们可使用cdn等加速工具代理咱们的服务器,从而实现防护,(网上有人说把域名解析到127.0.0.1 让攻击者本身攻击本身,不知道有没有用,没试过。并且正式业务,你怎么可能去作这样的解析,那业务怎么办?)
使用抓包命令,抓取访问服务器80的IP数
tcpdump -tnn dst port 80 -c 100 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -n -r |head -20
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
100 packets captured
101 packets received by filter
0 packets dropped by kernel
78 IP 221.239.28.142
17 IP 124.65.101.82
13 IP 14.123.162.69
7 IP 183.238.49.188
7 IP 120.234.19.186
能够看到221.239.28.142的包最多,因此咱们进行封IP处理。
iptables -I INPUT -s 221.239.28.142 -j REJECT
#防护太多DOS攻击链接,能够容许外网每一个IP最多15个初始链接,超过的丢弃,第二条是在第一条的基础上容许已经创建的链接和子链接容许
iptables -A INPUT -i eth0 -p tcp --syn -m connlimit --connlimit-above 15 --connlimit-mask 32 -j DROP (--connlimit-mask 32为主机掩码,32即为一个主机ip,也能够是网段)
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
#抵御DDOS ,容许外网最多24个初始链接,而后服务器每秒新增12个,访问太多超过的丢弃,第二条是容许服务器内部每秒1个初始链接进行转发
iptables -A INPUT -p tcp --syn -m limit --limit 12/s --limit-burst 24 -j ACCEPT
iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT
#容许单个IP访问服务器的80端口的最大链接数为 20
iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 20 -j REJECT
#对访问本机的22端口进行限制,每一个ip每小时只能链接5次,超过的拒接,1小时候从新计算次数
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name SSHPOOL --rcheck --seconds 3600 --hitcount 5 -j DROP
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name SSHPOOL --set -j ACCEPT
(上面recent规则只适用于默认规则为DROP中,若是要适用默认ACCEPT的规则,须要--set放前面 而且无-j ACCEPT)