Mini-Firewall programmieren???



  • Dann mach das doch im Server oder schreibe einen Proxy.



  • Hab mir ja mittler Weile so einiges durchgelesen nur leider konnte ich nirgens was finden, wie ich Ports direkt anspreche.

    Gibt es unter C/C++ ein Funktion mit der ich Ports direkt sperren kann?

    Oder kann ich das nur mittels bind() realisieren?



  • Du scheinst nicht zu lesen (oder nicht zu glauben) was dir hier geantwortet wird.
    Du kannst, auf der Ebene, auf der du das gerne erledigen würdest, nichts machen, ohne einen Filter-Treiber zu schreiben, was sehr aufwändig ist (bzw. sehr viele Vorkenntnisse erfordert).

    Was du natürlich kontrollieren kannst, sind die Ports die dein Programm selbst offen hat, und die Connections die du bedienen willst (Connection annehmen, IP und/oder Port des Peers checken, und dann je nachdem gleich wieder zumachen oder eben bedienen).

    Was dir Jochen als 2. Variante empfohlen hat, nämlich einen Proxy zu schreiben, geht auch. Dann erledigst du die Überprüfung, ob erlaubt oder nicht, im Proxy, und reichst sozusagen die Verbindung zum Server weiter (einfach Byte für Byte weiterschicken was du empfängst, in beiden Richtungen). Der Server braucht sich dann nichtmehr darum zu kümmern.

    Beide Varianten sind aber nichts, was man normalerweise als "Firewall" bezeichnen würde.

    Und zuletzt: wenn du mit INetFwOpenPort etc. die Windows-interne Firewall konfigurieren willst, ist das natürlich eine Möglichkeit. Nur programmierst du dann keine eigene Firewall, sondern konfigurierst bloss die Firewall von Windows mit deinem Programm.



  • Hab mich jetzt mal euer Tipps angenommen und versuche nun einen Proxy zu programmieren.

    Leider komme ich gerade nicht so recht weiter. Wie schon erwähnt sollten bei dem Proxy zwei Threads laufen. Einer der Die Daten vom Client annimmt und an den Server sendet und einer der die Daten vom Server annimmt und an den Client sendet.

    Nun bin ich mir nicht sicher, ob ich nur resv() und send() in die jeweilige Funktion packe, die der jeweilige Thread dann aufruft, oder ob ich da auch connect(), accept(), listen() etc. mit hineinbringen muss, oder ob diese Funktionen in der main ausgeführt werden können?

    Kann mir jemand zu dieser Problematik weiter helfen?



  • 😕

    Kann mir denn keiner bei meinem Problem helfen. Den Proxy hatte ich zunächst mit der Funktion select() realisiert, da ich ihn jedoch mit Threads programmieren soll, brauche ich hierzu dringend eure Hilfe. Welche Möglichkeiten gibt es hierzu?

    Vielleicht kann mir ja doch jemand noch einen guten Tipp geben???
    😕



  • Mit 2 Threads pro Verbindung kannst du es ganz einfach machen, nämlich mit blocking IO.
    Ein Thread liest dabei vom 1. Socket (recv()) und schickt alles was er empfangen hat über den 2. Socket raus (send()). Der andere Thread macht es genau umgekehrt (liest vom 2. Socket, schreibt auf den 1. Socket).

    Die Feinheiten, wie z.B. Verbindungsabbruch, musst du selbst ausarbeiten.



  • Ja, so hatte ich es jetzt am WE auch programmiert. Danke nochmal.

    Jedoch hätte ich dazu noch eine weitere Frage. Bisher funktioniert mein Proxy nur für einen Port. Wenn ich jedoch weitere Ports zulassen, bzw. später evtl. auch wieder ablehnen, möchte, muss ich dann für jeden Port den Großteil meines Programms in einer Schleife durchlaufen lassen um die passenden Sockets zu binden und zu connecten oder gibt es hier eine andere Methode, um mehrere Ports zuzulassen?



  • Ich kenne mit TCP/IP nur die Möglichkeit einen Socket auf genau einen Port zu binden (für listen()). D.h. wenn du einen "transparenten" Proxy schreiben willst, dann wirst du es wohl so machen müssen.
    Schreib dir eine Klasse die das kapselt und instanzier diese dann mehrfach. Entweder verpasst du jedem Socket dann einen eigenen Thread der in der accept Schleife hängt, oder aber du "sammelst" die Sockets in einem FD_SET und wartest dann mit select() auf die nächste Verbindung.

    EDIT: die alternative zu einen transparenten Proxy wäre ein Proxy dem man über ein bestimmtes Protokoll mitteilen muss auf welche IP und welchen Port man sich verbinden möchte. Sowas sie SOCKS z.B. Dann muss allerdings der Client auch dieses Protokoll unterstützen um sich über den Proxy verbinden zu können. In dem Fall bräuchtest du für alles nur einen einzigen Listen-Port.



  • Die zweite Variante sagt mir jetzt leider auch nichts.

    Wie gesagt, meine Überlegungen gingen auch eher in Richtung der ersten, von dir vorgestellten, Möglichkeit.
    Sprich für jeden möglich Port wird ein Thread gestartet, der mit dem jeweiligen Server kommuniziert und mehrere Clients annimt (Ports werden hierbei in einer globalen Variable gespeichert). Die Kommunikation zwischen Clients und Server läuft dann nochmal in einem eigenen Thread ab.

    Jetzt muss jedoch noch realisiert werden, dass ich die möglichen Ports (global) ändern kann, sprich zulassen/ ablehnen. Das sollte jedoch nur passieren, wenn keine Daten auf den Threads laufen die für die Kommunikations zuständig sind. Zum einen muss ich doch den Zugriff auf die globale Variable kontrollieren, evtl. mittels Mutex und dann muss ich ja noch prüfen wann kein Verkehr aktiv ist, oder?



  • Ich weiß nicht, obs wichtige ist und korrigiert mich wenn ich falsch liege, aber wieviele Ports willst du denn behandeln?
    Alle 65535 TCP-Ports? Sind ne ganze menge Threads die da laufen würden.



  • Nein, 2-3 Ports mehr sollen es nicht sein.


Anmelden zum Antworten