IPTables - Schnelleinstieg: Unterschied zwischen den Versionen

Aus xinux.net
Zur Navigation springen Zur Suche springen
 
(37 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 5: Zeile 5:
 
*Filterregeln (rules)
 
*Filterregeln (rules)
 
*Ziele (destinations)
 
*Ziele (destinations)
 +
*Default Policy
 +
 +
=Funktionsweise=
 +
Die Regeln werden nacheinander abgearbeitet wenn eine Regel greift hört der Verarbeitungsprozess auf. Wenn keine greift wird die Default Policy angewandt.
 +
 +
{| class="wikitable"
 +
!colspan="6"|filter table
 +
|-style="font-style: italic; color: blue;"
 +
||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
 +
|-style="font-style: italic; color: red;"
 +
||POLICY||POLICY||POLICY
 +
|}
  
 
=Tabellen=
 
=Tabellen=
Zeile 14: Zeile 34:
 
Die Tabelle mangle (übersetzt: zerhauen) ermöglicht es dem Kernel, Daten im Paket-Header zu verändern.
 
Die Tabelle mangle (übersetzt: zerhauen) ermöglicht es dem Kernel, Daten im Paket-Header zu verändern.
  
=Die filter Kette=
+
=Die filter Tabelle=
==Die Tabellen der filter Kette==
+
==Die Ketten der filter Kette==
 
*'''FORWARD''': für Pakte die über eine Schnittstelle hereinkommen, den Rechner auch wieder verlassen.  
 
*'''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
 
*'''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
 
*'''OUTPUT''': für die über eine Schnittstelle herausgehenden Pakete, die von einem lokalen Dienst
  
[[Datei:iptables-1.jpg|500px]]
+
[[Datei:iptables-filter.png|500px]]
  
==Die Filter Regeln der filter Kette==
+
==Die Filter Regeln der filter Tabelle==
 
Regeln werden mit '''iptables''' erstellt und an Ziele geschickt.
 
Regeln werden mit '''iptables''' erstellt und an Ziele geschickt.
==Ziele der filter Kette==
+
==Ziele der filter Tabelle==
 
*'''ACCEPT''': das Paket kann passieren
 
*'''ACCEPT''': das Paket kann passieren
 
*'''REJECT''': das Paket wird zurückgewiesen und ein Fehlerpaket wird gesendet
 
*'''REJECT''': das Paket wird zurückgewiesen und ein Fehlerpaket wird gesendet
Zeile 39: Zeile 59:
 
Da -t filter Default ist, kann man es auch weglassen,
 
Da -t filter Default ist, kann man es auch weglassen,
 
*iptables -nvL -t filter
 
*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.
 
 
{| class="wikitable"
 
!colspan="6"|filter table
 
|-style="font-style: italic; color: blue;"
 
||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
 
|-style="font-style: italic; color: red;"
 
||POLICY||POLICY||POLICY
 
|}
 
 
=Firewallscript=
 
=Firewallscript=
 
==Der Rumpf==
 
==Der Rumpf==
Zeile 165: Zeile 163:
 
  iptables -A OUTPUT -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 OUTPUT -o lo -m state --state NEW -j ACCEPT'''
  '''iptables -A INPUT -i lo -m state --state NEW -j ACCEPT'''
+
  '''iptables -A INPUT -i lo -m state --state NEW -j ACCEPT'''
;;
+
  ;;
 
  stop)
 
  stop)
 
  echo "stoppe firewall"
 
  echo "stoppe firewall"
Zeile 280: Zeile 278:
 
==Logging==
 
==Logging==
 
*tail -f /var/log/syslog | grep 'iptables'
 
*tail -f /var/log/syslog | grep 'iptables'
==Home Firewall==
+
=Automatischer Start=
<pre>
+
*[[Systemd Service Firewall]]
#!/bin/bash
+
=Die nat Tabelle=
LANDEV=enp0s8
+
==Die Ketten der filter Kette==
WANDEV=enp0s3
+
*'''POSTROUTING''': für Pakte die über eine Schnittstelle hereinkommen, und noch keine Routing Entscheidung getroffen wurde.
case $1 in
+
*'''INPUT''': für Pakete die über eine Schnittstelle hereinkommen und einen Dienst auf dem Rechner ansprechen.
start)
+
*'''OUTPUT''': für Pakete die von einem Dienst generiert werden und den Rechner wieder verlassen,
echo "starte firewall"
+
*'''PREROUTING''': für die über eine Schnittstelle herausgehenden Pakete, nach der Rounting Entscheidung.
iptables -F
+
 
iptables -t nat -F
+
[[Datei:iptables-nat-filter.png|400px]]
iptables -P INPUT DROP
+
 
iptables -P OUTPUT DROP
+
==Ziele der filter Tabelle==
iptables -P FORWARD DROP
+
*'''DNAT''': Ziel IP oder Ziel PORT werden verändert. Wird in der PREROUTING und INPUT Kette angewandt
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
+
*'''SNAT''': Quell IP oder Quell PORT werden verändert. Wird in der POSTROUTING und OUTPUT Kette angewandt
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
+
*'''MASQUERADE''': Es wird die Quell IP des ausgehenden Interfaces gesetzt. Wird in der POSTROUTING Kette angewandt,
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
+
*'''NETMAP''': ganze Netze werden umgesetzt. (PREROUTING und POSTROUTING Kette)
iptables -A OUTPUT -o lo -m state --state NEW -j ACCEPT
+
*'''LOG''': schreibt einen Eintrag in die syslog.
iptables -A INPUT -i lo  -m state --state NEW -j ACCEPT
+
*'''ACCEPT''': Nur in der Default Policy sinnvoll. Sollte nicht verändert werden.
iptables -A OUTPUT -m state --state NEW -j ACCEPT
+
===Maskierungen===
iptables -A INPUT -i $LANDEV -m state --state NEW -j ACCEPT
+
;Beim ersten Paket wird die IP Adresse des ausgehenden Interface eingesetzt.
iptables -A INPUT -i $WANDEV -p tcp -m multiport --dport 22,443 -m state --state NEW -j ACCEPT
+
#!/bin/bash
iptables -A INPUT -i $WANDEV -p icmp -m state --state NEW -j ACCEPT
+
LANDEV=enp0s8
iptables -A FORWARD -i $LANDEV -o $WANDEV -m state --state NEW -j ACCEPT
+
WANDEV=enp0s3  
iptables -A INPUT  -j LOG  --log-prefix "--iptables-in--"
+
case $1 in
iptables -A OUTPUT -j LOG  --log-prefix "--iptables-out--"
+
start)
iptables -A FORWARD -j LOG --log-prefix "--iptables-for--"
+
echo "starte firewall"
iptables -t nat -A POSTROUTING -o $WANDEV -j MASQUERADE
+
iptables -F
;;
+
iptables -t nat -F
stop)
+
iptables -P INPUT DROP
echo "stoppe firewall"
+
iptables -P OUTPUT DROP
iptables -F
+
iptables -P FORWARD DROP
iptables -t nat -F
+
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -P INPUT ACCEPT
+
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -P OUTPUT ACCEPT
+
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -P FORWARD ACCEPT
+
iptables -A OUTPUT -o lo -m state --state NEW -j ACCEPT
;;
+
iptables -A INPUT -i lo  -m state --state NEW -j ACCEPT'''
esac
+
iptables -A OUTPUT -m state --state NEW -j ACCEPT
</pre>
+
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 -t nat -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"
 +
WEBSERVER="10.83.32.11"
 +
case $1 in
 +
start)
 +
echo "starte firewall
 +
iptables -F
 +
iptables -t nat -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 FORWARD -i $WANDEV -o $LANDEV -p tcp --dport 80 -d $WEBSERVER -j ACCEPT'''
 +
'''iptables -A FORWARD -i $WANDEV -o $LANDEV -p tcp --dport 443 -d $WEBSERVER -j ACCEPT'''
 +
'''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

Aktuelle Version vom 31. August 2022, 13:05 Uhr

Iptables Funktionsweise

Iptables besteht aus:

  • Tabellen (tables)
  • Ketten (chains)
  • Filterregeln (rules)
  • Ziele (destinations)
  • Default Policy

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
POLICY POLICY POLICY

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

Iptables-filter.png

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

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.

Iptables-nat-filter.png

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 -t nat -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 -t nat -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"
WEBSERVER="10.83.32.11"
case $1 in
start)
echo "starte firewall
iptables -F 
iptables -t nat -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 FORWARD -i $WANDEV -o $LANDEV -p tcp --dport 80 -d $WEBSERVER -j ACCEPT
iptables -A FORWARD -i $WANDEV -o $LANDEV -p tcp --dport 443 -d $WEBSERVER -j ACCEPT
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