1.防止SYN Flooding的DoS攻击
proc/sys/net/ipv4/tcp_syncookies 所谓的阻断式服务(DoS)攻击法中的一种方式,就是利用tcp数据包SYN的3次握手原理实现的,这种方式称为SYN Flooding,如何预防这种方式的攻击,我们可以启用内核的SYN Cookie模块。
这个SYN Cookie模块可以在系统用来启动随机联机的端口(1024:65535)即将用完时自动启动 当启动SYN Cookie时,主机在发送SYN/ACK确认数据包前,会要求Client端在短时间内回复一个序号,这个序号包含许多原SYN数据包内的信息,包括IP、port等,若Client端可以回复正确的序号。
那么主机就确定该数据包为可信的,因此会发送SYN/ACK数据包,否则就不理会此数据包 通过此机制可以大大降低无效的SYN等待端口。
避免SYN Flooding的DoS攻击:# echo "1" > /proc/sys/net/ipv4/tcp_syncookies 这个设置值由于违反了TCP的3次握手(因为主机在发送SYN/ACK之前需要先等待Client的序号响应)所以可能会造成某些服务的延迟现象,例如SMTP(mail server),不过总的来说,这个设置还是不错的,只是不适合用在负载已经很高的服务器内,因为负载太高的主机有时会让内核误判遭受SYN Flooding攻击内核取消ping响应的设置有个:/proc/sys/net/ipv4/icmp_echo_ignore_broadcasts和/proc/sys/net/ipv4/icmp_echo_ignore_all
2.cc攻击分析
第一 先学习一下tcp ip协议
1、连接建立阶段的三次握手 一般情况下,客户端连到服务器叫做主动打开,服务器上的端口监听叫做被动打开
a、准备,服务器进程被动打开端口
b、第一次:客户发送SYN报文,主动打开连接。这个报文中的序号叫做ISN(初始序号),是随机产生的。(SYN报文不带数据,但是消耗一个序号)
c、第二次:服务器收到后,发送SYN+ACK报文。
d、第三次:客户段收到后,发送ACK报文进行确认。
2、连接正常终止的三次握手协议:(以客户主动关闭为例)
a、客户:发送FIN,主动关闭
b、服务器:发送FIN+ACK(当然可以加最后一块报文)
c、客户:发ACK确认
3、半关闭与四次握手: 半关闭:一方虽然关闭了发送数据,但还是可以接收数据
a、客户:发送FIN
b、服务器:发ACK,同时通知应用进程
c、服务器继续传数据 d、服务器发FIN e、客户发ACK
4、连接复位与RST标记:在一端的TCP可以请求拒绝一个连接,或者 异常终止一条连接 或者 终止一条空闲连接时候,这些都可以用RST标记位完成。
5、状态转移(有限状态机制)
(1)、正常流程的状态转移:(C表示客户端,S表示服务器,+表示接收,-表示发送) C: CLOSED--(-SYN)-->SYN-SEND--(+"SYN+ACK", -ACK)-->ESTABLISHED--(-FIN)--> FIN-WAIT-1--(+ACK)-->FIN-WAIT-2--(+FIN, -ACK)-->TIME_WAIT--(2MSL之后)-->CLOSED S: CLOSED--(被动打开)-->LISTEN--(+SYN, -"SYN+ACK")-->SYN-RCVD--(+ACK)-->ESTABLISHED--(+FIN, -ACK)-->CLOSE-WAIT--(-FIN)-->LAST-ACK--(+ACK)-->CLOSED 其中,CLOSE-WAIT表示收到第一个FIN,发送了ACK,等应用进程关闭
(2)、拒绝连接时的状态转移: C: CLOSED--(-SYN)-->SYN-SEND--(+"RST+ACK")-->CLOSED S: CLOSED--(被动打开)-->LISTEN--(-"ACK+RST")-->SYN-RCVD--(过段时间)-->LISTEN (3)、异常终止时候的状态转移 C: ...ESTABLISHED--(-"ACK+RST")-->CLOSED S: ...ESTABLISHED--(+"ACK+RST")-->CLOSED 第二 分析一下cc攻击 CC攻击是实现DDoS其中一种方法。CC攻击的特点:业内有人将CC攻击称之为“Web杀手”,当web服务遭受到时候,见不到虚假IP,更特别的是见不到特别大的异常流量。而且与传统的ddos的实现方法相比,cc攻击只需一个普通用户的网络流量,就足以挂掉一台高性能的Web服务器。 通过命令行查看是否被攻击 当Web遭受CC攻击时,80端口将被大量的垃圾数据堵塞了,正常的连接被中止,最终导致拒绝对外提供服务。在命令行下输入命令netstat -an可查看当前的连接情况,如果看到大量类似如下的连接记录时,可以断定服务器正在遭受cc攻击。TCP 192.8.8.8:80 8.7.1.6:2205 SYN_RECEIVED 4 解释:“8.7.1.6”就是被用来代理攻击的主机的IP,“SYN_RECEIVED”表示TCP连接状态标志,表明无法建立握手应答处于等待状态。因为来自不同的代理IP的攻击,所以这样的记录一般都会有很多条,这是受到攻击的一个重要特征。
linux下优化内核来防止SYN洪水攻击 SYN洪水攻击(SYN Flooding Attack)即是指利用了 TCP/IP 三次握手协议的不完善而恶意发送大量仅仅包含 SYN 握手序列数据包的攻击方式。
该种攻击方式可能将导致被攻击计算机为了保持潜在连接在一定时间内大量占用系统资源无法释放而拒绝服务甚至崩溃。如果在Linux服务器下遭受SYN洪水攻击,可以进行如下一些设置:
#缩短SYN- Timeout时间:
iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT
iptables -A INPUT -i eth0 -m limit --limit 1/sec --limit-burst 5 -j ACCEPT
#每秒最多3个syn封包进入表达为 :
iptables -N syn-flood iptables -A INPUT -p tcp --syn -j syn-flood
iptables -A syn-flood -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j RETURN
iptables -A syn-flood -j REJECT
#设置syncookies:
sysctl -w net.ipv4.tcp_syncookies=1
sysctl -w net.ipv4.tcp_max_syn_backlog=3072
sysctl -w net.ipv4.tcp_synack_retries=0
sysctl -w net.ipv4.tcp_syn_retries=0
sysctl -w net.ipv4.conf.all.send_redirects=0
sysctl -w net.ipv4.conf.all.accept_redirects=0
sysctl -w net.ipv4.conf.all.forwarding=0
sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=1
#防止PING:
sysctl -w net.ipv4.icmp_echo_ignore_all=1
#拦截具体IP范围:
iptables -A INPUT -s 10.0.0.0/8 -i eth0 -j DROP