Nous voyons souvent des exemples d'utilisation de SocketServer.TCPServer
pour configurer un serveur TCP en python.
SocketServer.Exemple utilisant le serveur TCP
import SocketServer
HOST, PORT = "", 12345
class SampleHandler(SocketServer.BaseRequestHandler):
def handle(self):
client = self.request
address = self.client_address[0]
client.send("May I ask your name? ")
name = client.recv(80).strip()
self.request.send("Welcome %s from %s\n" % (name, address))
if __name__ == "__main__":
server = SocketServer.TCPServer((HOST, PORT), SampleHandler)
server.serve_forever()
Cependant, avec cela, une seule connexion peut être traitée à la fois, et si une nouvelle demande de connexion arrive pendant le traitement, elle attendra la fin du traitement précédent. Changez simplement ce «SocketServer.TCPServer» en «SocketServer.ThreadingTCPServer» et vous serez en mesure de gérer plusieurs connexions en même temps.
py:SocketServer.Serveur de socket du serveur TCP.Passer au serveur TCP Threading(Partie principale uniquement)
if __name__ == "__main__":
server = SocketServer.ThreadingTCPServer((HOST, PORT), SampleHandler)
server.serve_forever()
Cependant, étant donné que le nombre de sockets utilisés augmentera, il est conseillé de prendre des mesures telles que définir la limite supérieure du nombre de connexions avec iptables et raccourcir le temps TIME_WAIT avec sysctl. Veuillez ajuster la limite supérieure et l'heure en fonction du service.
Limité à 15 connexions à partir d'une adresse IP dans les paramètres iptables
-A INPUT -p tcp -m tcp --dport 12345 --tcp-flags FIN,SYN,RST,ACK SYN -m connlimit --connlimit-above 15 --connlimit-mask 32 --connlimit-saddr -j REJECT --reject-with tcp-reset
/etc/sysctl.TIME en conf_Temps d'attente réduit à 15 secondes(60 secondes lorsqu'il n'est pas réglé)
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15
De plus, si le redémarrage du script provoque une erreur lors de l'utilisation de l'adresse, il est conseillé de définir le paramètre de réutilisation d'adresse du côté du script comme suit.
import SocketServer
import socket
HOST, PORT = "", 12345
class SampleHandler(SocketServer.BaseRequestHandler, object):
def handle(self):
client = self.request
address = self.client_address[0]
client.send("May I ask your name? ")
name = client.recv(80).strip()
self.request.send("Welcome %s from %s\n" % (name, address))
class SampleServer(SocketServer.ThreadingTCPServer, object):
def server_bind(self):
self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.socket.bind(self.server_address)
if __name__ == "__main__":
server = SampleServer((HOST, PORT), SampleHandler)
server.serve_forever()
J'ai essayé de faire fonctionner environ deux serveurs à problèmes CTF en utilisant ThreadingTCPServer.
SECCON CTF 2014 winter online qualifications Choose the number : https://github.com/shiracamus/seccon2014/blob/master/number/number.py Let's disassemble : https://github.com/shiracamus/seccon2014/blob/master/disassemble/disassemble.py
Recommended Posts