Entwickler-Ecke

Internet / Netzwerk - Indy Server sicher machen


LittleBen - Sa 07.02.15 22:43
Titel: Indy Server sicher machen
Guten Abend!
Ich betreibe seit einiger Zeit eine App, die auf einen eigen angefertigten Server zugreift.
Jetzt habe ich mal interessehalber eine Attacke simuliert und musste ein erschreckendes Ergebnis feststellen. Der Server geht schon bei ca. 50 gleichzeitgen Connects in die Knie.
Hier mal die Stelle, an der alles ins Rollen gebracht wird:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure TServerEventHandler.OnServerExecute(AContext: TIdContext);
var Cmd: String;
    Response: TMemoryStream;
    RequestHandler: TRequestHandler;
begin
 Cmd:= Trim(AContext.Connection.IOHandler.ReadLn);
 RequestHandler:= TRequestHandler.Create;
 try
  Response:= RequestHandler.CreateResponse(Cmd, AContext.Connection.Socket.Binding.PeerIP); // MySQL-Zugriffe etc...
  Response.Seek(0, soFromBeginning);
  AContext.Connection.Socket.Write(Response);
  AContext.Connection.Disconnect(false);
 finally
  RequestHandler.Free;
  Response.Free;
 end;
end;

Außerdem wird auch die maximale TCP-Anzahl überschritten, weshalb nach einer Weile auch die Kommunikation zum MySQL-Server abgeschnitten wird.
Wie lässt sich das nun so optimieren, dass Clients ggf. auch in eine Warteschlange eingereiht werden? Ich bin mir sicher, ihr kennt eine Menge Lösungsansätze!

Vielen Dank schonmal und noch ein schönes Wochenende,
Benny


Sinspin - Mo 09.02.15 12:38

Hey, ich kenne mich mit Indy Komponenten nicht sonderlich aus aber ich denke das die ähnlich sind wie andere.
Hast Du den TServerEventHandler selber implementiert? Ist da ein TIdSocksServer drunter?

Ich habe mir den TIdSocksServer mal grob angesehen und finde die Komponente interessant aufgebaut. Was für einen Scheduler hast du für das verarbeiten der Anfragen festgelegt?
Falls Du nicht möchtest das zu viele Verbindungen zur gleichen Zeit möglich sind oder das eine Verbindung zu einer bereits bekannten IP sofort wieder hergestellt wird kannst Du das via OnBeforeSocksBind verhindern.