Iptables Nat

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen

Funktionsweise

  • Die Regeln werden nacheinander abgearbeitet wenn eine Regel greift hört der Verarbeitungsprozess auf.
  • Wenn keine greift wird die Default Policy angewandt.
  • Bei 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 filter Tabelle

Die Ketten der filter Kette

  • PREROUTING: für Pakte die über eine Schnittstelle hereinkommen, noch bevor 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 die ü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 Quell Adresse auf die des Ausgangsinterface umgeschrieben wird.
  • Die Verbindungsinformationen wird in einer Tabelle gespeichert.
  • Pakete die zurückkommen 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
;;