IPTables - Schnelleinstieg: Unterschied zwischen den Versionen
(→SNAT) |
(→DNAT) |
||
Zeile 400: | Zeile 400: | ||
iptables -A FORWARD -i $LANDEV -o $WANDEV -p icmp -m state --state NEW -j ACCEPT | iptables -A FORWARD -i $LANDEV -o $WANDEV -p icmp -m state --state NEW -j ACCEPT | ||
iptables -t nat -A POSTROUTING -o $WANDEV -j SNAT --to-source $WANIP | iptables -t nat -A POSTROUTING -o $WANDEV -j SNAT --to-source $WANIP | ||
− | '''iptables -t nat -A PREROUTING -i $WANDEV -j DNAT -d $WANIP -p tcp --dport 80 --to $WEBSERVER:80 | + | |
+ | '''iptables -t nat -A PREROUTING -i $WANDEV -j DNAT -d $WANIP -p tcp --dport 80 --to $WEBSERVER:80''' | ||
+ | '''iptables -t nat -A PREROUTING -i $WANDEV -j DNAT -d $WANIP -p tcp --dport 443 --to $WEBSERVER:443''' | ||
iptables -A INPUT -j LOG --log-prefix "--iptables-in--" | iptables -A INPUT -j LOG --log-prefix "--iptables-in--" | ||
iptables -A OUTPUT -j LOG --log-prefix "--iptables-out--" | iptables -A OUTPUT -j LOG --log-prefix "--iptables-out--" |
Version vom 2. Dezember 2019, 15:59 Uhr
Iptables Funktionsweise
Iptables besteht aus:
- Tabellen (tables)
- Ketten (chains)
- Filterregeln (rules)
- Ziele (destinations)
Tabellen
filter
Die Tabelle filter prüft alle für die Firewall ankommenden Pakete und entscheidet ob sie durchgelassen oder geblockt werden.
nat
NAT wird benutzt um IP-Adressen oder Ports zu übersetzen/ändern (= Network Adress Translation).
mangle
Die Tabelle mangle (übersetzt: zerhauen) ermöglicht es dem Kernel, Daten im Paket-Header zu verändern.
Die filter Tabelle
Die Ketten der filter Kette
- FORWARD: für Pakte die über eine Schnittstelle hereinkommen, den Rechner auch wieder verlassen.
- INPUT: für Pakete die über eine Schnittstelle hereinkommen und einen Dienst auf dem Rechner ansprechen
- OUTPUT: für die über eine Schnittstelle herausgehenden Pakete, die von einem lokalen Dienst
Die Filter Regeln der filter Tabelle
Regeln werden mit iptables erstellt und an Ziele geschickt.
Ziele der filter Tabelle
- ACCEPT: das Paket kann passieren
- REJECT: das Paket wird zurückgewiesen und ein Fehlerpaket wird gesendet
- LOG: schreibt einen Eintrag in die syslog
- DROP: das Paket wird ignoriert und keine Antwort gesendet
Syntax Allgemein
Die Momentan in der filter Tabelle gesetzten Ketten und Regeln sieht man mit
- iptables -nvL -t filter
-L # Listing -t filter # anzeigen der filter Kette -n # numerical -v # verbose
Da -t filter Default ist, kann man es auch weglassen,
- iptables -nvL -t filter
Funktionsweise
Die Regeln werden nacheinander abgearbeitet wenn eine Regel greift hört der Verarbeitungsprozess auf. Wenn keine greift wird die Default Policy angewandt.
filter table | |||||
---|---|---|---|---|---|
INPUT | OUTPUT | FORWARD | |||
rule 1 | rule 1 | rule 1 | |||
rule 2 | rule 2 | rule 2 | |||
rule 3 | rule 3 | rule 3 | |||
rule 4 | rule 4 | rule 4 | |||
rule 5 | rule 5 | rule 5 | |||
rule 6 | rule 6 | rule 6 | |||
POLICY | POLICY | POLICY |
Firewallscript
Der Rumpf
Zuerst wird in dem firewall-Skript ein case start - stop Block angelegt:
- cd /usr/local/sbin/
- vi firewall
#!/bin/bash case $1 in start) echo "starte firewall" ;; stop) echo "stoppe firewall" ;; *) echo "usage: $0 start|stop" ;; esac
Script ausführbar machen
- chmod +x firewall
Testen des Scripts
- firewall start
- firewall stop
- firewall
Flushen aller vorhergehenden Regeln
#!/bin/bash case $1 in start) echo "starte firewall" iptables -F ;; stop) echo "stoppe firewall" iptables -F ;; esac
Setzen der Default Policys
#!/bin/bash case $1 in start) echo "starte firewall" iptables -F iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP ;; stop) echo "stoppe firewall" iptables -F iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT ;; esac
ESTABLISHED und RELATED Pakete (Connection Tracking)
Ein Vorteil von iptables zu seinen Vorgängern ist die Funktion seinen Paketfilter nur auf die ersten Pakete einer Verbindung zu begrenzen und so Ressourcen zu sparen. Dieses wird erreicht mit folgenden Zeilen
#!/bin/bash case $1 in start) echo "starte firewall" iptables -F iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT ;; stop) echo "stoppe firewall" iptables -F iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT ;; esac
- Verwendete Syntax
- Die neuen Funktionen die wir hier verwenden beinhalten:
- -m state: Das Modul von iptables das erkennt ob ein Paket eine Verbindung initiiert oder zu einer bereits errichteten Verbindung gehört.
- --state ESTABLISHED,RELATED: Der Status nach dem das Paket untersucht wird, wobei
- ESTABLISHED: Pakete die zu einer Verbindung gehören. Also frühestens das 2 Paket.
- RELATED: Pakete die in einer relation zu einer anderen Verbindung stehen.
- -j ACCEPT Regel springt zum ACCEPT Ziel.
Die ersten Regeln die auch treffen
Nun haben wir schon ein paar Regeln aber noch keine die bisher zutreffen kann. Wenn wir diese Firewall aktivieren würden wäre unser eigener Router Nichtmal mehr in der Lage mit sich selbst zu kommunizieren.
Das loopbackdevice
Da er dies über das sogennante "loopback device" lassen wir jetzt unsere ersten Pakete durch.
#!/bin/bash case $1 in start) echo "starte firewall" iptables -F iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -o lo -m state --state NEW -j ACCEPT iptables -A INPUT -i lo -m state --state NEW -j ACCEPT ;; stop) echo "stoppe firewall" iptables -F iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT ;; esac
- Verwendete Syntax
- -o lo: output interface hier lo
- -i lo: input interface hier lo
- -m state: laden des state Moduls
- --state NEW: Das erste Paket einer Verbindung
- -j ACCEPT: springe zum ACCEPT Ziel
Neue Regeln und Variablen
Wir lassen ausgehenden Verkehr vom Rechner zu lassen ssh und icmp Zugriff auf die Firewall zu
#!/bin/bash case $1 in start) echo "starte firewall" iptables -F iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -o lo -m state --state NEW -j ACCEPT iptables -A INPUT -i lo -m state --state NEW -j ACCEPT iptables -A OUTPUT -m state --state NEW -j ACCEPT iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT ;; stop) echo "stoppe firewall" iptables -F iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT ;; esac
- Verwendete Syntax
- -p tcp: protokoll tcp
- --dport 22 : destination port 22
Variablen Definition und Zugriff von Innen und Multiport Modul
#!/bin/bash LANDEV=enp0s8 WANDEV=enp0s3 case $1 in start) echo "starte firewall" iptables -F iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -o lo -m state --state NEW -j ACCEPT iptables -A INPUT -i lo -m state --state NEW -j ACCEPT iptables -A OUTPUT -m state --state NEW -j ACCEPT iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT iptables -A INPUT -i $LANDEV -p tcp -m multiport --dport 53,80,443 -m state --state NEW -j ACCEPT iptables -A INPUT -i $LANDEV -p udp -m multiport --dport 53,67 -m state --state NEW -j ACCEPT ;; stop) echo "stoppe firewall" iptables -F iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT ;; esac
Diverse Forward Regeln und Logging
#!/bin/bash LANDEV=enp0s8 WANDEV=enp0s3 case $1 in start) echo "starte firewall" iptables -F iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -o lo -m state --state NEW -j ACCEPT iptables -A INPUT -i lo -m state --state NEW -j ACCEPT iptables -A OUTPUT -m state --state NEW -j ACCEPT iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT iptables -A INPUT -i $LANDEV -p tcp -m multiport --dport 53,80,443 -m state --state NEW -j ACCEPT iptables -A INPUT -i $LANDEV -p udp -m multiport --dport 53,67 -m state --state NEW -j ACCEPT iptables -A FORWARD -i $LANDEV -o $WANDEV -p tcp -m multiport --dport 22,25,53,80,443,465,993 -m state --state NEW -j ACCEPT iptables -A FORWARD -i $LANDEV -o $WANDEV -p udp --dport 53 -m state --state NEW -j ACCEPT iptables -A FORWARD -i $LANDEV -o $WANDEV -p icmp -m state --state NEW -j ACCEPT iptables -A INPUT -j LOG --log-prefix "--iptables-in--" iptables -A OUTPUT -j LOG --log-prefix "--iptables-out--" iptables -A FORWARD -j LOG --log-prefix "--iptables-for--" ;; stop) echo "stoppe firewall" iptables -F iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT ;; esac
Logging
- tail -f /var/log/syslog | grep 'iptables'
Automatischer Start
Die nat Tabelle
Die Ketten der filter Kette
- POSTROUTING: für Pakte die über eine Schnittstelle hereinkommen, und noch keine Routing Entscheidung getroffen wurde.
- INPUT: für Pakete die über eine Schnittstelle hereinkommen und einen Dienst auf dem Rechner ansprechen.
- OUTPUT: für Pakete die von einem Dienst generiert werden und den Rechner wieder verlassen,
- PREROUTING: für die über eine Schnittstelle herausgehenden Pakete, nach der Rounting Entscheidung.
Ziele der filter Tabelle
- DNAT: Ziel IP oder Ziel PORT werden verändert. Wird in der PREROUTING und INPUT Kette angewandt
- SNAT: Quell IP oder Quell PORT werden verändert. Wird in der POSTROUTING und OUTPUT Kette angewandt
- MASQUERADE: Es wird die Quell IP des ausgehenden Interfaces gesetzt. Wird in der POSTROUTING Kette angewandt,
- NETMAP: ganze Netze werden umgesetzt. (PREROUTING und POSTROUTING Kette)
- LOG: schreibt einen Eintrag in die syslog.
- ACCEPT: Nur in der Default Policy sinnvoll. Sollte nicht verändert werden.
Maskierungen
- Beim ersten Paket wird die IP Adresse des ausgehenden Interface eingesetzt.
#!/bin/bash LANDEV=enp0s8 WANDEV=enp0s3 case $1 in start) echo "starte firewall" iptables -F iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -o lo -m state --state NEW -j ACCEPT iptables -A INPUT -i lo -m state --state NEW -j ACCEPT iptables -A OUTPUT -m state --state NEW -j ACCEPT iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT iptables -A INPUT -i $LANDEV -p tcp -m multiport --dport 53,80,443 -m state --state NEW -j ACCEPT iptables -A INPUT -i $LANDEV -p udp -m multiport --dport 53,67 -m state --state NEW -j ACCEPT iptables -A FORWARD -i $LANDEV -o $WANDEV -p tcp -m multiport --dport 22,25,53,80,443,465,993 -m state --state NEW -j ACCEPT iptables -A FORWARD -i $LANDEV -o $WANDEV -p udp --dport 53 -m state --state NEW -j ACCEPT iptables -A FORWARD -i $LANDEV -o $WANDEV -p icmp -m state --state NEW -j ACCEPT iptables -t nat -A POSTROUTING -o $WANDEV -j MASQUERADE iptables -A INPUT -j LOG --log-prefix "--iptables-in--" iptables -A OUTPUT -j LOG --log-prefix "--iptables-out--" iptables -A FORWARD -j LOG --log-prefix "--iptables-for--" ;; stop) echo "stoppe firewall" iptables -F iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT ;; esac
SNAT
- Beim ersten Paket wird die angegebenene IP Adresse eingesetzt.
#!/bin/bash LANDEV=enp0s8 WANDEV=enp0s3 WANIP="10.84.252.32" case $1 in start) echo "starte firewall" iptables -F iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -o lo -m state --state NEW -j ACCEPT iptables -A INPUT -i lo -m state --state NEW -j ACCEPT iptables -A OUTPUT -m state --state NEW -j ACCEPT iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT iptables -A INPUT -i $LANDEV -p tcp -m multiport --dport 53,80,443 -m state --state NEW -j ACCEPT iptables -A INPUT -i $LANDEV -p udp -m multiport --dport 53,67 -m state --state NEW -j ACCEPT iptables -A FORWARD -i $LANDEV -o $WANDEV -p tcp -m multiport --dport 22,25,53,80,443,465,993 -m state --state NEW -j ACCEPT iptables -A FORWARD -i $LANDEV -o $WANDEV -p udp --dport 53 -m state --state NEW -j ACCEPT iptables -A FORWARD -i $LANDEV -o $WANDEV -p icmp -m state --state NEW -j ACCEPT iptables -t nat -A POSTROUTING -o $WANDEV -j SNAT --to-source $WANIP iptables -A INPUT -j LOG --log-prefix "--iptables-in--" iptables -A OUTPUT -j LOG --log-prefix "--iptables-out--" iptables -A FORWARD -j LOG --log-prefix "--iptables-for--" ;; stop) echo "stoppe firewall" iptables -F iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT ;; esac
DNAT
- Auf den internen Webserver auf Port 80 und 443 kann über die externer IP Adresse zugegriffen werden.
#!/bin/bash LANDEV=enp0s8 WANDEV=enp0s3 WANIP="10.84.252.32" case $1 in start) echo "starte firewall" iptables -F iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -o lo -m state --state NEW -j ACCEPT iptables -A INPUT -i lo -m state --state NEW -j ACCEPT iptables -A OUTPUT -m state --state NEW -j ACCEPT iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT iptables -A INPUT -i $LANDEV -p tcp -m multiport --dport 53,80,443 -m state --state NEW -j ACCEPT iptables -A INPUT -i $LANDEV -p udp -m multiport --dport 53,67 -m state --state NEW -j ACCEPT iptables -A FORWARD -i $LANDEV -o $WANDEV -p tcp -m multiport --dport 22,25,53,80,443,465,993 -m state --state NEW -j ACCEPT iptables -A FORWARD -i $LANDEV -o $WANDEV -p udp --dport 53 -m state --state NEW -j ACCEPT iptables -A FORWARD -i $LANDEV -o $WANDEV -p icmp -m state --state NEW -j ACCEPT iptables -t nat -A POSTROUTING -o $WANDEV -j SNAT --to-source $WANIP
iptables -t nat -A PREROUTING -i $WANDEV -j DNAT -d $WANIP -p tcp --dport 80 --to $WEBSERVER:80 iptables -t nat -A PREROUTING -i $WANDEV -j DNAT -d $WANIP -p tcp --dport 443 --to $WEBSERVER:443 iptables -A INPUT -j LOG --log-prefix "--iptables-in--" iptables -A OUTPUT -j LOG --log-prefix "--iptables-out--" iptables -A FORWARD -j LOG --log-prefix "--iptables-for--" ;; stop) echo "stoppe firewall" iptables -F iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT ;; esac