Iptables Filter
Version vom 31. August 2022, 15:24 Uhr von Thomas.will (Diskussion | Beiträge) (→Wir schalten icmp frei)
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.
Das Logging
- Wir schauen uns mit tail was aktuell gelogt wird
- tail -f /var/log/syslog | grep iptables
Aug 31 14:48:22 fw1 kernel: [ 398.101280] --iptables-drop-in--IN=eth0 OUT= MAC=5a:58:a5:d2:f8:95:96:83:0d:88:c6:1d:08:00 SRC=10.81.1.1 DST=10.82.227.12 LEN=84 TOS=0x00 PREC=0x00 TTL=62 ID=63817 DF PROTO=ICMP TYPE=8 CODE=0 ID=8 SEQ=1 Aug 31 14:48:23 fw1 kernel: [ 399.129448] --iptables-drop-in--IN=eth0 OUT= MAC=5a:58:a5:d2:f8:95:96:83:0d:88:c6:1d:08:00 SRC=10.81.1.1 DST=10.82.227.12 LEN=84 TOS=0x00 PREC=0x00 TTL=62 ID=64043 DF PROTO=ICMP TYPE=8 CODE=0 ID=8 SEQ=2 Aug 31 14:48:24 fw1 kernel: [ 400.153635] --iptables-drop-in--IN=eth0 OUT= MAC=5a:58:a5:d2:f8:95:96:83:0d:88:c6:1d:08:00 SRC=10.81.1.1 DST=10.82.227.12 LEN=84 TOS=0x00 PREC=0x00 TTL=62 ID=64086 DF PROTO=ICMP TYPE=8 CODE=0 ID=8 SEQ=3
Wir schalten icmp frei
... #ICMP echo-request freigeschaltet iptables -A INPUT -p icmp --icmp-type echo-request -m state --state NEW -j ACCEPT #Logging der Ketten vor dem Ablehnen der Pakete ...
- Verwendete Syntax
- -p icmp: Protokoll icmp
- --icmp-type echo-request: nur echo requests
Forwarding
- Um Pakete weiter zu leiten muss als erstes das FORWARDING im Kernel aktiviert werden.
Testen
- wenn man diesen Befehl absetzt und nichts zurück bekommt ist es deativiert
- sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 0
==Aktivie
- echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.confren==
- sysctl -p
net.ipv4.ip_forward = 1
