Hallo Leute,
ich schreibe im Moment einen Service der einen
TCP und einen HTTP Server verwaltet. Das ganze läuft schon halbwegs und ist auch schon im Internet verfügbar.
Leider musste ich schon nach 4 Stunden feststellen das vorallem auf dem HTTP Server viele Zugriffe von weit entfernten Länder kommen. Somit möchte ich nun einen Server Protector schreiben der Angriffe automatisch erkennt und die
IP dann auf eine Blackliste setzt.
Ich hab mir das mal ungefähr so überlegt:
Delphi-Quellcode:
type
TServerProtector = class(TObject)
private
public
function CheckIPBanStatus(pIP, pAction: String) : integer;
end;
Wenn jetzt eine Verbindung beim
TCP oder HTTP Socket aufgebaut wird wird die Function z.b. so aufgerufen:
Delphi-Quellcode:
case CheckIPBanStatus('1.2.3.4', 'tcp_connect') of
-1 : //Erlaubt
0: //Aus irgendeinem Grund gebannt, Verbindung wird abgebrochen
1: //Aus irgendeinem Grund gebannt, Verbindung wird abgebrochen
..
end;
Die Function hat nun folgende Aufgaben:
Zuerst überprüft sie ob der User wirklich gebannt ist. => wenn ja dann gibt sie den Bangrund zurück
=> wenn nein dann speichert sie in die Datenbank das diese
IP einen Zugriff hatte.
Sollte dieser Zugriff dann zu einer Sperrung führen (z.b. 5
tcp connects in 10 sekunden) dann wird der ban eingetragen und der Bangrund zurückgegeben.
Wenn alles in Ordnung ist gibt die Function -1 zurück.
Zur speicherung in der
DB hab ich mir folgendes überlegt:
SQL-Code:
--
-- Definition of table `ipbanlist`
--
CREATE TABLE `ipbanlist` (
`
ip`
varchar(15) COLLATE latin1_german1_ci
NOT NULL,
`action`
varchar(50) COLLATE latin1_german1_ci
DEFAULT NULL,
`firstactiontime`
datetime DEFAULT NULL,
`bannedtime`
datetime DEFAULT NULL,
`unbanntime`
datetime DEFAULT NULL,
`reason`
int(10) unsigned
DEFAULT NULL,
KEY `unbanntime` (`unbanntime`),
KEY `
ip` (`
ip`),
KEY `action` (`action`)
) ENGINE=MyISAM
DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci COMMENT='
IPBanList';
So nun zu meinen Fragen:
Was haltet ihr von dem System?
Hab ich irgendwo einen Denkfehler oder was wichtiges vergessen?
Habt ihr Ideen, Verbesserungsvorschläge?
Im Moment merke ich mir nur die firstactiontime also die Zeit wo der Client den ersten Versuch gestartet hat. Wenn jetzt die Zeit nicht mehr aktuell ist dann muss ich die Zeile löschen und von vorne anfangen zu zählen. Hat jemand eine bessere Idee wie man dies lösen könnte?