Server - Code mit DDOs Ip Prüfung und Bug Time Out

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

Mathias-Kwiatkowski

Betreff: Server - Code mit DDOs Ip Prüfung und Bug Time Out

BeitragFr, Jan 10, 2014 8:19
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Jan 10, 2014 14:09
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Jan 12, 2014 17:40
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Jan 12, 2014 17:51
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Jan 12, 2014 18:07
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Jan 12, 2014 21:26
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group