Iptables Nat: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
| Zeile 21: | Zeile 21: | ||
=Die nat Tabelle= | =Die nat Tabelle= | ||
==Die Ketten der nat Tabelle== | ==Die Ketten der nat Tabelle== | ||
| − | *'''PREROUTING''': für Pakte die über eine Schnittstelle hereinkommen | + | *'''PREROUTING''': für Pakte, die über eine Schnittstelle hereinkommen und noch bevor es entschieden ist, ob sie an den Rechner oder weitergeleitet werden. |
| − | *'''INPUT''': für Pakete die über eine Schnittstelle hereinkommen und einen Dienst auf dem Rechner ansprechen | + | *'''INPUT''': für Pakete, die über eine Schnittstelle hereinkommen und einen Dienst auf dem Rechner ansprechen. |
| − | *'''OUTPUT''': für | + | *'''OUTPUT''': für über eine Schnittstelle herausgehenden Pakete, die von einem lokalen Dienst generiert werden. |
| − | *'''POSTROUTING''': Pakete die den Rechner verlassen. | + | *'''POSTROUTING''': Pakete, die den Rechner verlassen. |
;In diesem Schaubild ist mangle Tabelle ausgeblendet. | ;In diesem Schaubild ist mangle Tabelle ausgeblendet. | ||
{{#drawio:iptables-nat.png}} | {{#drawio:iptables-nat.png}} | ||
Version vom 9. September 2022, 07:24 Uhr
Funktionsweise
- Die Regeln werden nacheinander abgearbeitet bis eine Regel greift, wonach der Verarbeitungsprozess aufhört.
- Wenn keine greift, wird die Default Policy angewandt.
- Bei Network Address Translation (NAT) wird die Default Policy normalerweise nicht geändert.
| nat table | |||||
|---|---|---|---|---|---|
| PREROUTING | INPUT | OUTPUT | POSTROUTING | ||
| rule 1 | rule 1 | rule 1 | rule 1 | ||
| rule 2 | rule 2 | rule 2 | rule 2 | ||
| rule 3 | rule 3 | rule 3 | rule 2 | ||
| rule 4 | rule 4 | rule 4 | rule 4 | ||
| POLICY | POLICY | POLICY | POLICY | ||
Die nat Tabelle
Die Ketten der nat Tabelle
- PREROUTING: für Pakte, die über eine Schnittstelle hereinkommen und noch bevor es entschieden ist, ob sie an den Rechner oder weitergeleitet werden.
- INPUT: für Pakete, die über eine Schnittstelle hereinkommen und einen Dienst auf dem Rechner ansprechen.
- OUTPUT: für über eine Schnittstelle herausgehenden Pakete, die von einem lokalen Dienst generiert werden.
- POSTROUTING: Pakete, die den Rechner verlassen.
- In diesem Schaubild ist mangle Tabelle ausgeblendet.
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
- SNAT: Quell Adresse oder Port werden verändert.
- DNAT: Ziel Adresse oder Port werden verändert.
- MASQUERADE: Quell Adresse wird auf die IP einer Schnittstelle geändert.
- NETMAP: Ganze Netze werden umgesetzt. Kann sowohl Quell als auch Ziel Netze sein
Syntax Allgemein
Die Momentan in der nat Tabelle gesetzten Ketten und Regeln sieht man mit
- iptables -nvL -t nat
-L # Listing -t filter # anzeigen der nat Tabelle -n # numerical
Ausgangsskript vom filter Workshop
MASQUERADE
- Wir wollen als erstes Maskieren.
- MASQUERADE bedeutet, dass beim ersten Paket, die Quelladresse auf die des Ausgangsinterface umgeschrieben wird.
- Die Verbindungsinformationen wird in einer Tabelle gespeichert.
- zurückkommende Pakete werden so wieder an den richtigen Absender geschickt.
- MASQUERADE greift in der POSTROUTING Kette, kurz vor dem Verlassen des Rechners
- MASQUERADE kommt auch mit einem IP Wechsel der Schnittstelle klar, es wird einfach auf die Neue umgeschrieben
- MASQUERADE ist etwas langsamer als SNAT
#!/bin/bash case $1 in start) LANDEV="ens19" WANDEV="eth0" LAN="10.82.243.0/24" WANIP="10.82.227.1" echo "starte firewall" #flushen der Regeln iptables -F iptables -F -t nat #löscht eigene Ketten iptables -X iptables -X -t nat #Default Policy setzen iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP #Connection Tracking 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 #Verkehr von Rechner hinaus freischalten iptables -A OUTPUT -m state --state NEW -j ACCEPT #Verkehr über das loopback device freischalten iptables -A INPUT -i lo -m state --state NEW -j ACCEPT #Verkehr zum Rechner ZUM TCP PORT 22 erlauben iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT #ping freischalten iptables -A INPUT -p icmp --icmp-type echo-request -m state --state NEW -j ACCEPT iptables -N lan-to-wan iptables -A lan-to-wan -s $LAN -i $LANDEV -o $WANDEV -m state --state NEW -j ACCEPT #ping und namensauflösung von innen freischalten iptables -A FORWARD -p icmp --icmp-type echo-request -j lan-to-wan iptables -A FORWARD -p tcp --dport 53 -j lan-to-wan iptables -A FORWARD -p udp --dport 53 -j lan-to-wan #Freischalten von smtp,http,imap,https,smtps,imps iptables -A FORWARD -m multiport -p tcp --dport 25,80,143,443,465,993 -j lan-to-wan iptables -t nat -A POSTROUTING -s $LAN -o $WANDEV -j MASQUERADE #Logging der Ketten vor dem Ablehnen der Pakete iptables -A INPUT -j LOG --log-prefix "--iptables-drop-in--" iptables -A OUTPUT -j LOG --log-prefix "--iptables-drop-out--" iptables -A FORWARD -j LOG --log-prefix "--iptables-drop-for--" ;; stop) echo "stoppe firewall" iptables -F iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT ;; esac
Momentaner Status nach firewall start
- iptables -t nat -nvL
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 MASQUERADE all -- * eth0 10.82.243.0/24 0.0.0.0/0
Untersuchung
- ping von innen nach 8.8.8.8
- Interne Schnittstelle
- tcpdump -ni ens19 icmp -c 1
10:52:26.357098 IP 10.82.243.11 > 8.8.8.8: ICMP echo request, id 36013, seq 37, length 64
- Externe Schnittstelle
- tcpdump -ni eth0 icmp -c 1
10:52:16.873500 IP 10.82.227.12 > 8.8.8.8: ICMP echo request, id 36013, seq 28, length 64
SNAT
- SNAT agiert auch in der Regel in der POSTROUTING Kette
- Bei SNAT wird eine IP statisch zugewiesen.
- SNAT ist darum schneller als MASQUERADE
- SNAT Pentant
- iptables -t nat -A POSTROUTING -s $LAN -o $WANDEV -j SNAT --to-source $WANIP
NETMAP in der POSTROUTING KETTE
- Mit NETMAP können ganze NETZE umgeschrieben werden
- In diesem Fall in der POSTROUTING Kette
- Hier wird das Original Netz in ein anderes umgesetzt.
#!/bin/bash case $1 in start) LANDEV="ens19" WANDEV="eth0" LAN="10.82.243.0/24" NEWLAN="10.82.242.0/24" WANIP="10.82.227.1" echo "starte firewall" #flushen der Regeln iptables -F iptables -F -t nat #löscht eigene Ketten iptables -X iptables -X -t nat #Default Policy setzen iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP #Connection Tracking 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 #Verkehr von Rechner hinaus freischalten iptables -A OUTPUT -m state --state NEW -j ACCEPT #Verkehr über das loopback device freischalten iptables -A INPUT -i lo -m state --state NEW -j ACCEPT #Verkehr zum Rechner ZUM TCP PORT 22 erlauben iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT #ping freischalten iptables -A INPUT -p icmp --icmp-type echo-request -m state --state NEW -j ACCEPT iptables -N lan-to-wan iptables -A lan-to-wan -s $LAN -i $LANDEV -o $WANDEV -m state --state NEW -j ACCEPT #ping und namensauflösung von innen freischalten iptables -A FORWARD -p icmp --icmp-type echo-request -j lan-to-wan iptables -A FORWARD -p tcp --dport 53 -j lan-to-wan iptables -A FORWARD -p udp --dport 53 -j lan-to-wan #Freischalten von smtp,http,imap,https,smtps,imps iptables -A FORWARD -m multiport -p tcp --dport 25,80,143,443,465,993 -j lan-to-wan #iptables -t nat -A POSTROUTING -s $LAN -o $WANDEV -j SNAT --to-source $WANIP #iptables -t nat -A POSTROUTING -s $LAN -o $WANDEV -j MASQUERADE iptables -t nat -A POSTROUTING -j NETMAP -s $LAN --to $NEWLAN -o $WANDEV #Logging der Ketten vor dem Ablehnen der Pakete iptables -A INPUT -j LOG --log-prefix "--iptables-drop-in--" iptables -A OUTPUT -j LOG --log-prefix "--iptables-drop-out--" iptables -A FORWARD -j LOG --log-prefix "--iptables-drop-for--" ;; stop) echo "stoppe firewall" iptables -F iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT ;; esac
PORTFORWARDING
- Beim Portforwarding wird ein Port der normalerweise an einem externen Interface ankommt, nach Innen geleitet.
- Portforwarding kommt in der PREROUTING Kette zur Anwendung
- Das Ziel beim Portfording ist DNAT
- Wir leiten hier den Port 80 auf den Webserver um und den Port 9922 auf den ssh port des Webservers.
#!/bin/bash case $1 in start) LANDEV="ens19" WANDEV="eth0" LAN="10.82.243.0/24" NEWLAN="10.82.242.0/24" WANIP="10.82.227.12" WEBSERVER=10.82.243.11 echo "starte firewall" #flushen der Regeln iptables -F iptables -F -t nat #löscht eigene Ketten iptables -X iptables -X -t nat #Default Policy setzen iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP #Connection Tracking 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 #Verkehr von Rechner hinaus freischalten iptables -A OUTPUT -m state --state NEW -j ACCEPT #Verkehr über das loopback device freischalten iptables -A INPUT -i lo -m state --state NEW -j ACCEPT #Verkehr zum Rechner ZUM TCP PORT 22 erlauben iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT #ping freischalten iptables -A INPUT -p icmp --icmp-type echo-request -m state --state NEW -j ACCEPT iptables -N lan-to-wan iptables -A lan-to-wan -s $LAN -i $LANDEV -o $WANDEV -m state --state NEW -j ACCEPT #ping und namensauflösung von innen freischalten iptables -A FORWARD -p icmp --icmp-type echo-request -j lan-to-wan iptables -A FORWARD -p tcp --dport 53 -j lan-to-wan iptables -A FORWARD -p udp --dport 53 -j lan-to-wan iptables -A FORWARD -p tcp --dport 80 -i $WANDEV -o $LANDEV -d $WEBSERVER -j ACCEPT iptables -A FORWARD -p tcp --dport 22 -i $WANDEV -o $LANDEV -d $WEBSERVER -j ACCEPT #Freischalten von smtp,http,imap,https,smtps,imps iptables -A FORWARD -m multiport -p tcp --dport 25,80,143,443,465,993 -j lan-to-wan #iptables -t nat -A POSTROUTING -s $LAN -o $WANDEV -j SNAT --to-source $WANIP #iptables -t nat -A POSTROUTING -s $LAN -o $WANDEV -j MASQUERADE iptables -t nat -A POSTROUTING -j NETMAP -s $LAN --to $NEWLAN -o $WANDEV iptables -t nat -A PREROUTING -j DNAT -d $WANIP -p tcp --dport 80 --to $WEBSERVER iptables -t nat -A PREROUTING -j DNAT -d $WANIP -p tcp --dport 9922 --to $WEBSERVER:22 #Logging der Ketten vor dem Ablehnen der Pakete iptables -A INPUT -j LOG --log-prefix "--iptables-drop-in--" iptables -A OUTPUT -j LOG --log-prefix "--iptables-drop-out--" iptables -A FORWARD -j LOG --log-prefix "--iptables-drop-for--" ;; stop) echo "stoppe firewall" iptables -F iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT ;;
NETMAP in der PREROUTING KETTE
- Mit NETMAP können ganze NETZE umgeschrieben werden
- In diesem Fall in der PREROUTING Kette
- Hier wird ein anderes Netz in das Original Netz umgesetzt.
- firewall Regel
- iptables -A FORWARD -i $WANDEV -o $LANDEV -d $LAN -j ACCEPT
- nat Regel
- iptables -t nat -A PREROUTING -j NETMAP -s $NEWLAN --to $LAN -i $WANDEV
