#!/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 <aleks@buug.de>
#
# 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.
