Server - Code mit DDOs Ip Prüfung und Bug Time Out
Übersicht BlitzBasic Codearchiv
Mathias-KwiatkowskiBetreff: Server - Code mit DDOs Ip Prüfung und Bug Time Out |
Fr, Jan 10, 2014 8:19 Antworten mit Zitat |
|
---|---|---|
ich habe aus langeweile und spass an der freud mal ein wenig in blitzplus programmiert.
hierbei handelt es sich um einen server mit einer anti ddos routine und einen bugtimeout. die anti ddos routine funktioniert via IP bug timeout hingegen dient dazu um festzustellen ob ein client offline gegangen ist. der code muss natürlich dem verwender angepasst werden... vieleicht kann dieser code dem einen oder anderen nützlich sein (grad nun wo blitzplus) free ist (immoment) bei kritik oder anregungen lasst es mich wissen. der server weiter unten ist dann der client der den ddos auslösen soll. Code: [AUSKLAPPEN] Global Timer = CreateTimer(2)
AppTitle "Server" Local Server = CreateTCPServer( 12345 ) If Server Then Print "Server Gestertet Port: 12345" EndIf Local NewClient Local OnlineUser%=0 Type TClient Field IP$,Port% Field Stream Field BugTimeOut%,Ping% Field Name$,Passwort$,Status$ End Type Type TDDos Field IP$ Field MS% Field Anzahl% Field Bann% Field Sekunden%,Ms1% End Type Function GetDDos(IP$) Local Vorhanden%=0 Local D.TDDos For D.TDDos=Each TDDos If D\IP=IP Then Vorhanden=1 D\Anzahl=D\Anzahl+1 D\Ms1=MilliSecs() Local Bann%=D\Bann EndIf Next If Vorhanden=0 Then D.TDDos=New TDDos D\IP=IP D\MS=MilliSecs() EndIf Return Bann End Function Function UpdateDDos() Local D.TDDos For D.TDDos=Each TDDos If MilliSecs()-D\MS>1000 Then D\MS=0 If D\Anzahl>29 Then ;Das ist ein DDos angriff! Print "IP Bann (DDOS) : "+D\IP D\Bann=1 EndIf D\Anzahl=0 EndIf Next For D.TDDos=Each TDDos If D\Bann=1 Then If MilliSecs()-D\Ms1>999 Then D\Ms1=MilliSecs() D\Sekunden=D\Sekunden+1 EndIf If D\Sekunden=>BannZeitInSekunden Then Print "IP UnBann: "+D\IP Delete D.TDDos Bann=0 EndIf EndIf Next End Function Global BannZeitInSekunden=60*60*3 ;Hauptschleife Repeat UpdateDDos ; Client verbinden lassen NewClient = AcceptTCPStream( Server ) If NewClient Then ;Schauen ob wir den Client Schon haben. Local Client.TClient Local Client_Vorhanden%=0 For Client.TClient=Each TClient If NewClient=Client\Stream Then ;Vorhanden Client_Vorhanden=1 EndIf Next If Client_Vorhanden=0 Then stream_ip = TCPStreamIP( NewClient ) TempIP$=DottedIP( stream_ip ) If GetDDos(DottedIP( TCPStreamIP( NewClient ) ) )=0 Then Client.TClient = New TClient Client\Stream=NewClient Client\BugTimeOut=MilliSecs() Client\Status="Connect" stream_ip = TCPStreamIP( NewClient ) Client\ip$ = DottedIP( stream_ip ) Client\port = TCPStreamPort( NewClient ) Print "Client - Online" Print "IP: "+Client\IP+":"+Client\Port OnlineUser=OnlineUser+1 Else CloseTCPStream( NewClient ) EndIf Else Print "Client Vorhanden" EndIf EndIf ;Stream auslesen For Client.TClient=Each TClient If Client\Status="Offline" Then Else While ReadAvail( Client\Stream ) ; Empfangene Nachricht ausgeben Local Befehl%=ReadInt( Client\Stream ) If GetDDos(client\ip)=0 Then UpdateDDos If Befehl=0 Then Client\BugTimeOut=MilliSecs() Client\Ping=0 EndIf If Befehl=1 Then ;Beim Einloggen wird der client gekillt der grad genutzt wird. ;und der eigentliche client upgedatet ;Steht der status auf Connect sagt es nur aus das ein Client hinzugekommen ist. ;dieses bedeutet nicht das er im Spiel eingeloggt ist. EndIf Else Client\Status="Offline" CloseTCPStream( NewClient ) Exit EndIf Wend EndIf Next ;BugTimeOut Errechnen (nach 5 Sekunden geht der Client Offline) For Client.TClient=Each TClient If Client\Status="Offline" Then Else If MilliSecs()-Client\BugTimeOut>999 Then If Client\Ping=0 Then Client\Ping=1 WriteInt Client\Stream,0 EndIf EndIf If MilliSecs()-Client\BugTimeOut>999*5 Then Print "Client - Offline" Print "IP: "+Client\IP+":"+Client\Port Client\Status="Offline" CloseTCPStream( Client\Stream ) OnlineUser=OnlineUser-1 EndIf EndIf Next WaitTimer(Timer) Until KeyDown(1) Der Client zum Prüfen ob der "Anti DDOs" auch funktioniert. Code: [AUSKLAPPEN] Global Timer = CreateTimer(2)
AppTitle "Client" ; Zum Server verbinden Local Stream = OpenTCPStream( "127.0.0.1", 12345 ) If Not Stream Then RuntimeError "Verbindung konnte nicht hergestellt werden." Print "Verbinde..." While Not KeyHit(1) WriteInt Stream,1 ;der hier ist dazu da um den DDos herbeizurufen. ;Eingehend vom Server While ReadAvail( Stream ) Befehl%=ReadInt( Stream ) If Befehl= 0 Then WriteInt Stream,0 EndIf Wend Wend ; Stream schliessen CloseTCPStream( Stream ) End |
||
Skype: Anarchie1984
http://projektworks.de/maxbase/ Icq - Erneuert am 21.08.2017 Yahoo - Erneuert am 21.08.2017 |
DAK |
Fr, Jan 10, 2014 14:09 Antworten mit Zitat |
|
---|---|---|
Kleinigkeit am Rande:
Unter einer DoS (=Denial of Service)-Attacke versteht man eine Überlastung des Servers, wobei eine reine DoS-Attacke von einem einzelnen Angreifer kommt. DDoS steht für Distributed Denial of Service, also ein verteilter Angriff, wo hunderte bis hunderttausende angreifende Computer das Ziel mit vielen normalen Anfragen bombardieren. Mit deinem Filter filterst du einzelne Angreifer, die extrem viel spammen aus, aber einen DDoS-Angriff wirst du damit nicht filtern können. Bei einem DDoS-Angriff hast du dann nicht einen, der 1000 Mal die Sekunde anschreibt, sondern 1000, die ein Mal pro Sekunde anschreiben (oder gar seltener). Das große Problem mit DDoS-Attacken ist, dass die einzelnen Angreifer üblicherweise versuchen, sich möglichst wie echte Nutzer zu verhalten. Das heißt, wenn, dann ist dein Filter ein DoS-Filter. Das andere ist, dass dein Filter leider nicht mal alle Standard-DoS-Attacken filtern kann. Vor allem Angriffe, die auf den Verbindungsaufbau setzen (da dein Filter ja erst nach einer erfolgreich aufgebauten Verbindung greift), wie z.B. SYN-Flooding wirst du so nicht los. Auch wenn du einfach von einer Million gleichzeitigen Verbindungsaufbauten überschwemmt wirst, kannst du kaum was dagegen machen. |
||
Gewinner der 6. und der 68. BlitzCodeCompo |
Mathias-Kwiatkowski |
So, Jan 12, 2014 17:40 Antworten mit Zitat |
|
---|---|---|
mhh das einzigste was mir dazu einfallen würde wäre:
ich pack alle offenen verbindungen in einer liste (bzw alle offenen die innerhalb 1 sekunde gekommen sind) und wenn es mehr als z.b. 100 verbindungen sind diese zu klatschen (nach dem die sekunde abgelaufen ist) ansonsten fällt mir dazu nichts ein, vieleichthast du ein rat wie man soetwas was ich (server jumping) nenne verhindern kann. auf jedenfall ist mit dem derzeitigen code erst mal der eine user der spammt (egal ob mit verbindungen oder senden von irgendwelchen daten) ausgeschaltet, dieses ist ja auch ein wenig was wert. und die user die sich mit dem thema noch nich ganz so befasst haben können eventuel daraus was ableiten. wie gesagt ein rat wie man das server jumping verhindern kann wäre nicht schlecht. aber das denke ich haben auch grössere konzerne,. also solche probleme oder nicht? |
||
Skype: Anarchie1984
http://projektworks.de/maxbase/ Icq - Erneuert am 21.08.2017 Yahoo - Erneuert am 21.08.2017 |
BtbN |
So, Jan 12, 2014 17:51 Antworten mit Zitat |
|
---|---|---|
Gegen nen DDoS tut man garnix. Die Software hat damit nur sehr wenig zu tun, die verbindung ist einfach völlig verstopft.
Die einzige Abwehr gegen nen DDoS ist mehr bandbreite. |
||
DAK |
So, Jan 12, 2014 18:07 Antworten mit Zitat |
|
---|---|---|
Zitat: ich pack alle offenen verbindungen in einer liste (bzw alle offenen die innerhalb 1 sekunde gekommen sind)
und wenn es mehr als z.b. 100 verbindungen sind diese zu klatschen (nach dem die sekunde abgelaufen ist) Meinst du, dass du bei zu vielen einkommenden Verbindungen einfach alle neuen Verbindungen schließt? Das wäre eher problematisch. Damit könnte ein DoSer dir den Service noch viel effektiver absperren: solange er andauernd neue Verbindungen spammt, kann sich keiner mehr auf den Server verbinden. Da braucht er deinen Server gar nicht zu Tode überlasten, wenn er vorher schon freiwillig sperrt. Zitat: ansonsten fällt mir dazu nichts ein, vieleichthast du ein rat wie man soetwas was ich (server jumping) nenne verhindern kann.
Was meinst du mit Server jumping? Der Begriff ist mir in dem Zusammenhang unbekannt. Falls du meinst, dass sich viele Fake-Clients von verschiedenen Computern aus anmelden, das nennt sich DDoS (im Vergleich zu DoS, wenn's nur einer macht). Gegen fortgeschrittene DoS-Attacken wie Smurf oder SYN-Flood kannst du nichts machen, da dir Blitz keinen so tiefen Zugriff lässt (du kannst aus Blitz nicht die einzelnen TCP-Pakete steuern). Gegen ein gutes DDoS was machen ist extrem schwer. Das Ziel der Attacke ist ja nicht dauerhaften Schaden anzurichten, sondern deinen Service temporär unverwendbar zu machen. Wenn dein Server als Reaktion auf den Angriff auch echte User blockiert (wie dein "kicke alle User wenn sich mehr als 100 pro Sekunde anmelden"), dann spielst du dem Angreifer in die Hände. Du bräuchtest einen Filter, mit dem du möglichst viele Angreifer erkennst, aber wo ausnahmslos jeder echte Client am Leben bleibt. Was eine mögliche Lösung (ist aber ein Filter, der erst nach der Verbindung klappt) wäre dass sich der Client per Public Key Challenge Response authentifizieren muss. Alle, die das nicht nach z.B. 3 Sekunden gemacht haben, werden gekickt. Eine vollständige Lösung ist das aber auch nicht. Im Endeffekt denke ich nicht, dass irgendwer hier in diesem Forum bei einem Projekt, das sie mit Blitz gemacht haben, mit DDoS-Attacken konfrontiert werden. Selbst DoS-Attacken sind da schon sehr selten. Z.B. hätte dein Chat-Programm in Echtwelt-Aufgaben noch viel eher ein Problem mit Spammern als mit DoSern. Bevor du eine "Ban bei 100 Posts/Sekunde"-Regel aufstellst, würde ich eher ein "3-Minuten-Block bei 20 Posts in 5 Sekunden"-Regel einsetzen. |
||
Gewinner der 6. und der 68. BlitzCodeCompo |
Mathias-Kwiatkowski |
So, Jan 12, 2014 21:26 Antworten mit Zitat |
|
---|---|---|
Zitat: Was eine mögliche Lösung (ist aber ein Filter, der erst nach der Verbindung klappt) wäre dass sich der Client per Public Key Challenge Response authentifizieren muss. Alle, die das nicht nach z.B. 3 Sekunden gemacht haben, werden gekickt. Eine vollständige Lösung ist das aber auch nicht.
an sowas in der art habe ich gedacht. auch habe ich mir schon gedacht das ein noname projekt "was vom einzellnen usern hier aus dem forum kommt" kaum eine reale chance hat ein interesse zu wecken bei "hackern" oder leute die einen service komplett in die knie zu zwingen. mit anderen worten der code dort oben macht es blitz usern die ein kleineres bis mittleres projekt haben recht "sicher" gegenübern einzellnen spammern. das ist im grunde ja auch schon etwas. "server jumping" darunter versteht sich eigentlich soetwas was auch dem hause blizzard passiert ist einige hundert usern die mit dem service vom jeweiligen unzufrieden waren. haben sich nach absprache. mehrfach auf einem "relam" server eingeloggt und das möglichst zur gleichen zeit. ( auch wieder ausgeloggt und erneut eingeloggt usw. ) was die leute dazu bewegte waren laggs am server die wiederrum mit account bann bestraft wurden (auf gewisser zeitlänge). nunja wer den einzellnen user der spamming versucht blockieren mag. der kann sich gern diesem code bedienen. |
||
Skype: Anarchie1984
http://projektworks.de/maxbase/ Icq - Erneuert am 21.08.2017 Yahoo - Erneuert am 21.08.2017 |
Übersicht BlitzBasic Codearchiv
Powered by phpBB © 2001 - 2006, phpBB Group