Iptables Filter

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

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
In diesem Schaubild sind nat und mangel Tabellen ausgeblendet.
  • Jedes Paket durchläuft nue eine Filter Kette

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
Die neuen Funktionen die wir hier verwenden beinhalten
-F löscht alle Regeln aller Ketten

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
Die neuen Funktionen die wir hier verwenden beinhalten
-P INPUT DROP setzt die default policy auf DROP

Momentaner Status nach firewall stop

  • iptables -nvL
Chain INPUT (policy ACCEPT 56 packets, 3824 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 35 packets, 7884 bytes)
 pkts bytes target     prot opt in     out     source               destination 

ESTABLISHED und RELATED Pakete (Connection Tracking)

  • iptables ist eine stateful Firewall
  • Die bedeutet das über Verbindungen Buch geführt wird.
  • Wenn das erste Paket erlaubt ist, gilt eine Verbindung als ESTABLISHED
  • RELATED Paketes stehen in Beziehung zu einer Verbindung, beispielsweise ICMP Nachrichten.
  • Die Idee ist nun alle ESTABLISHED und RELATED Pakete freizuschalten und nur zu entscheiden ob das erste Paket durch darf oder nicht.
  • Wir setzen dies mit folgenden Befehlen um.
 #!/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.
  • Wir können momentan auch nicht von aussen darauf zugreifen.
  • Desweiteren kann der Rechner nicht mit der Aussenwelt 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
#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
 ;;
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
-p tcp: Protokoll tcp
--dport 22: Port 22

Momentaner Status nach firewall start

  • iptables -nvL
Chain INPUT (policy DROP 3 packets, 156 bytes)
 pkts bytes target     prot opt in     out     source               destination         
   87  6836 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
    0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0            state NEW
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22 state NEW

Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED

Chain OUTPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
   63  5880 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
    2   188 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state NEW

Das Logging

  • iptables kann in das syslog System loggen.
  • Dies landet dann ohne weitere Konfigurationsmassnahmen in /var/log/syslog
  • Die Idee ist nun kurz vor den Default Policy zu loggen.
  • Somit sehen wir den Verkehr der abgelehnt wird.
  • Das LOG Ziel beendet als einziges nicht die Verarbeitung
  • Das bedeutet man kann auch Pakete logen die man nicht ablehnt
 #!/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
#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 
#Logging der Ketten vor dem Ablehnen der Pakete
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT
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
Verwendete Syntax
-j LOG: wird ans LOG Ziel gesendet
--log-prefix "--iptables-for--": Wird dem Log vorangestellt.