Firewall
Contents
- Allgemeines
- TODO
- shorewall-init
-
Shorewall (IPv4)
- /etc/default/shorewall
- /etc/shorewall/shorewall.conf - Allgemeine Optionen
- /etc/shorewall/params - Variablen
- /etc/shorewall/zones - Liste der Netzwerk-Zonen
- /etc/shorewall/interfaces - Liste der Netzwerkschnittstellen
- /etc/shorewall/policy - Standardpolicy für den Datenverkehr zwischen den Zonen
- /etc/shorewall/rules - Regeln, die von der Policy abweichen
- /etc/shorewall/conntrack - Tracking von Verbindungen
-
Shorewall6 (IPv6)
- /etc/default/shorewall6
- /etc/shorewall6/shorewall6.conf - Allgemeine Optionen
- /etc/shorewall6/params - Variablen
- /etc/shorewall6/zones - Liste der Netzwerk-Zonen
- /etc/shorewall6/interfaces - Liste der Netzwerkschnittstellen
- /etc/shorewall6/policy - Standardpolicy für den Datenverkehr zwischen den Zonen
- /etc/shorewall6/rules - Regeln, die von der Policy abweichen
- /etc/shorewall6/conntrack - Tracking von Verbindungen
- Logging
1. Allgemeines
Shorewall bzw. Shorewall6 ist ein super Frontend für iptables bzw. ip6tables. Damit kann man sich sehr einfach mit ein paar Textdateien eine Firewall für die komplexesten Szenarien konfigurieren.
Beschreibungen und eine sehr gute Dokumentation findet man auf der Webseite, in den Manpages für die einzelnen Konfigurationsdateien und im Paket shorewall-doc.
Installiert werden die Pakete shorewall-init, shorewall und shorewall6.
Shorewall trennt die Firewalls nach IPv4 und IPv6, so dass man faktisch zwei verschiedene Firewalls wartet. Die Konfigurationen können dann auch entsprechend voneinander abweichen, bis auf ein paar Überschneidungen wie z. B. Traffic Shaping. Daher werden wir hier auch die Firewalls getrennt nach IPv4 und IPv6 dokumentieren. Dennoch werden wir versuchen, die Konfigurationen für IPv4 und IPv6 so ähnlich wie möglich zu halten.
Die Konfigurationsdateien wurden aus /usr/share/doc/shorewall{,6}/examples/one-interface kopiert und angepasst. Sämtliche Anpassungen sind unten dokumentiert.
Sobald Daemonen installiert werden, die Dienste im Internet anbieten, muss die Firewall entsprechend angepasst werden. Vergesst nicht, sowohl Shorewall als auch Shorewall6 anzupassen, oder mir Bescheid zu geben, damit ich die Firewall anpassen kann.
2. TODO
- ...
3. shorewall-init
Zwei Probleme:
Während des Bootvorgangs gibt es zwischen der Aktivierung der Netzwerkschnittstellen und der Initialisierung der Firewall ein kritisches Zeitfenster, in dem unerwünschte Verbindungen möglich sind. Mit shorewall-init lösen wir das, indem wir die Firewall "sehr früh" im Bootvorgang schließen - noch vor deren eigentlicher Initialisierung.
Ähnliche Situationen entstehen, wenn im laufenden Betrieb Netzwerkschnittstellen etwa per ifup bzw. ifdown aktiviert oder deaktiviert werden. Dazu stellt shorewall-init entsprechende Skripte in den Verzeichnissen /etc/network/* bereit.
Die nötigen Einstellungen für shorewall-init legen wir in /etc/default/shorewall-init fest.
3.1. /etc/default/shorewall-init (IPv4 und IPv6)
Setze PRODUCTS="shorewall shorewall6", damit beide Firewalls geschlossen werden.
Setze IFUPDOWN=1, damit Shorewall bzw. Shorewall6 auf ipup bzw. ifdown reagiert.
4. Shorewall (IPv4)
Die Konfiguration für die IPv4-Variante von Shorewall ist in der Datei /etc/default/shorewall und im Verzeichnis /etc/shorewall gespeichert.
4.1. /etc/default/shorewall
Setze startup=1, damit Shorewall gestartet wird. Standardmäßig wird ein evtl. noch nicht konfiguriertes Shorewall beim Booten nämlich nicht gestartet.
Setze SAFESTOP=1, damit die Firewall beim Herunterfahren in einen sicheren Zustand geht, d. h. geschlossen wird.
4.2. /etc/shorewall/shorewall.conf - Allgemeine Optionen
Außer den hier aufgelisteten Optionen bitte alles unverändert lassen!
NULL_ROUTE_RFC1918=Yes: Spoofing durch private Netzwerkadressen verhindern.
OPTIMIZE_ACCOUNTING=Yes: Auch die Accounting-Regeln werden optimiert.
ROUTE_FILTER=Yes: Routenfilter (Anti-Spoofing!) global aktivieren.
STARTUP_ENABLED=Yes: Shorewall ist konfiguriert und kann gestartet werden.
TC_ENABLED=No: Traffic Shaping wird deaktiviert, da das Netz schnell genug ist.
Einige Optionen betreffen die Protokollierung von bestimmten Paketen. Details dazu siehe im Abschnitt Logging.
LOGFILE=/var/log/ulog/syslogemu.log: Diese Variable dient nur für die Kommandozeilenwerkzeuge.
LOG_BACKEND=netlink: Wir verwenden ulogd2 für das Logging.
MACLIST_LOG_LEVEL="$LOG"
RPFILTER_LOG_LEVEL="$LOG"
SFILTER_LOG_LEVEL="$LOG"
SMURF_LOG_LEVEL="$LOG"
TCP_FLAGS_LOG_LEVEL="$LOG"
4.3. /etc/shorewall/params - Variablen
Setze LOG="NFLOG"; für Details siehe Logging.
4.4. /etc/shorewall/zones - Liste der Netzwerk-Zonen
fw: die Firewall selbst
net: alles andere
Weitere Zonen brauchen wir nicht, da der Rechner kein Router ist.
4.5. /etc/shorewall/interfaces - Liste der Netzwerkschnittstellen
eth0 ist die einzige Schnittstelle.
Option dhcp weggenommen, da wir ja statische IPs haben.
4.6. /etc/shorewall/policy - Standardpolicy für den Datenverkehr zwischen den Zonen
- Standardmäßig lassen wir ausgehenden Verkehr grundsätzlich zu. (Das könnte man noch strikter handhaben.)
- Eingehender Verkehr wird geDROPt.
- Sonstiger Verkehr wird REJECTed.
Ausnahmen davon befinden sich in /etc/shorewall/rules.
Das Log Level wird von info auf $LOG geändert; für Details siehe Logging.
4.7. /etc/shorewall/rules - Regeln, die von der Policy abweichen
Von Zone net nach Zone fw:
- Ping und Traceroute zulassen
- SSH (22) zulassen
- HTTP (80) und HTTPS (443) zulassen
- IMAP (143) und IMAPS (993) zulassen
- SMTP (25, 465, 587) zulassen
Von Zone fw nach Zone net:
- Ping und Traceroute zulassen
Bemerkungen:
Es wird nicht der gesamte ICMP-Verkehr von Zone fw nach Zone net zugelassen.
4.8. /etc/shorewall/conntrack - Tracking von Verbindungen
- Keine Modifikationen.
5. Shorewall6 (IPv6)
Die Konfiguration für die IPv6-Variante von Shorewall, Shorewall6, ist in der Datei /etc/default/shorewall6 und im Verzeichnis /etc/shorewall6 gespeichert.
5.1. /etc/default/shorewall6
- Identisch zu Shorewall/IPv4
Setze startup=1, damit Shorewall6 gestartet wird. (Standardmäßig wird ein evtl. noch nicht konfiguriertes Shorewall6 beim Booten nämlich nicht gestartet.)
Setze SAFESTOP=1, damit die Firewall beim Herunterfahren in einen sicheren Zustand geht, d. h. geschlossen wird.
5.2. /etc/shorewall6/shorewall6.conf - Allgemeine Optionen
- Analog zu Shorewall/IPv4
- Optionen mit Bezug zu IPv4 gibt es hier nicht:
NULL_ROUTE_RFC1918
ROUTE_FILTER
5.3. /etc/shorewall6/params - Variablen
- Identisch zu Shorewall/IPv4
5.4. /etc/shorewall6/zones - Liste der Netzwerk-Zonen
- Identisch zu Shorewall/IPv4
5.5. /etc/shorewall6/interfaces - Liste der Netzwerkschnittstellen
- Analog zu Shorewall/IPv4
eth0 ist die einzige Schnittstelle.
Verwende nur die Option tcpflags, da der Rest für IPv6 nicht relevant ist.
5.6. /etc/shorewall6/policy - Standardpolicy für den Datenverkehr zwischen den Zonen
- Analog zu Shorewall/IPv4
Die Regel "von Zone net nach Zone fw" wird von der Regel "von Zone net nach Zone all" überboten und deswegen auskommentiert.
5.7. /etc/shorewall6/rules - Regeln, die von der Policy abweichen
Von Zone net nach Zone fw:
- Identisch zu Shorewall/IPv4
Von Zone fw nach Zone net:
- Identisch zu Shorewall/IPv4
Bemerkungen:
Es wird nicht der gesamte ICMPv6-Verkehr von Zone fw nach Zone net zugelassen. Alles, was man gemäß RFC 4890 von Zone fw nach Zone net benötigt (für Neighbour Discovery usw.) wird durch ein Makro zugelassen.
5.8. /etc/shorewall6/conntrack - Tracking von Verbindungen
- Keine Modifikationen.
6. Logging
Shorewall bzw. Shorewall6 protokollieren normalerweise über syslog, was dann aber dazu führt, dass /var/log/messages und dmesg mit Meldungen ziemlich geflutet werden. Außerdem werden diese Meldungen, die in der Regel die syslog facility kern und dem Level info besitzen, mit allen anderen der gleichen facility.level-Kombination zusammen geworfen.
Um diese recht zahlreichen Meldungen gesondert zu behandeln (Datenmenge!), gehen wir den folgenden Weg:
Der Linux Kernel unterstützt allerdings speziell für Netfilter, das eigentliche Back-End der Firewall im Kernel, die speziellen Logging Back-Ends ULOG und NFLOG. ULOG kann leider nur IPv4, NFLOG kann IPv4 und IPv6. ULOG ist inzwischen veraltet, das Logging Back-End der Wahl ist NFLOG. Das bedeutet, dass Netfilter die Meldungen - an syslog und journald (systemd) vorbei! - per NFLOG direkt abliefern kann.
Angenommen werden diese durch den ulogd2-Daemon aus dem gleichnamigen Debian-Paket, der sie in /var/log/ulog/syslogemu.log schreibt. Darüber hinaus bietet ulogd2 auch noch andere Ziele für die Netfilter-Meldungen an, etwa Datenbanken.
Um Shorewall bzw. Shorewall6 auf NFLOG umzustellen, muss man in allen Konfigurationsdateien das Log Level info durch NFLOG ersetzen. Weitere Details sind auf der Webseite von Shorewall beschrieben. Um den Aufwand zu beschränken und damit wir flexibel bleiben, definieren wir in den Dateien /etc/shorewall{,6}/params einfach eine Variable
#LOG="info" LOG="NFLOG"
und verweisen in den anderen Konfigurationsdateien dann auf $LOG. Das betrifft die Dateien shorewall{,6}.conf und policy.
Die Dateien in /var/log/ulog werden ganz regulär durch logrotate rotiert und weggepackt.