从TCP SYN flood中保护Python套接字

时间:2014-12-12 18:00:57

标签: python sockets server flooding

我有一个服务器的例子,它获取命令并在python中返回答案:

import socket
import time
import random

CommandDict = {"TIME" : time.strftime("%d-%m-%Y"),"NAME": "Ori","RANDOM": str(random.randint(0,10))}
server_socket = socket.socket()
server_socket.bind(('127.0.0.1',8820))
server_socket.listen(5)

while True:
    print "Waiting for commands"
    (client_socket, client_address) = server_socket.accept()
    client_data = client_socket.recv(1024)
    print "GOT COMMAND FROM " + client_address[0] + " : " + client_data
    try:
        client_socket.send(CommandDict[client_data])
    except Exception:
        client_socket.send("ERROR!")

    client_socket.close()

server_socket.close()

我对它进行了一次同步洪水攻击并且坠毁了。 我想保护它免受同步洪水攻击,我怎么能这样做? 我是套接字编程的新手,所以我很乐意得到一些建议^ _ ^

1 个答案:

答案 0 :(得分:1)

首先,您需要一台更好的服务器。正如@Nikolai N Fetlissov指出的那样,由于您从未关闭客户端连接,因此您正在泄漏文件描述符。

看看这个例子,看看如何避免这种泄漏:

http://ilab.cs.byu.edu/python/socket/echoserver.html

请特别注意client.close()调用的位置以及缩进级别。

接下来,您只编写来自客户端的一个命令。看看这里:

http://code.activestate.com/recipes/578247-basic-threaded-python-tcp-server/

有关编写可以处理来自每个连接的多个连接和多个命令的线程服务器的讨论。

最后,基于套接字的用户空间程序(更多是用解释语言编写)太慢,无法以任何方式处理中的真正SYN泛洪。标准方法是使用防火墙软件(并且在一定余量之后,硬件)。