CGIConfig v0.24
Firewall-/Forwarding-Setup für Linux-Router via CGI
http://www.itamservices.de/fli4l
1. Inhalt
- Inhalt
- Disclaimer
- Installationshinweise für FLi4L ab v2.0pre3
- Voraussetzungen
- Installation
- Konfiguration und Funktionsumfang
- online hosts
- firewall state
- advanced firewall state
- portforwarding state
- advanced portforwarding state
- Wichtiger Hinweis
- Variablen in der cgiconfig.txt
- Automatisierung
- Schlusswort
- History
- Roadmap
- Wishlist
2. Disclaimer
Ich übernehme keinerlei Verantwortung für eventuelle Schäden, die durch dieses Skript verursacht werden könnten. Die Benutzung erfolgt ausdrücklich auf eigene Verantwortung.
3. Installationshinweise für FLi4L ab v2.0pre3
3.1 Voraussetzungen
- In der FLI4l-Config müssen aktiviert sein:
- der mini-httpd
- das opt_portfw
- arp aus den fli4l-tools von Frank Meyer (gibt's auf www.fli4l.de unter Add-Ons, s. auch FLi4L-Doku, Kapitel 5)
- Das OPT_BASH oder eine vergleichbare, fortschrittlichere Shell als /bin/sh muss installiert werden, da die CGIs ansonsten aufgrund von segmentation faults fehlerhaft laufen.
- optional:Wenn das Portforwarding-Setup genutzt werden soll, ist ein DynamicDNS-Account (z.B. bei www.dyndns.org, siehe auch OPT_DYNDNS) sehr von Vorteil, um von außen über einen festen (Sub-)Domain-Namen anstatt über die (sich ändernde IP) Zugriff zu haben. Sollen nach der Einwahl Standard-Forwardings gesetzt werden, so geschieht dies seit FLi4L 2.0pre3 über die base.txt. Auch hier rate ich dringend zum genauen Lesen der Dokumentation, HowTo's und bei Problemen zum Durchsuchen der ML/NG.
Hinweis: Die datei .../htdocs/cgiconfig/dyndns wird nicht mehr benötigt, sie diente nur dem "Herausfinden" der WAN-IP. Ein o.g. dyndns-Account ist seit v0.18b also nicht mehr zwingend erforderlich.
- Diese Skripts funktionieren auch mit jedem anderen CGI-fähigen WebServer, der auf einem Linux/Unix-System läuft, es sollte nur die Shell 'ae' vorhanden sein. Wird die ash oder bash eingesetzt, müssen die Skripts eventuell angepasst werden. Außßrdem muss geprüft werden, ob das vorhandene ipchains/ipmasqadm/portfw die gleiche Syntax aufweist, ferner sollten die Pfadangaben geprüft werden. Skriptanpassungen dürften aber auch hier kein Problem darstellen.
3.2 Inatallation
Man entpacke das Archiv und kopiere alles in das FLi4L-Basisverzeichnis - fertig. Nun noch eine neue Diskette erstellen oder den Router per imonc updaten, und schon kann man loslegen.
Wenn man die Dateien per ftp hochgeladen hat muss man noch darauf achten, dass die CGIs ausführbar sind. Am einfachsten führt man dazu ein
chmod 777 /usr/local/htdocs/*.cgi
an der Router-Konsole oder per telnet/ssh aus.
4. Funktionsumfang
Ich denke, prinzipiell sind die beiden Skripte größtenteils selbsterklärend.
main_cgiconfig.cgi zeigt den momentanen Zustand an und bildet die "Schaltzentrale".
Seinerseits ruft es die cgiconfig_switch.cgi auf, welche dann die eigentlichen
Änderungen vornimmt.
4.1 online hosts
Hiermit erhält man eine Liste aller in der base.txt eingetragenen Clients, sowie aller Hosts, die vom Router per DHCP konfiguriert wurden mit ihrem online-/offline-Status, sowie eine Übersicht, welcher Host wieviel traffic produziert.
4.2 firewall-state
Hier hat man die Möglichkeit, den Internet-Zugang clientweise zu gestatten/zu verweigern. Wird ein Client gesperrt, dann werden die portforwarding-Funktionen von 'ipmasqadm portfw', die unter "portforwarding-state" verfügbar sind, für den entsprechenden Host automatisch ebenfalls deaktiviert.
Man hat die Möglichkeit, einen Host jeweils 'gelb' oder 'rot' zu sperren. 'gelb' bedeutet 'forward deny', der Zugriff auf den Router selbst wird also weiterhin erlaubt - also auch auf eventuelle Proxy-Server. Will man einen Host also 'definitiv' sperren, so kann man für ihn mit 'rot' auch ein 'input deny' auslösen - dann ist jeglicher Zugriff zum Router gesperrt. Diese Funktion ist aber bei DHCP-Clients mit Vorsicht zu genießen, diese werden dann auf einmal 'vergesslich' und sind u.U. vom LAN aus gar nicht mehr ansprechbar.
In die Textfelder "custom-IP" können IPs von Rechnern eingegeben werden, die nicht angezeigt werden. In der Liste erscheinen automatisch alle Hosts aus der base.txt und solche, die vom Router per DHCP konfiguriert worden sind.
Vorsicht: Wird der Host rot gesperrt, von dem aus cgiconfig angesprochen wird, ist jegliche Kommunikation mit dem Router unmöglich, da alle Verbindungen über das TCP-Protokoll abgelehnt werden (imonc (port 5000), Netzwerkumgebung/Samba (ports 137-139), ftp (port 21), httpd/webfrontend/cgiconfig(!) (port 80))
4.3 advanced firewall-state
Diese Maske habe ich erstellt, um mir ewiges Getippe im telnet zu ersparen... An dieser Stelle seien einige ipchains-HowTo's erwähnt, deren EINGÄNGIGES STUDIUM UNUMGÄNGLICH UND ABSOLUT ERFORDERLICH IST, bevor hier Hand angelegt wird, es geht hier um die Sicherheit Ihrer Daten!
Die Einträge der chains können auch wieder per Mausklick gelöscht werden. In der Liste der momentan maskierten Verbindungen kann jede Verbindung (in beide Richtungen) per Mausklick gesperrt werden.
4.4 portforwarding-state
zeigt an, welche Ports auf welchen Client im Netz weitergeleited werden. Ist ein Host im Firewall-Setup deaktiviert, so blinkt hier der entsprechende Host rot. Im Dropdown-Listenfeld kann man eine Anwendung auswählen, für die die Ports geforwardet werden sollen. Diese Liste kann selbst spielend erweitert werden, indem man im Verzeichnis htdocs/fwrd_modules einfach eine Datei mit dem Namen des Programms anlegt.
Ihr Inhalt sieht folgendermaßen aus:
- Zeile: protocol source_port destination_port
- Zeile: protocol source_port destination_port
- evtl. weitere...
- protocol kann "udp" oder "tcp" sein (ohne Anführungszeichen)
- source_port gibt den Port an, auf dem die Verbindung auf Router hereinkommt
- destination_port gibt den Port auf dem Client im LAN an, auf den die Verbindung geforwardet werden soll.
- Die letzte Zeile sollte keine Leerzeile sein, da ansonsten eine Fehlermeldung 'illegal port specified' ausgegeben wird (ist aber nicht tragisch). Ferner sollten die Dateien im Unix-/Linux-Format erstellt werden und damit also nicht die Zeilenumbrüche CR+LF enthalten.
Textfelder "custom-IP" s. firewall state
Achtung: Alle Standard-Forwardings (d.h. dies gilt nicht für die Advanced-Forwardings) können nur im Online-Zustand vorgenommen werden und müssen, sofern sie noch erwünscht sind, nach jeder (Wieder-) Einwahl erneut vorgenommen werden, da nach jeder Abwahl alle Forwardings gelöscht werden. Bei der (Wieder-) Einwahl werden nur die Forwardings aus der base.txt und der cgiconfig.txt aktiviert. (Außerdem wird aufgrund der Syntax von 'ipmasqadm portfw' immer die aktuelle WAN-IP des Routers zum Einstellen des Forwardings benötigt.)
Über die Auswahl "init default portforwarding/shutdown portforwarding" kann das Portforwarding manuell an- und abgeschaltet werden. Dabei werden beim Anschalten die Forwardings aus der base.txt, der cgiconfig.txt und - sofern manuell modifiziert - auch aus der portfw.sh aktiviert, beim Abschalten werden die autofw- und portfw-tables geflushed.
4.5 advanced forwarding-state
Dies ist das Pendant zu "advanced firewall state". Leider werden hier nur die geforwardeten Ports aufgelistet, die über 'ipmasqadm portfw' geforwardet wurden, da ich bislang noch keine einfach Möglichkeit gefunden habe, die Forwarding-Tabelle von 'ipmasqadm autofw' auszulesen. Es gibt zwar die Datei /proc/net/ip_masq/autofw, jedoch stehen die Ports und Adressen hier nicht im Dezimalsystem. In der Liste der geforwardeten Ports ist jeder Eintrag per Mausklick entfernbar.
4.6 Wichtiger Hinweis zu den advanced-setups
Die Advanced-Setups sind mit Vorsicht zu genießen! Wenn man sich nicht auskennt, öffnet man Hackern Tür und Scheunentor zum eigenen System oder man sperrt sich gar selbst aus. Des weiteren kann die Integrität des Zusammenspiels zwischen dem Standard-Firewall-Setup und dem Standard-Portworwarding-Setup nicht mehr gewährleisted werden, sobald etwas in den Advanced-Setups geändert wird. Ich denke nicht, dass ich hier großß irgendwelche "Kontrollmechanismen" schreiben werde, da die Möglichkeiten der versierten Nutzung derart vielschichtig sind, das sie eigentlich kaum fassbar sind; wären sie es, würden sie für einen Profi-Benutzer den Funktionsumfang nur schmälern bzw. könnte er sich bei Bedarf diese Mechanismen dann auch selbst stricken. Ein Otto-Normalverbraucher, der Schutzmechanismen "bräuchte", sollte ohnehin lieber die Finger von den Advanced-Setups lassen.
4.7 Variablen in der cgiconfig.txt
Seit das Portforwarding nicht mehr direkt über die portfw.sh eingestellt wird, sondern über die base.txt, finde ich das Ganze etwas unübersichtlicher. (Und das ist ausdrücklich meine ganz persönliche Meinung.) Ab der 0.19b gibt es jedenfalls die Möglichkeit, auch in der cgiconfig.txt port-forwardings einzustellen, und zwar in Anlehnung an die forwarding-modules, die auch im Web-Interface von cgiconfig verwendet werden.
Außerdem habe ich beschlossen, die hosts-Sperrungen auch über die cgiconfig.txt zu ermöglichen, da die in der base.txt unter forward-deny-host eingetragenen hosts nicht als offline dargestellt werden. Das hat folgenden Grund:
Läuft auf dem Router ein Proxy-Server, so ist es u.U. trotzdem möglich, Internet-Zugriff zu erhalten. Deshalb verwendet cgiconfig für die Sperrung nicht die forward-chain (wie die von der base.txt gesteuerte /etc/rc.d/fwrules), sondern die input-chain. Daher ist eine Erkennung, ob ein host über die base.txt gesperrt wurde für cgiconfig (noch?) nicht möglich.
OPT_CGICONFIG='yes' |
das CGIConfig-Package an-/ausschalten |
|
CGICONFIG_FWL_N='2' |
Anzahl der zu sperrenden Hosts |
CGICONFIG_FWL_1='ftp 192.168.6.1 2' |
Modus (1=forward deny; 2=input deny, s.o.) und IP-Adresse des hosts |
|
CGICONFIG_FWL_2='enterprise 1' |
bzw. DNS-Name des hosts |
CGICONFIG_FWRD_N='2' |
Anzahl der forwardings |
CGICONFIG_FWRD_1='ftp 192.168.6.1' |
forwarding des "ftp-moduls" auf die IP 192.168.6.1 |
CGICONFIG_FWRD_2='icq enterprise' |
forwarding des "icq-moduls" auf den Rechner mit dem DNS-Namen "enterprise" |
Die Art des forwarding-setups von cgiconfig hat vor allem dann den deutlichen Vorteil der Übersichtlichkeit, wenn man mehrere Dienste im LAN nach außen hin anbieten will, die jeweils mehrere Ports benötigen, z.B. will man ICQ auf 5 Clients im LAN laufen lassen. Dann kann man sich einfach fünf zusätzliche Module (icq_1, icq_2, icq_3...) erstellen und mit 5 Zeilen aktivieren:
CGICONFIG_FWRD_N='5' |
Anzahl der forwardings
|
CGICONFIG_FWRD_1='icq_1 192.168.6.1' |
Modul 'icq_1' auf 192.168.6.1 forwarden |
CGICONFIG_FWRD_2='icq_2 192.168.6.2' |
Modul 'icq_2' auf 192.168.6.1 forwarden |
CGICONFIG_FWRD_3='icq_3 192.168.6.3' |
usw... |
CGICONFIG_FWRD_4='icq_4 192.168.6.4' |
|
CGICONFIG_FWRD_5='icq_5 192.168.6.5' |
|
5. Automatisierung
Hierfür wird OPT_EASYCRON benötigt.
Es können im Prinzip alle Aktionen, die durch die cgiconfig_switch ausgeführt werden, automatisiert werden. Wie cron zu bedienen ist, erkläre ich hier nicht extra, dafür gibt es genügend andere Resourcen. Zur Vorgehensweise. Man erstellt einen neuen Cron-Job, an die Stelle des Befehls schreibt man Folgendes:
- cgiconfig_switch.cgi "[alle Parameter die in der Adress-Leiste nach dem ? stehen]&html=0"
- cgiconfig_switch.cgi "fwl_mode=2&fwl_host=192.168.0.11&html=0"
Mit html=0 kann schließlich der ganze HTML-Mist unterdrückt werden, so dass nur noch plain text im syslog erscheint.
6. Schlusswort
Bug-Reports und Verbesserungsvorschläge bitte an u.a. eMail-Adresse richten, dafür bin ich jederzeit offen und dankbar. Denkt daran, verbessert werden kann nur etwas durch gemeinsames Zusammenarbeiten. Ich hoffe, Euch mit diesen Skripts die Router-Konfiguration ein wenig bequemer zu machen. Ich versuche mit dem Weiterentwickeln am Ball zu bleiben. Also öfters mal am Wochenende reinschauen dürfte sich lohnen ;-)
7. History
- 0.2a
- fwswitch nach main_fwswitch umbenannt, um den link nicht mehr in der menu.cgi eintragen zu müssen
- http-header eingefügt, HTTP Error 500 behoben
- 0.3a
- Bug beim Auslesen der Hosts aus der rc.cfg behoben (im Zusammenhang mit leeren Host_x Variablen)
- README aktualisiert
- 0.4b
- Portforwarding-Setup "modularisiert"; es lässt sich nun spielend erweitern
- einige Parameter in den Skripts für bessere Lesbarkeit umbenannt
- README aktualisiert
- 0.5b
- Bug-fixes in den CGIs
- dyndns-Adresse nicht mehr in Variablen am Anfang der Skripte sondern in einer extra Datei: fwdyndns
- 0.6b
- Nur Layout-Veränderungen (Anpassung an FLi4l 1.6.2)
- 0.7b
- weitere Layout-Veränderungen
- Punkbuster-Forwarding. Bitte unbedingt bescheid sagen wenn's funktioniert!!!
- kleinere Bugfixes
- README aktualisiert
- 0.8b
- 0.9b
- Die wichtigste Änderung war wohl, dass das Feststellen der online hosts nun innerhalb weniger Sekunden für's gesamte Netzwerk möglich ist. Durch einige Feedbacks wurde ich auf arp hingewiesen. Danke!
- kleine Layout-Bugs beseitigt
- 0.10b
- Die Überprüfung der online hosts habe ich auf das C-Flag ausgeweitet, eine Prüfung auf eine HW-Adress ungleich "00:00:00:00:00:00" reichte nicht aus, um abgeschaltete Clients in "einigermaßßen Echtzeit" auch im CGI-Setup als offline angezeigt zu bekommen.
- Pfadangabe aus Kompatibilitätsgründen zu FLi4L 2.0pre bei arp rausgenommen
- einige Portforwarding-Module aus "todo" fertiggestellt
- 0.11b
- Falsche Ports in einigen Portforwarding-Modulen verbessert
- Neue Portforwarding-Module
- Pfad zum arp-Befehl wieder hinzugefügt. Bin mir nicht sicher, ob die Probleme nun beseitigt sind, es könnte wegen der Pfadstruktur von 2.0pre noch ein kleines hin- und her geben...
- 0.12b
- manuell ausführbaren "pingall-befehl" hinzugefügt
- Anzeigefehler im Standard-Portworwarding-Setup behoben, wenn kein Modul ausgewählt war und auf "Show" geklickt wurde
- Standard-Werte im Advanced-Portforwarding-Setup geändert
- CGIs umbenannt
- fwdyndns nach dyndns umbenannt
- fwdata nach fwrd_modules umbenannt
- 0.13b
- wichtigste Neuerung: erste Ausgabe des Scriptcodes für den adv. firewall-state (bitte mit Vorsicht genießßen!)
- neue Aufmachung als OPT-Paket für FLi4L mit Install-Batch
- bösen Pfadebug (wg. arp) beseitigt
- html-code verbessert, cgiconfig kann nun auch mit Netscape eingesetzt werden
- readme erweitert
- 0.14b
- Es gab immer noch massive Probleme mit verschiedenen Browsern; zum einen lag das Problem am html-Code in Bezug auf Anführungszeichen ( " und \" ); des weiteren kam es zu sog. "segmentation faults", wenn die Ausgabe eines einzigen echo-Befehls zu viel Text enthielt. Die verbleibenden nicht eindeutig reproduzierbaren Fehlermeldungen konnte ich durch Auslagern eines Teils des advanced-firewall-state codes in das Skript cgiconfig_fwl_adv_swap.cgi beheben.
- das opt-archiv enthält nun das Verzeichnis "opt_cgiconfig.v0xx" nicht mehr, die CGIs liegen im "Stammverzeichnis", das erste Unterverzeichnis ist cgiconfig mit den restlichen Dateien.
- Erweiterung und Konvertierung der readme nach html
- 0.15b
- Adressen im advanced-portforwarding-state werden nun numerisch als IP angezeigt
- automatischen page-refresh nach dem Aufruf von cgiconfig_switch.cgi deaktiviert, da es Probleme gab, wenn z.B. directplay-forwarding benutzt wurde - es wurde auf die Status-Seite zurückgesprungen, bevor alle portforwardings aktiviert werden konnten. Eine Erhöhung des Timeouts schien nicht sinnvoll, da etwa 15s benötigt wurden. Bei kürzeren forwarding-Aufgaben 15s zu warten...nein, da klicke ich lieber auf "continue" ;)
- kleinere Bugfixes
- einige vergessene "Debug-Features" aus 0.14b entfernt (z.B. Rahmen bei den advanced-firewall-setup options...)
- Help-Button für das advanced-firewall setup
- 0.16b
- fehlende targets REDIRECT und RETURN hinzugefügt
- Help-Button jetzt auch für advanced portforwarding-setup
- 0.17b
- Ab sofort wird die Shell 'ae' für die Verwendung mit cgiconfig empfohlen, da die /bin/sh mehr und mehr 'segmentation faults' verursachte, weil die echo-Befehle mittlerweie einfach zu lang und komplex geworden sind.
- Bug beim De- und Reaktivieren der Hosts unter firewall-state behoben, der bei der Vergabe bestimmter IP-Kombinationen auftrat
- Sicherheitsloch unter firewall-state gestopft: wenn auf dem router ein proxy lief, hatte man wieder web-zugriff (wenn auch nur port 80). Die betreffende firewall-rule wurde von der forward-chain in die input-chain verschoben.
- Bug bei online hosts behoben.
- HTTP-Header verändert, so dass jetzt eigentlich alle Browser immer alle Seiten komplett neu laden sollten (wobei beim IE6 unter WinXP trotzdem Probleme auftreten).
- autoinst.bat entfernt und die Pfade für FLi4L ab 2.0pre3 angepasst.
- 0.18b
- Die Datei ...htdocs/cgiconfig/dyndns wird durch Automatisierung der WAN-IP-Abfrage überflüssig.
- In den Standard-Setups können nun auch "custom IPs" zum sperren bzw. als forwarding host angegeben werden.
- manuelles aktivieren/deaktivieren der portforwardings im standard-setup
- 0.19b
- Alternative (und m.E. leichtere) Möglichkeit zum Einstellen der standard-portfowardings über die cgiconfig.txt
- 0.20b
- Bug beim Starten des Routers behoben (". /etc/rc.cfg" aus der rc610.portfw.cgiconfig entfernt)
- opt_ae ist nun nicht mehr optional sondern Voraussetzung zur korrekten Funktionsweise von CGIConfig
- 0.21b
- Abfrage, ob standard-forwarding für eine IP gesetzt ist, verbessert. Es kam u.U. zu Problemen, wenn unterschiedliche Quellports auf unterschiedliche IPs im LAN mit den gleichen Zielports geforwardet wurden.
- opt/cgiconfig.txt an FLi4L 2.02 angepasst (Aufführung jeder einzelnen Datei im htdocs-Verzeichnis)
- Standard-Host-Sperrungen über cgiconfig.txt
- forward-module für Netmeeting hinzugefügt, das zusammen mit dem neuen h.323-Masq-Modul jetzt endlicht richtig funktioniert - man kann auch hinter einem FLi4L angerufen werden!
- 0.22b
- Umfangreicher Ausbau der advanced setups: alle firewall rules, masqueraded connections und portforwardings lassen sich nun per Mausklick löschen
- Pfadstruktur angepasst und cgiconfig_switch.cgi nach cgiconfig/switch.cgi verschoben.
- forwarding-modul 'netmeeting' angepasst
- 0.23b
- Als Shell wird fortan opt_bash verwendet, da selbst ae anfing, segfaults zu produzieren...
- Bug im advances firewall setup im Zusammenhang mit user-defined chains behoben
- Lesbarkeit der Ausgaben aus dem advanced firewall setup (etwa 'list') verbessert
- Accounting hinzugefügt
- 0.24b
- die _gesamte_ Steuerungs-Funktionalität von cgiconfig lässt sich nun auch mit easycron verwenden
- An SysLog wird nun nur noch plain text ausgegeben, die HTML-Flut entfällt
-
online hosts
- Host sind jetzt einzeln 'anpingbar'
- DHCP-Hosts werden angezeigt
-
firewall state
- Sperrung nun gezielter möglich: deny input, deny forward, grant access'
- DHCP-Hosts steuerbar
- "custom ip" hinzugefügt
- GUI etwas aufpoliert
-
adv. firewall state
- ein paar kleine fiese Bugs getötet
- Optik etwas aufpoliert
-
portforwarding state
- auch hier ein paar kleine fiese Bugs getötet
- DHCP-Hosts steuerbar
- "custom ip" hinzugefügt
- init und shut down portforwarding-Skripte gedebuggt ==> funktionieren jetzt auch direkt bei der 1. Einwahl nach einem Reboot
8. Roadmap
- Einarbeitung der Wishlist
- Automatisierung der Freischaltung/Sperrung der Clients über kombinierte Kontingent- und Zeitverwaltung (das dauert aber noch!)
9. Wishlist
- RC-Skript anpassen, damit bei mehreren Einträgen in MASQ_NETWORKS das account wenigstens für das erste Subnetz funktioniert
MfG,
Daniel H. Reichelt
fli4l@itamservices.de