Iptables Nat: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
 
(26 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
 
=Funktionsweise=
 
=Funktionsweise=
*Die Regeln werden nacheinander abgearbeitet wenn eine Regel greift hört der Verarbeitungsprozess auf.
+
*Die Regeln werden nacheinander abgearbeitet bis eine Regel greift, wonach der Verarbeitungsprozess aufhört.
*Wenn keine greift wird die Default Policy angewandt.
+
*Wenn keine greift, wird die Default Policy angewandt.
*Bei nat wird die Default Policy normalerweise nicht geändert.
+
*Bei Network Address Translation (NAT) wird die Default Policy normalerweise nicht geändert.
 
{| class="wikitable"
 
{| class="wikitable"
 
!colspan="6"|nat table
 
!colspan="6"|nat table
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, noch bevor entschieden ist ob sie an den Rechner oder weitergeleitet werden.  
+
*'''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 die über eine Schnittstelle herausgehenden Pakete, die von einem lokalen Dienst generiert werden
+
*'''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}}
  
==Die Filter Regeln der filter Tabelle==
+
=Arten von Nat=
 +
*[[Arten von NAT]]
 +
==Die Regeln der nat-Tabelle==
 
Regeln werden mit '''iptables''' erstellt und an Ziele geschickt.
 
Regeln werden mit '''iptables''' erstellt und an Ziele geschickt.
==Ziele der filter Tabelle==
+
 
*'''ACCEPT''': das Paket kann passieren
+
==Ziele der nat-Tabelle==
*'''REJECT''': das Paket wird zurückgewiesen und ein Fehlerpaket wird gesendet
 
 
*'''SNAT''': Quell Adresse oder Port werden verändert.  
 
*'''SNAT''': Quell Adresse oder Port werden verändert.  
 
*'''DNAT''': Ziel 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.  
 
*'''MASQUERADE''': Quell Adresse wird auf die IP einer Schnittstelle geändert.  
*'''NETMAP''': Ganze Netze werden umgesetzt. Kann sowohl Quell als auch Ziel Netze sein
+
*'''NETMAP''': Ganze Netze werden umgesetzt. Kann sowohl Quell als auch Ziel Netze sein.
 +
*'''RETURN''': Abarbeitung geht mit der nächsten Kette weiter.
  
 
=Syntax Allgemein=
 
=Syntax Allgemein=
Zeile 42: Zeile 44:
 
*iptables -nvL -t nat  
 
*iptables -nvL -t nat  
 
  -L        # Listing
 
  -L        # Listing
  -t filter # anzeigen der nat Tabelle
+
  -t nat    # anzeigen der nat Tabelle
 
  -n        # numerical
 
  -n        # numerical
  
Zeile 48: Zeile 50:
  
 
=MASQUERADE=
 
=MASQUERADE=
*Wir wollen als erstes Maskieren.
+
*MASQUERADE agiert auch in der Regel in der POSTROUTING Kette
*MASQUERADE bedeutet, dass beim ersten Paket, die Quelladresse auf die des Ausgangsinterface umgeschrieben wird.
+
*Bei SNAT wird eine IP dynamisch zugewiesen.
*Die Verbindungsinformationen wird in einer Tabelle gespeichert.
+
  '''iptables -t nat -A POSTROUTING -s $LAN -o $WANDEV -j MASQUERADE'''
*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
 
<pre>
 
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
 
</pre>
 
=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=
 
*SNAT agiert auch in der Regel in der POSTROUTING Kette
 
*SNAT agiert auch in der Regel in der POSTROUTING Kette
Zeile 142: Zeile 63:
 
*In diesem Fall in der POSTROUTING Kette
 
*In diesem Fall in der POSTROUTING Kette
 
*Hier wird das Original Netz in ein anderes umgesetzt.
 
*Hier wird das Original Netz in ein anderes umgesetzt.
#!/bin/bash
+
*Neuer Eintrag in die /usr/local/etc/firewall.cfg
case $1 in
+
'''NEWLAN="10.82.242.0/24"'''
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'''
 
  '''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=
 
=PORTFORWARDING=
 
*Beim Portforwarding wird ein Port der normalerweise an einem externen Interface ankommt, nach Innen geleitet.
 
*Beim Portforwarding wird ein Port der normalerweise an einem externen Interface ankommt, nach Innen geleitet.
 
*Portforwarding kommt in der PREROUTING Kette zur Anwendung
 
*Portforwarding kommt in der PREROUTING Kette zur Anwendung
*Das Ziel beim Portfording ist DNAT
+
*Das Ziel beim Portforwarding ist DNAT
 
;Wir leiten hier den Port 80 auf den Webserver um und den Port 9922 auf den ssh port des Webservers.
 
;Wir leiten hier den Port 80 auf den Webserver um und den Port 9922 auf den ssh port des Webservers.
#!/bin/bash
+
*Eintrag in die Konfigdatei
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'''
 
  '''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 80  -i $WANDEV -o $LANDEV -d $WEBSERVER -j ACCEPT'''
 
  '''iptables -A FORWARD  -p tcp --dport 22  -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 -t nat -A PREROUTING -j DNAT -d $WANIP -p tcp --dport 80 --to $WEBSERVER'''
iptables -A FORWARD  -m multiport -p tcp --dport 25,80,143,443,465,993  -j lan-to-wan
+
  '''iptables -t nat -A PREROUTING -j DNAT -d $WANIP -p tcp --dport 9922 --to $WEBSERVER:22'''
#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=
 
=NETMAP in der PREROUTING KETTE=
 
*Mit NETMAP können ganze NETZE umgeschrieben werden
 
*Mit NETMAP können ganze NETZE umgeschrieben werden

Aktuelle Version vom 1. August 2023, 11: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.

Arten von Nat

Die Regeln der nat-Tabelle

Regeln werden mit iptables erstellt und an Ziele geschickt.

Ziele der nat-Tabelle

  • 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.
  • RETURN: Abarbeitung geht mit der nächsten Kette weiter.

Syntax Allgemein

Die Momentan in der nat Tabelle gesetzten Ketten und Regeln sieht man mit

  • iptables -nvL -t nat
-L        # Listing
-t nat    # anzeigen der nat Tabelle
-n        # numerical

Ausgangsskript vom filter Workshop

MASQUERADE

  • MASQUERADE agiert auch in der Regel in der POSTROUTING Kette
  • Bei SNAT wird eine IP dynamisch zugewiesen.
iptables -t nat -A POSTROUTING -s $LAN -o $WANDEV -j MASQUERADE

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.
  • Neuer Eintrag in die /usr/local/etc/firewall.cfg

NEWLAN="10.82.242.0/24"

iptables -t nat -A POSTROUTING  -j NETMAP -s $LAN --to $NEWLAN -o $WANDEV

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 Portforwarding ist DNAT
Wir leiten hier den Port 80 auf den Webserver um und den Port 9922 auf den ssh port des Webservers.
  • Eintrag in die Konfigdatei
WEBSERVER=10.82.243.11
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
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

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