Wir sehen oft Beispiele für die Verwendung von "SocketServer.TCPServer" zum Einrichten eines TCP-Servers in Python.
SocketServer.Beispiel mit TCP Server
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()
Damit kann jedoch immer nur eine Verbindung gleichzeitig verarbeitet werden. Wenn während der Verarbeitung eine neue Verbindungsanforderung eingeht, wird gewartet, bis die vorherige Verarbeitung abgeschlossen ist.
Ändern Sie einfach diesen SocketServer.TCPServer
in`` SocketServer.ThreadingTCPServer` und Sie können mehrere Verbindungen gleichzeitig verarbeiten.
py:SocketServer.TCP Server Socket Server.Wechseln Sie zu Threading TCP Server(Nur Hauptteil)
if __name__ == "__main__":
server = SocketServer.ThreadingTCPServer((HOST, PORT), SampleHandler)
server.serve_forever()
Da sich jedoch die Anzahl der verwendeten Sockets erhöht, ist es ratsam, Maßnahmen zu ergreifen, z. B. die Obergrenze für die Anzahl der Verbindungen mit iptables festzulegen und die TIME_WAIT-Zeit mit sysctl zu verkürzen. Bitte passen Sie die Obergrenze und die Zeit entsprechend dem Service an.
Begrenzt auf 15 Verbindungen von einer IP-Adresse in den Einstellungen von 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.ZEIT in conf_Wartezeit auf 15 Sekunden reduziert(60 Sekunden, wenn nicht eingestellt)
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15
Wenn ein Neustart des Skripts einen Fehler bei der Verwendung der Adresse verursacht, empfiehlt es sich, die Einstellung für die Wiederverwendung von Adressen auf der Skriptseite wie folgt festzulegen.
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()
Ich habe versucht, ungefähr zwei CTF-Problemserver mit ThreadingTCPServer zu betreiben.
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