#!/bin/bash # $Id: fw-config,v 1.20 2003/01/30 20:10:09 aleks Exp $ # # Name: /etc/firewall/fw_config # purpose: configfile for the packetfilter for homeuse # Author: Alexander Stielau # # HOOK FOR STARTUP in /etc/ppp/ip-up.d/ # SEE ALSO: http://www.buug.de/~aleks/iptables # /usr/local/bin/packetfilter # /usr/local/bin/restorefilter # # $Log: fw-config,v $ # Revision 1.20 2003/01/30 20:10:09 aleks # Colins Patches eingespielt # # Revision 1.19 2002/02/25 23:37:29 aleks # idiot-Mode entfernt - benutzt eh niemand. # # Revision 1.18 2002/02/21 18:23:00 aleks # - diese neue Versionsnummer kommt nur durch beklopptes CVS-Handling # meinerseits # # Revision 1.16 2002/02/17 21:31:57 aleks # - Variablen für STOP_HERE hinzugefügt # # Revision 1.15 2002/02/16 17:46:36 aleks # - Reject-Regel für übliche Windows-Protokolle und anderes, was man garantiert # nicht haben will, eingefügt (STOP_HERE). # - Eine sinnvolle Regelung für https gefunden. # - Dokumentation weiter ergänzt # # Revision 1.14 2002/02/10 17:43:17 aleks # Doku zum SSH-Tunnel durch ein Beispiel ergänzt, Doku zu APT-Feature # korrigiert. # # Revision 1.13 2002/02/09 22:31:47 aleks # Hinzufügung einer TCPMMS-Regel, um die MSS von TCP-SYN-Paketen auf einen # ungefährlichen Wert für krank konfigurierte Router bei DSL-Providern zu # setzen. # Scheinbar nicht notwendig, wenn man einen Proxy benutzt. Jedenfalls hatte ich # das Problem noch nie. Danke an Gunnar Hahn für den Tipp. # # Revision 1.12 2002/02/09 19:37:18 aleks # FTP/WWW-Freigabe für das Gateway selbst an die Variable APT gekoppelt. # (apt-get&Co direkt aus dem Netz) # # Revision 1.11 2002/01/29 23:27:46 aleks # Umstellung auf CVS-Log-IDs als Versionshistory. Mal sehen, wie das aussieht. # :-) # # # ===================================================================== # # CHECK, UNDERSTAND AND CHANGE THIS! # # CHANGE THIS TO YOUR LOCAL NET!!! # # Bei mir ist eth0 das Device ohne IP-Nummer, das von ppp0 genutzt wird # # eth0 => external for $EXT_IFACE # ppp0 => external $EXT_IFACE # eth1 => internal $LOC_IFACE; localnet $LOC_NET # lo => 127.0.0.1 loopback $LOOP_IFACE; $LOOP_IP # # Diese Regeln arbeiten nur mit zwei realen Interfaces, wer mehr als ein # internes Interface hat, ist damit weit 'beyond the scoope of this document'. # # Die Interfaces sind U N B E D I N G T an die eigenen Gegebenheiten # anzupassen, sonst gibt es keinen Schutz durch den Paketfilter! # Nur, weil keine Fehlermeldung kommt, heißt dies nicht, das alles # funktioniert! # # EXT_IFACE # ========= # Das externe Interface. Default ist ppp0, also Modem oder DSL. # Bei der Verwendung von ISDN bitte auf ippp0 ändern. # # Wer eine Festverbindung benutzt, muß das ganze Skript via # Runlevelskript starten, nicht über /etc/ppp/ip-up.d. # Wer eine feste IP hat, kennt sich damit aus - ein # Beispiel-Runlevel-Skript (für Debian) liegt im gleichen Verzeichnis # unter der o.a. URL. # # Und hier latürnich das entsprechende Device eintragen (ppp0 ersetzen). # Default ist "ppp0" export EXT_IFACE="ppp0" # # LOC_IFACE # ========= # Internes Device des Paketfilters/Routers zum lokalen Netz. # Wer das nicht weiß, hat keins und läßt alles so, wie es ist. # # Wer ein internes Device und ein lokales Netz hat, setzt LOC_NET_ENABLE auf # "yes" und trägt den Interface-Namem (also eth0, eth1) ein. # Zur Zeit geht dies nur mit einem internen Interface. # Wer mehr hat, kann diesen Regelsatz nur mit größeren Umbauten verwenden. # # Nochmal: Wer dabei einen Fehler macht, hat ziemlich schnell # die Brille auf! # Default ist "no" export LOC_NET_ENABLE="no" # # Default ist "eth1" export LOC_IFACE="eth1" # # Wer von außen Zugriff auf das Gateway haben möchte, setzt die folgende # Variable auf "yes". Damit ist dann ssh freigeschaltet. In diesem Fall sollte # ssh Protokollversion 2 und ein Keyverfahren zur Authentifizierung verwendet # werden und nicht nur ein Password. # Default ist "no" export SSH_FROM_OUTSIDE="no" # # Hier kann ein Rechner im internen Netz definiert werden, der via ssh von # außen direkt erreichbar sein soll. Dies wird per Portforwarding gelöst. # Damit auch noch der Gateway-Rechner per ssh erreichbar ist, wird ein # anderer Port verwendet. In der Voreinstellung ist dies Port 21, also FTP. # # Die passende Kommandozeile heißt dann von außen: # ssh -p 21 foo@externe_ip # # Also nicht wundern, wenn nmap oder ein anderer Portscanner sagt, das FTP # offen ist. Dies ist nicht der Fall. :-) # Wer dies nicht möchte, läßt alles unverändert. Wer das Feature nutzen will, # setzt SSH_TUNNEL_ALLOW auf yes und trägt die interne IP-Nummer des zu # zu erreichenden Rechners in SSH_TUNNEL_TO ein. # Default ist "no" export SSH_TUNNEL_ALLOW="no" # # Default ist "192.168.2.10" export SSH_TUNNEL_TO="192.168.2.10" # # Gateway als Workstation # ======================= # Wer das Gateway selbst auch als Arbeitsplatz nutzt, kann mit der # Variablen $GW_WORKSTAT allen ausgehenden Traffic erlauben. Wer das # Gateway nur als Firewallsystem nutzt, braucht dies nicht und setzt # die Variable auf "no". # Damit gelten explizite Regeln, was an ausgehendem Verkehr vom Gateway # selbst erlaubt ist. # Diese Einstellung betrifft nicht den Verkehr vom lokalen Netz, sondern # nur das Gateway selbst. # Default ist "yes" export GW_WORKSTAT="yes" # # Gateway ist ein Debiansystem # ============================ # Um mit apt-get und Konsorten direkt Pakete aus dem Netz ziehen zu können, # kann man hier dem Gateway FTP und WWW-Verbindungen nach draußen erlauben. # Eventuell ist dies auch für Online-Update-Tools anderer Distributionen # hilfreich. # Default ist "yes" export APT="yes" # # SQUID als transp. Proxy # ======================= # Wer Squid als transparenten Proxy für http einsetzen will # (http://www.linuxdoc.org/HOWTO/mini/TransparentProxy-4.html) # setzt die folgende Variable auf yes. # Achtung, dafür muß der Squid bereits entsprechend konfiguriert und # getestet sein, sonst funktioniert das Web nicht mehr. # Auf Grund der verwendeten PREROUTING-Regel (siehe # /usr/local/sbin/packetfilter) funktioniert das ganze nur für Rechner # aus dem lokalen Netz, nicht aber für den Gatewayrechner selbst. Wie das # auch noch geht, ist im obigen HOWTO (oder aber in der Squid-FAQ, ich habs # vergessen) beschrieben. # # Ebenso funktionieren die Regeln so nicht, wenn der Squid auf einer # anderen Maschine als dem Gateway liegt. (todo für später mal). # # ACHTUNG: Bei Galeon reicht dies nicht aus, da er die DNS-Auflösung # selbst machen will. Kaputtes Teil. Workaround gibts später mal. # # Für https funktioniert dieses Vorgehen nicht. # https wird nicht durch den Proxy geleitet, sondern einfach geforwardet. # Default ist "no" export USE_TRANSPROXY="no" # # IP-Versand # ========== # Versenden der IP-Adresse des externen Devices an eine beliebige # Email-Adresse, bei Verbindungsaufbau, um von extern auf das GW zu # kommen. Auf Dauer wohl besser mit dyndns zu erledigen... # # Um dieses Feature zu benutzen, MAIL_IP auf yes setzen. # Default ist "no" export MAIL_IP="no" # # Dieses Feature benutzt die folgende Mailadresse, an die die IP # geschickt werden soll. # Default ist "devnull@buug.de", ein Datenmülleimer. export MAIL_TO="devnull@buug.de" # # Dyndns # ====== # Alternativ zum Versand der IP per Email gibt es die Möglichkeit, dyndns.org # zu nutzen, um den Rechner von außen sicher unter immer dem gleichen Namen # erreichen zu können. # Dazu ist die Registrierung bei dyndns.org und die Installation bzw. passende # Konfiguration eines entsprechenden Clients notwendig - es stehen mehrere zur # Verfügung. # Ich verwende ddclient, passende Pakete liegen eigentlich allen # Distributionen bei. # Der Debian-Weg ist es, einfach in /etc/ppp/ip-up.d/ ein entsprechendes # Skript abzulegen, was nach dem Start des pppd automagisch ausgeführt wird. # Ähnliche Mechanismen bieten auch die anderen Distributionen. # # Stattdessen wäre es auch möglich, das entsprechende Skript aus dem # Firewallskript zu starten. # # Debuglevel # =========== # Es gibt zwei Debuglevel, um das Logging zu steuern und damit Probleme # leichter zu identifizieren. # Im Debuglevel "1" wird jede vorhandene Logging-Regel eingeschaltet. Dies ist # nur zur Fehlersuche sinnvoll und erzeugt sehr schnell sehr viele # Logeinträge, Vorsicht also bei kleinen Platten. # Im Debuglevel "0" werden 'nur' DENY-Regeln geloggt, und diese auch nur mit # den ersten drei Paketen. # Default ist "0" export DEBUG="0" # # Testbetrieb # =========== # Im Modus Testbetrieb werden andere Policies gesetzt als im Normalbetrieb. Um # an den Rechner auch bei abgeschaltetem Filter heranzukommen, werden dort die # Policies bei ausgeschaltetem Filter auf ACCEPT gesetzt. Im Normalbetrieb # werden die Policies dagegen auf DENY gesetzt, damit bei ausgeschalteter FW # kein Verkehr möglich ist. # Also zum Remotekonfigurieren IMMER auf TESTING setzen. # Das heißt auch, daß dann kein Verbindungsaufbau # aus dem lokalen Netz zur Firewall (und damit ein Dial-on-Demand) möglich # ist. # Für einen normalen DOD-Rechner mit einem vertrauenswürdigen LAN sollte # dieser Schalter immer in Defaultstellung stehen. # Default ist "1" export TESTING="1" # # Logging von Windowsprotokollen # ============================== # # Filterrestore # ============= # Damit kann man einen Fußschuss verhindern, wenn man remote an den # Regeln fuscht. Nach der eingestellten Zeit schaltet sich die FW # wieder ab. Wenn man lokal arbeitet, einfach ignorieren. # Das Filterrestore funktioniert nur, wenn man im Testbetrieb (s.o.) ist. export BACKSECONDS="0" # NEVER SET TO "" [none] # ########################################################### # Utilities # ========= export IPTABLES="`which iptables`" export IFCONFIG="`which ifconfig`" export INSMOD="`which insmod`" export AWK="`which awk`" export GREP="`which grep`" export SED="`which sed`" export ROUTE="`which route`" export CUT="`which cut`" export ECHO="`which echo`" #export LANG=C export LC_ALL=C # # Ist klar, oder? LANG=C, weil es Leute gibt, bei denen ifconfig # deutsch spricht, und dann funktioniert das im Skript folgende # IP-Nummern-Fleddern nicht mehr. # # Ports für später. Es werden in diesem Skript nicht alle benötigt. export SSH="22" export SMTP="25" export WWW="80" export WWWS="443" export FTP="21" export DNS="53" export SQUID="3128" export POP="110" export NTP="123" export SNMP="161" # Ports, die man garantiert nicht nach draußen lassen will (kann durch # Eintrag weiterer Portnummern erweitert werden, STOP_HERE gilt für # tcp und udp): export STOP_HERE="135 137 138 139 67 68 69 23 111 161 1433" export ALL_PORT="tcp udp" export SD_PORT="--dport --sport" # # Local Loopback Device. Hat jeder. Finger weg! export LOOP_IFACE="lo" export LOOP_IP="127.0.0.1" # # Definition für alle IP. export ANY="0.0.0.0/0" # # Fertig! Alles noch mal durchsehen. Dann speichern.