IT-Security Teil 10: Echte Firewalls mit NAT 31.03.15 1
Übersicht Tipps und Tricks Architekturen Routing Packet-Filter NAT 2
Vollständiges Öffnen der Firewall iptables --policy INPUT ACCEPT iptables --policy OUTPUT ACCEPT iptables --policy FORWARD ACCEPT iptables -t nat --policy PREROUTING ACCEPT iptables -t nat --policy OUTPUT ACCEPT iptables -t nat --policy POSTROUTING ACCEPT iptables -t mangle --policy PREROUTING ACCEPT iptables -t mangle --policy OUTPUT ACCEPT iptables --flush iptables -t nat --flush iptables -t mangle --flush iptables --delete-chain iptables -t nat --delete-chain iptables -t mangle --delete-chain 3
Schnelles Schließen der Firewall (Panic-Knopf) I iptables --flush iptables -t nat --flush iptables -t mangle --flush iptables -A INPUT -i $LOOP_INT -j ACCEPT iptables -A OUTPUT -o $LOOP_INT -j ACCEPT iptables --policy INPUT DROP iptables --policy OUTPUT DROP iptables --policy FORWARD DROP iptables -t nat --policy PREROUTING DROP iptables -t nat --policy OUTPUT DROP iptables -t nat --policy POSTROUTING DROP iptables -t mangle --policy PREROUTING DROP iptables -t mangle --policy OUTPUT DROP iptables --delete-chain iptables -t nat --delete-chain iptables -t mangle --delete-chain 4
Schnelles Schließen der Firewall (Panic-Knopf) II Das Löschen der Chains führt nicht zum Aufheben der Policy, so dass ohne Policy-Änderung nur dann gesperrt wird, wenn vorher die Policy DROP definiert war. Wenn vorher die Policy ACCEPT war, muss die Reihenfolge der iptables geändert werden - jedenfalls wenn es um Millisekunden geht. Bei manueller Eingabe ist das aber eh egal... 5
Mehrere Server mit festen Adressen Häufig gibt es mehrere DNS-Server Für diese wird eine Liste in einer for-schleife durchlaufen: DNSLIST="196.3.10.200 26.0.0.100" for DNS in $DNSLIST do iptables... -d $DNS...... done 6
Bemerkungen I Bitte beachten, dass mindestens der erste DNS-Server per IP- Adresse definiert werden muss, da jede Auflösung von DNS- Namen einen DNS-Server benötigt. Das DNS-Auflösen mit /etc/hosts-einträgen ist nur für die lokalen DNS/Adressen sinnvoll, da diese per iptables nicht beschränkt zu werden brauchen. Nachdem iptables den ersten DNS-Server zugreifbar gemacht hat, können mit dem nächsten iptables-aufruf symbolische Namen benutzt werden, sofern der erste DNS-Server an erster Stelle in /etc/resolv.conf steht. Wenn ein lokale DNS-Cache-Server benutzt wird, wird dieser per 127.0.0.1 angesprochen und muss analog zu oben mit der ersten DNS-Server-Adresse arbeiten. 7
Bemerkungen II Das bedeutet aber auch, dass während der Abarbeitung des Skripts Netzverkehr abläuft! Diese "Parallelität" beachten! Bei anderen Diensten die Boot-Reihenfolge bzw. der Ablauf beim Aufbau von ISDN/DSL-Zugängen beachten! 8
eth1 eth0 eth1 eth1 Architekturen für echte Firewalls I (A) (C) ist eine typische Architektur mit einer Bastion (D) Hat eine Mini-DMZ, die aus einem Crossover-Kabel besteht PF = Packet Filter (B) 9
Architekturen für echte Firewalls II Um die Beispiele konkreter zu machen, werden bestimmte Konstellationen angenommen: Auf der Firewall laufen keine Server. Dies kann etwas aufgeweicht werden, wenn z.b. auf der Firewall ein Cache-DNS-Server läuft, ein NTP-Server läuft. Sie wird als statefull Packet-Filter konzipiert. Es gibt keine Web-, DHCP- und keinen FTP-Server im LAN, die Dienste nach außen erbringen. In der Konstellation (A) erhält die Firewall ihre IP-Adresse von Außen per DHCP (über PPPoE vom Provider, z.b.). In der Konstellation (B) hat die Firewall eine fest definierte IP- Adresse, denn für das Innennetz ist sie der Router. 10
Forward-Chain I - Wiederholung Packet-Filter Bereich Außen "outer space" eth0 Forward Forward eth1 Bereich Innen "inner space" Prozesse Kernel eth0 Forward-Chain eth1 11
Forward-Chain II - Wiederholung Wenn ein Packet innerhalb des Hosts geroutet wird, durchläuft es die Forward-Chain, verbleibt es im System die Input-Chain. 12
Bemerkung Routing hat zwei Bedeutungen Wegewahl für Transport zwischen verschiedenen Schnittstellen innerhalb des Systems Wegewahl für Transport zwischen Systemen innerhalb eines Netzes Für das Routing des 1. Falls gibt es folgende Möglichkeiten: Kernel anhand seiner Routing-Tabelle Benutzung von Proxies FORWARD-Regeln mit Setzen der Kernelvariablen ip_forward Für das Routing des 2. Falls gibt es üblicherweise die Möglichkeit der Benutzung der Routing-Tabelle(n) der betroffenen Router. 13
Routing I Im folgenden wird das Vorgehen bei einem Router mit optionalem NAT, der keine FORWARD-Regeln und auch keine Proxies benutzt, besprochen. M.a.W. das Folgende gilt nur für echte Router... 14
Routing II 15
Routing III - Tabelle für Router A Ziel Netzmaske Router Gateway Schnittstelle 10.0.3.0 255.255.255.0 - eth1 10.0.4.0 255.255.255.0 - eth0 10.0.5.0 255.255.255.0 10.0.4.3 eth0 10.0.2.0 255.255.255.0 - ppp0 0.0.0.0 0.0.0.0 10.0.2.1 ppp0 Der letzte Eintrag betrifft die Default-Route. 16
Routing IV Ablauf Ist es für den Router selbst bestimmt: INPUT-Chain Verlässt das Paket den Router: Ist der Router-Eintrag leer, wird mit ARP die MAC-Adresse im angrenzenden LAN gesucht und das Paket gesendet. Ist ein Router angegeben, wird die MAC-Adresse vom angegebenen Router zum Senden benutzt In beiden Fällen bleibt die Destination-Adresse unberührt. Bei Konflikten wird immer der Eintrag mit der spezielleren Adressangabe benutzt. 17
Packet-Filter I Im folgenden wird ein statefull Packetfilter mit Routing-Funktionen besprochen, d.h. keine Benutzung von Proxies. Die Nicht-Beachtung der Routing-Tabelle setzt voraus, dass die Weitergabe der Pakete nach Außen/Internet "automatisch" realisiert wird, z. B. über PPPoE bei DSL, also bei Konstellation (A). Ansonsten muss eine Default-Route eingetragen werden (Konstellation (B): route add default gw IPAdresse-des-nächsten-Routers 18
Packet-Filter II Es ist (fast) dasselbe Skript wie bei der Personal-Firewall, nur dass aus den beiden INPUT/OUTPUT-Regeln eine FORWARD-Regel mit zwei Angaben der Schnittstellen -i und -o werden. Allerdings müssen ein paar Beschränkungen bzgl. der Absenderadresse aufgehoben bzw. beachtet werden. Weiterhin müssen andere Kernelmodule geladen und andere Kernelparameter gesetzt werden: Kernelvariable ip_forward Erläuterung Einschalten des Routings mit FORWARD-Regeln Kernelmodul ip_conntrack_ftp ip_nat_ftp Erläuterung Passives FTP (und auch NAT) Aktives FTP und NAT Laden eines Kernelmoduls mit z.b. "modprobe ip_conntrack_ftp". 19
Einfaches Beispiel - DNS I iptables -A FORWARD -i $INNER -o $OUTER -p udp -s $INNERADDR --sport $OPEN_PORT -d $NAMESERVER --dport 53 -j ACCEPT iptables -A FORWARD -i $OUTER -o $INNER -p udp -s $NAMESERVER --sport 53 -d $INNERADDR --dport $OPEN_PORT -j ACCEPT Mit Makros $SEND und $RECEIVE: $SEND -p udp -s $INNERADDR --sport $OPEN_PORT -d $NAMESERVER --dport 53 -j ACCEPT $RECEIVE -p udp -s $NAMESERVER --sport 53 -d $INNERADDR --dport $OPEN_PORT -j ACCEPT 20
Makros Name Bedeutung SEND iptables -A FORWARD -i $INNER -o $OUTER RECEIVE iptables -A FORWARD -i $OUTER -o $INNER INNER Schnittstelle nach Innen: eth1 INNERNET 172.22.0.0 INNERNET_BROADCAST 172.22.255.255 INNERADDR 172.22.0.0/16 bzw. /12 OPEN_PORT "1024:65535" PRIVAT_PORT "0:1023" Die Makros INNER* beschreiben den Adressraum des inneren Netzes. 21
Einfaches Beispiel - DNS II zustandslose Version $SEND -p udp --sport $OPEN_PORT -d $NAMESERVER --dport 53 -j ACCEPT $RECEIVE -p udp -s $NAMESERVER --sport 53 --dport $OPEN_PORT -j ACCEPT Das ist eventuell zu offen, daher: $SEND -p udp -s $INNERADR --sport $OPEN_PORT -d $NAMESERVER --dport 53 -j ACCEPT $RECEIVE -p udp -s $NAMESERVER --sport 53 -d $INNERADDR --dport $OPEN_PORT -j ACCEPT Wer allen DNS-Servern vertraut, lässt -d $NAMESERVER weg. 22
Das Packet-Filter Script I Im folgenden wird in Auszügen ein Packet-Filter-Script beschrieben, das vollkommen analog wie die Personal-Firewall aufgebaut ist. Die globalen Durchlassregeln für aufgebaute Verbindungen heißen nun: iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT $SEND -m state --state ESTABLISHED,RELATED -j ACCEPT $RECEIVE -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -m state --state INVALID -j DROP iptables -A OUTPUT -m state --state INVALID -j DROP $SEND -m state --state INVALID -j DROP $RECEIVE -m state --state INVALID -j DROP 23
Das Packet-Filter Script II iptables --policy INPUT DROP iptables --policy OUTPUT DROP iptables --policy FORWARD DROP iptables -t nat --policy PREROUTING ACCEPT iptables -t nat --policy OUTPUT ACCEPT iptables -t nat --policy POSTROUTING ACCEPT iptables -t mangle --policy PREROUTING ACCEPT iptables -t mangle --policy OUTPUT ACCEPT Für NAT-Tabellen ist ACCEPT die Policy! Die Mangle- Tabelle wird nicht benutzt Wie gehabt aber nun sind die Gründe anders. Bei der NAT-Tabelle wird mit Absicht eine andere Policy verwendet, während die Mangle-Tabelle nicht benutzt wird. 24
Ergänzung der Ketten (Chains) 25
Das Packet-Filter Script III Das Vorfiltern von Schrott und Scanns wird nun über die PREROUTING- Kette realisiert: $PREFILTER -p tcp --tcp-flags ALL NONE -j DROP $PREFILTER -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP $PREFILTER -p tcp --tcp-flags SYN,RST SYN,RST -j DROP $PREFILTER -p tcp --tcp-flags FIN,RST FIN,RST -j DROP $PREFILTER -p tcp --tcp-flags ACK,FIN FIN -j DROP $PREFILTER -p tcp --tcp-flags ACK,PSH PSH -j DROP $PREFILTER -p tcp --tcp-flags ACK,URG URG -j DROP Bei diesen Regeln gibt es keine Einschränkungen auf die Schnittstelle, so dass diese Regeln für alle gelten, d.h. an allen Schnittstellen gehen keine Scanns... Das Makro PREFILTER hat folgende Definition: PREFILTER="iptables -t nat -A PREROUTING" 26
Das Packet-Filter Script IV $PREFILTER -i $OUTER -s $CLASS_A -j DROP $PREFILTER -i $OUTER -s $CLASS_B -j DROP $PREFILTER -i $OUTER -s $CLASS_C -j DROP Das muss entsprechend den benutzten Netzen angepasst werden. $PREFILTER -i $OUTER -s $LOOPBACK -j DROP # Drop reserved addresses from outside $PREFILTER -i $OUTER -s $CLASS_E -j DROP $PREFILTER -i $OUTER -s 0.0.0.0/8 -j DROP $PREFILTER -i $OUTER -s 169.254.0.0/16 -j DROP $PREFILTER -i $OUTER -s 192.0.2.0/24 -j DROP Der rot gekennzeichnete Block fängt noch weitere unsinnige Pakete ab (als bei der Personal Firewall). 27
DNS I zustandsbehaftete Version $SEND -p udp -s $INNERADR --sport $OPEN_PORT -d $NAMESERVER --dport 53 -m state --state NEW -j ACCEPT $SEND -p udp -s $INNERADR --sport $OPEN_PORT -d $NAMESERVER --dport 53 -j ACCEPT $RECEIVE -p udp -s $NAMESERVER --sport 53 -d $INNERADR --dport $OPEN_PORT -j ACCEPT Dies ist hier der Code aus dem obigen Beispiel. Der untere eingerahmte Bereich realisiert das Fall Back in den stateless mode, der vielleicht nicht erwünscht ist... 28
DNS II zustandsbehaftete Version # Das Ganze noch einmal für TCP $SEND -p tcp -s $INNERADR --sport $OPEN_PORT -d $NAMESERVER --dport 53 -m state --state NEW -j ACCEPT $SEND -p tcp -s $INNERADR --sport $OPEN_PORT -d $NAMESERVER --dport 53 -j ACCEPT $RECEIVE -p tcp -s $NAMESERVER --sport 53 -d $INNERADR --dport $OPEN_PORT -j ACCEPT Der eingerahmte Bereich realisiert das Fall Back in den stateless mode, der vielleicht nicht erwünscht ist... 29
DNS III Jetzt besteht noch das Problem, dass die Firewall selbst DNS benutzen möchte: Das wird dadurch gelöst, dass INPUT/OUTPUT-Regeln wie bei der Personal-Firewall benutzt werden, denn alle auf der Firewall laufenden Programme benutzen die INPUT/OUTPUT-Ketten. Weiterhin sollte nur der DNS-Server im eigenen lokalen Netz den Zugriff nach außen haben; bei den bisher angegebenen Regeln können alle Maschinen des LAN DNS-Requests senden. Dies wird dadurch erreicht, dass der DNS-Zugriff nur von einem Gerät mit einer festen IP-Adresse (nämlich die vom lokalen DNS- Server) erlaubt ist. Dazu wird ein weiteres Makro eingeführt, das diese IP-Adresse beinhaltet: $INNERDNS 30
DNS III $SEND -p udp -s $INNERDNS --sport $OPEN_PORT -d $NAMESERVER --dport 53 -m state --state NEW -j ACCEPT $SEND -p udp -s $INNERDNS --sport $OPEN_PORT -d $NAMESERVER --dport 53 -j ACCEPT $RECEIVE -p udp -s $NAMESERVER --sport 53 -d $INNERDNS --dport $OPEN_PORT -j ACCEPT Und dann noch einmal für TCP... So, jetzt fehlt nur noch die Schleife für das Generieren von Regeln für mehrere DNS-Server (siehe oben). 31
Vorgehen und Umgehen mit ICMP Nach diesem Schema wird Dienst für Dienst definiert entsprechend den Tabellen. Das Skript hat denselben Aufbau wie bei der Personal Firewall. Das Umgehen mit ICMP verläuft analog, z. B. #--Fragmentierte Pakete auf allen Schnittstellen iptables -A INPUT --fragment -p icmp -j LOG --log-prefix "Fragmented ICMP: " iptables -A INPUT --fragment -p icmp -j DROP iptables -A FORWARD --fragment -p icmp -j LOG --log-prefix "Forward Fragmented ICMP: " iptables -A FORWARD --fragment -p icmp -j DROP 32
NAT - Network Address Translation I Unidirektionales NAT Address -> Address (einfaches NAT) Address/Port -> Address/Port (NAPT) Masquerading (1 Öffentliche Adresse : N lokale Adressen) Bidirektionales NAT Öffentliche Adresse ist "Alias" für interne Adresse Doppeltes NAT Wenn äußerer und innerer Adressbereich sich überlappen Namen für iptables Übersetzung der Absender-Adresse SNAT Übersetzung der Ziel-Adresse DNAT 33
NAT - Network Address Translation II Es wird die NAT-Tabelle benutzt, die vollkommen getrennt von der Filter-Tabelle ist. Übersetzung der IP-Adressen erfolgt: Vor dem Routing: PREROUTING-Chain Nach dem Routing: POSTROUTING-Chain NAT für die Absenderadresse: POSTROUTING-Chain für geroutete Pakete OUTPUT-Chain für lokal erzeugte Pakete NAT für die Zieladresse: PREROUTING-Chain vor dem Routing Die OUTPUT-Chain der Filter- und der NAT-Tabelle sind unterschiedlich, obwohl sie denselben Namen haben. 34
Die Ketten (Chains) PREROUTING NAT für Ziel-Adresse Routing Forwardchain POSTROUTING NAT für Absender-Adresse Drop Outputchain Inputchain Prozesse Prozesse Prozesse Drop Drop 35
Wo wann welche Adresse? Zieladressen-NAT Regeln der PREROUTING-Chain benutzen die ursprünglichen Zieladressen (vor dem Routing) Regeln der INPUT/FORWARD-Chain benutzen die durch PREROUTING veränderten Zieldressen. Das gilt auch für die POSTROUTING-Chain. Absenderadressen-NAT Regeln der POSTROUTING-Chain benutzen die ursprünglichen Absenderadressen. Das Umsetzen der Absenderadresse erfolgt unmittelbar vor dem Verlassen des Systems. Das gilt auch für alle anderen Chains. 36
Masquerading (SNAT-Variante) iptables -t nat -A POSTROUTING -o $OUTER... -j MASQUERADE Als externe Adresse wird immer die aktuell gültige Adresse von $OUTER verwendet (über DHCP gesetzt). Weitere Bedingungen... schränken die Anwendbarkeit für NAT ein. Automatisch erfolgt die Adressumsetzung in der Gegenrichtung. Der Tabelleneintrag für NAT wird erst durch das erste Paket erzeugt. 37
Beispiel (Internetanbindung über PPP) iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE iptables -A FORWARD -i eth0 -o ppp0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -i ppp0 -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT Das NAT wird natürlich nur in der Variante (A) benutzt. Eine Firewall zwischen zwei LANs benötigt dies nicht. 38
Proxy-Firewall Es werden Proxies installiert, die zwischen eth0 und eth1 die Daten kopieren und dabei protokollspezifisch Tests bzw. Modifikationen durchführen. Als Proxies kommen infrage: TIS Firewall Tool Kit (Proxies decken alles ab) Spezielle Proxies, z. B. squid Die Regeln der Personal Firewall werden auf die beiden Schnittstellen entsprechend den Diensten ausgerichtet. Die Proxies führen selbst NAT durch. Das Firewall-Skript beschränkt sich daher auf ICMP-Behandlung Kernel-Initialisierung Logging Portumleitung 39
Portumleitung Für den Fall, dass ein Proxy auf einem bestimmten Port auf der Firewall arbeitet, können durchlaufende Pakete an einen anderen Port ohne Änderung umgelenkt werden. Dann laufen die Pakete nicht durch die FORWARD-, sondern als lokal empfangene Pakte durch die INPUT-Chain. Beispiel für http-proxy SQUID: iptables -t nat -A PREROUTING -p tcp -i $INNER --dport http -j REDIRECT --to-port 3128 Das führt zu einem transparenten Proxy, d.h. die Clients arbeiten intern mit Port 80. 40
Was noch getan werden könnte... Weiterleiten von System-Log-Einträgen an benachbarte Maschinen, z.b. UDP auf Port 514. Hierzu müssten entsprechende OUTPUT-Regeln dies erlauben. Falls erwünscht kann ein in der Firewall laufender Cache-DNS- Server benutzt werden: dnsmasq Dieser kann auch DHCP, so dass DNS und DHCP von der Firewall abgedeckt werden. Dann müssen die DNS-Pakete von Innen nach Außen gesperrt werden, jedoch von der Firewall nach Außen erlaubt sein. Per DHCP wird dann die Firewall als Router und DNS-Server bekannt gemacht. 41
Nun wieder etwas entspannen... 42