Mini-Firewall programmieren???
-
Hallo,
ich muss in den nächsten Tagen ein Mini-Firewall programmieren. Die wollte ich mit Hilfe von MVC++ realisieren.
Die Firewall soll recht einfach funktionieren, sprich sie soll den Verkehr zwischen Client und Server über einen bestimmten Port zulassen oder ablehnen.
Ebenfalls soll der eingehende und ausgehende Verkehr mittels Threads realisiert werden.
Meine Frage ist, kennt jemenad gescheite Tutorials die mir hierzu ein wenig weiter Helfen könnten, besonders im Bereich der Netzwerkprogrammierung unter C++?Schon mal vorab vielen Dank.
-
Du musst einen Netzwerk-Filter-Treiber programmieren. Lad Die das WDK runter, dort sind genügend Beispiele drin. Mit MSVC++ kommst Du da nicht weit.
-
-
Mit dem WDK habe ich bisher noch nicht gearbeitet, welche Vorteile bietet mir das, was ich mit MSVC++ nicht machen könnte. An sich soll es keine komplizierte Firewall werden, sie soll nur Ports zulassen oder ablehnen, mehr nicht.
Das Ganze soll auch nicht grafisch verschönt werden, zunächst genügen ein paar wenige Eingaben über die Konsole.
-
Ganz grob gesagt:
- MSVC++ => User-Mode Applikationen
- DDK => Kernel-Mode-Treiber
-
Das hilft mir leider nicht weiter. Wie man aus meinen Fragen erkennen kann, bin ich ein Anfänger im Bereich der C++ Programmierung. An sich möchte ich keine komplizierten Dinge machen. Client und Server sind berets ganz einfach geschrieben und nun möchte ich zunächst eine "Mini"-Firewall dazwischen setzen, die die Kommunikation mit dem Server zulässt oder eben ablehnt. Und das ist mit MSVC++ nicht möglich?
-
Wenn Du den Server selber geschrieben hast, dann kannst Du doch im Server machen was Du willst, oder?
Wo ist dann Dein Problem?
-
Dass ich eben noch dazwischen (so die mir aufgetragene Aufgabe) eine Firewall programmieren soll, die den Verkehr zum Server zulässt oder eben nicht, sprich Port sperren oder frei geben zunächst recht einfach später mittels Threads?
Mein Client/Server ist bis jetzt recht einfach. Der Client sendet einen String und der Server bestätigt dies.
-
"Ports sperren" verstehe ich ja noch; das könntest Du mit der Windows-Firewall machen; z.B, mittels "INetFwOpenPort".
Aber was soll: "uns später mit Threads" bedeuten?
-
Wo kann ich denn ein Beispiel für "INetFwOpenPort" finden?
Und da es in der Aufgabe eigentlich um Threads geht, soll der eingehende Verkehr und der Ausgehende Verkehr über verschiedene Threads laufen. Aber bevor ich soweit bin. muss ich erstmal das Grundgerüst programmieren. und dafür fehlen mir momentan leider die Ideen/Möglichkeiten. Aus diesem grund hoffe ich auf Hilfestellung in diesem Forum.
-
Mr.Bean06 schrieb:
Wo kann ich denn ein Beispiel für "INetFwOpenPort" finden?
kennst du google?
Mr.Bean06 schrieb:
Aber bevor ich soweit bin. muss ich erstmal das Grundgerüst programmieren. und dafür fehlen mir momentan leider die Ideen/Möglichkeiten. Aus diesem grund hoffe ich auf Hilfestellung in diesem Forum.
das wird nix. hier kommt keiner vorbei und bringt dir programmieren bei. beiß dich durch und stell konkrete fragen zu konkreten problemen, dann wirds schon eher was.
-
Das möchte ich auch gar nicht, das was ich möchte ist, als Anfänger ein paar Hilfestellungen zu bekommen in welche Richtung man sich am Besten orientiert und wo es evtl. ein gutes Tutorial oder eben Beispiel-Code zu finden ist.
Der Sprache Google bin ich durchaus mächtig. Trotzdem ging ich davon aus, dass man hier als Anfänger ein paar Fragen an die Experten stellen darf.
-
Ich glaube Du solltest noch einmal Dein Gesamtkonzept überdenken!
WAS willst Du über Threads machen? Im Server? In der Firewall? Was soll denn die Firewall mit Threads anfangen?
Meinst Du nicht eher "Proxy"? als Firewall?Wenn Du eine Firewall schreiben willst (auch wenn sie noch so *Mini* ist), dann geht dies nur als Filter-Treiber.
Welche "unkonkreten" Dinge hab ich Dir denn genannt?
-
Da dies ein Aufgabe ist, habe ich leider nicht so viel Auswahl.
Der Zugriff von Clients auf einen bestimmten Port soll dabei unterbunden oder zugelassen werden. Wenn ein client zugelassen wurde sollen 2 Threads die Ein- und Ausgabe der Daten regeln (einer die Ein- der andere die Ausgabe).
Das ist eigentlich alles was realisiert werden soll.
-
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?