iptables - Die Firewall des Kernels 2.4
Stateful Firewalling - erweiterte Filterregeln
Wie wir gerade gesehen haben, reicht eine Prüfung auf Paket-Ebene nicht aus, um ausreichenden Schutz zu bieten. Besseren Schutz bietet ein Mechanismus, der den Zustand aller Verbindungen, die durch die Firewall aktiv bestehen, mitverfolgt und dementsprechend reagiert. Diese Funktion führt das Modul "ipt_state" aus, welches mit -m state aktiviert wird und über die Datei /proc/net/ip_conntrack mit der Außenwelt kommuniziert. Ein gelegentlicher Blick in diese Datei verrät einiges über das, was dieses Modul tut...
Aufrufkonventionen:
| -m state | Aktivieren des Moduls "ip_state". | |
| [!] --state <status> | Prüfen, ob Paket in einem gewählten Verbindungszustand ist. | |
| mögliche Zustände: | ||
| INVALID | Ungültiger Zustand, dieses Paket eröffnet weder eine neue Verbindung, noch gehört es zu einer bestehenden. | |
| NEW | Dieses Paket eröffnet eine neue Verbindung. | |
| ESTABLISHED | Dieses Paket gehört zu einer bereits bestehenden Verbindung | |
| RELATED | Dieses Paket hat etwas mit einer bestehenden Verbindung zu tun. | |
Beispiel:
# zu routende Pakete nur durchlassen, wenn von innen oder zu einer # bestehenden Verbindung gehörig # iptables -A FORWARD -s 192.168.1.0/24 -j ACCEPT iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT # Lokale Prozesse genauso schützen # iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Das Faszinierende am Mechanismus des "Connection Tracking" ist, daß selbst eigentlich zustandslose Verbindungen wie UDP oder ICMP mitverfolgt werden können.
wolfgang@scarlett:~ > <strong>ping 192.168.1.5</strong> PING 192.168.1.5 (192.168.1.5): 56 data bytes --- 192.168.1.5 ping statistics --- 9 packets transmitted, 0 packets received, 100% packet loss wolfgang@scarlett:~ > <strong>nslookup asdf</strong> ^C wolfgang@scarlett:~ > <strong>ssh kruemel</strong> ... wolfgang@scarlett:~ > <strong>cat /proc/net/ip_conntrack</strong> icmp 1 7 src=192.168.1.2 dst=192.168.1.5 type=8 code=0 id=65029 [UNREPLIED] src=192.168.1.5 dst=192.168.1.2 type=0 code=0 id=65029 use=1 tcp 6 431996 ESTABLISHED src=192.168.1.2 dst=192.168.1.3 sport=32770 dport=22 src=192.168.1.3 dst=192.168.1.2 sport=22 dport=32770 [ASSURED] use=1 udp 17 16 src=192.168.0.1 dst=62.104.219.88 sport=32771 dport=53 [UNREPLIED] src=62.104.219.88 dst=192.168.0.1 sport=53 dport=32771 use=1 wolfgang@scarlett:~ >
Spezielle Tricks
Eine Firewall nur zum Schutz anderer Systeme heranzuziehen, ist eine Möglichkeit. Doch die Netfilter-Architektur bietet noch einige andere Möglichkeiten:
Port-Forwarding und Maskierung
Hinter diesen Schlagworten verstecken sich eigentlich ganz einfach zu verstehende Mechanismen. Pakete werden so geändert, daß sie
- an andere Maschinen gerichtet sind (Destination NAT). Hierbei wird einfach nur eine andere Ziel-IP-Nummer in das Paket eingetragen. Dies muß in der PREROUTING Chain der Tabelle "nat" erfolgen.
- von einer anderen Maschine zu kommen scheinen (Source NAT). Hierbei wird die Quell-IP-Adresse des Paketes ausgetauscht. Dieser Schritt kann nur in der POSTROUTING Chain der "nat" Tabelle durchgeführt werden.
- an einen anderen Port gerichtet werden.
- von einem anderen Port zu kommen scheinen.
Typische Anwendungen dieser Methoden sind das Verstecken von Rechnern hinter der Firewall, das Verschleiern von IP-Adressen oder das gemeinsame Nutzen einer (z.B. vom Provider) vorgegebenen IP-Adresse durch mehrere Nutzer. Alle nachfolgend aufgelisteten Targets werden nur für das erste Paket einer Verbindung spezifiziert. Alle nachfolgend gesandten/empfangenen Pakete werden automatisch korrekt modifiziert.
Aufrufkonventionen:
| -j SNAT | Aktivieren des Source-NAT zum Ändern der Quell-IP-Adresse. | |
| --to-source <adresse>[-<adresse>][:<port>-<port>] | Dieser Parameter, der angegeben werden muß, legt fest, welches die Quell-IP-Adresse des Pakets ist. Werden mehrere Adressen angegeben, so wird eine dieser Adressen ausgewählt. Sind die zu wählenden Adressen nicht aufeinanderfolgend, kann der Parameter mehrfach angegeben werden. Werden darüberhinaus ein oder mehrere Ports angegeben, so wird ein Port aus diesem Bereich ausgewählt, der für diese Verbindung gewählt wird. Sonst wird versucht, den Port nicht zu ändern. | |
| -j DNAT | Aktivieren des Destination-NAT zum Ändern der Ziel-IP-Adresse. | |
| --to-destination <adresse>[-<adresse>][:<port>-<port>] | Mit dieser Option wird die Ziel-Adresse, zu der die Pakete dieser Verbindung gelangen sollen, angegeben. | |
| -j MASQUERADE | Aktivierung der Maskierung, einer Sonderform des SNAT. Unterschied zum SNAT ist, daß keine Quell-IP-Adresse angegeben werden kann, sondern die IP-Adresse des ausgehenden Interface als neue Quelle eingetragen wird. Mit dem Herunterfahren eines Interface (z.B. Auflegen einer Wählverbindung) werden alle gespeicherten Verbindungs-Informationen gelöscht, was bei SNAT nicht der Fall ist. | |
| --to-ports :<port>[-<port>] | Hiermit lassen sich ein Port oder ein Bereich von Ports angeben, die beim Maskieren verwendet werden sollen. Ohne diese Angabe werden Ports automatisch gewählt und wenn möglich, nicht verändert. | |
| -j REDIRECT | Hiermit werden alle Pakete dieser Verbindung an den lokalen Rechner umgeleitet. Damit kann z.B. das zwangsweise Ansprechen eines Name-Servers innerhalb eines Netzes erzwungen werden. | |
| --to-ports :<port>[-<port>] | Hiermit lassen sich ein Port oder ein Bereich von Ports angeben, die beim Umleiten verwendet werden sollen. Ohne diese Angabe werden Ports automatisch gewählt und wenn möglich, nicht verändert. | |
Beispiele:
# Name-Server von 192.168.99.99 umbiegen auf echten Server (z.B. 62.104.219.88) # iptables -A PREROUTING -t nat -p udp -d 192.168.99.99 --dport 53 \ -j DNAT --to-destination 62.104.219.88 # # Maskieren bei einer Wählverbindung # iptables -A POSTROUTING -t nat -s 192.168.1.0/24 -j MASQUERADE

