Linux Befehl "iptables"


Linux Befehl "iptables"

iptables erlaubt den Aufbau eines Filter-Regelwerkes für beliebige Schnittstellen.
Ähnlich einer Firewall können Datenpakete je nach Protokoll,Ursprung oder Ziel verworfen werden.

Achtung: Ab Kernel-Version 3.13(Debian-Jessie-pre) wird es vermutlich durch nftables ersetzt.
Dieser neuere Befehl hat einen ganz anderen Syntax, bietet aber einen Import von IPTABLES-Filtern.

Installation

Dieser Befehl sollte üblicherweise bereits installiert sein.
Falls nicht kann er leicht nachinstalliert werden:
# apt-get install iptables (ip6tables müsste automatisch mitinstalliert werden)

Befehle

Befehle für IP4
# iptables (ohne Parameter wird ein Hinweistext auf die Hilfe angezeigt)
# iptables -h (zeigt eine Übersicht möglicher Parameter und wenige Beispiele)
# iptables -L (Anzeige der aktuellen Regeln)
# iptables -L -v (Anzeige der aktuellen Regeln und wie häufig die angesprochen wurden)

Befehle für IP6
# ip6tables (ohne Parameter wird ein Hinweistext auf die Hilfe angezeigt)
# ip6tables -h (zeigt eine Übersicht möglicher Parameter und wenige Beispiele)
# ip6tables -L (Anzeige der aktuellen Regeln)
# ip6tables -L -v (Anzeige der aktuellen Regeln und wie häufig die angesprochen wurden)

Grundlegendes

Die verschiedenen Firewallregeln sollte man unter /etc/ ablegen. Hierbei bietet es sich an die Dateien nach Nutzen zu benennen:
/etc/iptables.test (Regelwerk zum TESTEN, im Schadensfall einfach den Server neu booten lassen..)
/etc/iptables.up (geprüftes Regelwerk, das beim Booten automatisch gestartet wird)
Solange man sich nicht ganz sicher ist, was man da eingentlich so treibt sollte man nur mit /etc/iptables.test arbeiten!!

Erst wenn ein Regelwerk definiert wurde und via # iptables-restore <datei> geladen wurde ist es aktiv!
Nach einem # reboot ist gar kein Regelwerk mehr aktiv(alles zugelassen!!)

Je nach Browsereinstellung können versteckte Steuerzeichen Fehler beim Kopieren erzeugen, dann von Hand eintippen..

Zu beachten: es gibt zwei verschiedene IP-Protokolle(ip4/ip6). Sowohl die Befehle als auch die "Tables" unterscheiden sich leicht!

Aufbau der iptables-Datei

iptables-Dateien und iptables-Skripte haben eine abweichende Schreibweise der Befehle. Diese nicht durcheinander werfen!
Die erste Zeile enthält als "Einleitung" das Wort *filter
Die vorletzte Zeile enthält als "Abschluß" das Wort COMMIT
Die letzte Zeile sollte eine "Leerzeile" sein, also einmal Return drücken.
Beispiel:
*filter
COMMIT
 
Die Reihenfolge der einzelnen Filter ist sehr wichtig da alle Regeln von oben nach unten abgearbeitet werden!
Umfangreiche Filteroptionen: INPUT/OUTPUT, zugehörige Qullen(IPs), Interfaces(eth0/wlan1..), Ports(1..65535), Protokolle(ICMP/tcp/udp).

Die Reaktion auf eine Filterregel folgt nach -j (jump?) mit angehängtem ACCEPT, DROP oder REJECT.
REJECT galt lange als "freundlich" bei Ablehnung von Verbindungsversuchen.
Für viele Anwendungen machte diese Einstellung Sinn, so bekam der andere Computer eine Rückmeldung(Port geschlossen, etc.).
Bei ftp-Verbindungen entfielen längere Wartezeiten da gleich auf eine andere Verbindungsart umgeschaltet werden könnte(active/passive).
DROP hingegen galt als "unfreundlich", da keine Rückmeldung bei verworfenen Datenpaketen erfolgt.

01. Nicht an den Server gerichtete Datenpakete verwerfen

Alle NICHT an den Server gerichteten Datenpakete werden verworfen.
Dazu gehören auch unsinnige Broadcasts die der Server einfach ignorieren sollte:
Anstelle von <SERVERIP> die IP des eigenen Servers eintragen(z.B. 123.1.2.3)!

# [F01] [    DRP<-] Nicht an SERVERIP gerichtete Pakete verwerfen
-A INPUT  -i eth0 ! -d <SERVERIP>                                                                                      -j DROP

02. Ungültige Datenpakete verwerfen

Alle NICHT gültigen Datenpekete werden verworfen. Gilt auch für einige *gefakete* Absendeadressen..
z.B. wenn werden Antworten auf Daten erbeten werden, die nie vom Server aus angefragt wurden..

# [F02] [    DRP<<] Alle "defekten" Pakete verwerfen
-A INPUT  -i eth0                       -p ALL                                  -m state --state INVALID                -j DROP

03. Loopback Zugriff von Außen verwerfen

Auf den Loopback soll von aussen kein Zugriff möglich sein, darum werden diese Datenpakete verworfen

# [F03] [    DRP<-] Nicht von lo0 kommendende Pakete nach 127/8 verwerfen
-A INPUT ! -i lo -d 127.0.0.0/8                                                                                         -j DROP

04. Internen Loopback-Datenverkehr zulassen

Internen Loopback-Datenverkehr kommentarlos zulassen
Scheint bei mir nicht nötig zu sein(kein Datenverkehr), aber man weiss ja nie..

# [   ] [    ACC<>] Pakete von/zu loopback (lo0) erlauben
-A INPUT   -i lo                                                                                                        -j ACCEPT
-A OUTPUT  -o lo                                                                                                        -j ACCEPT

??. SSH Zugang nur von eigener IP erlauben(bzw. IP-Pool)

Um die nervigen Passwortangriffe auf Port 00022 (SSH) etwas zu blocken nur die eigene IP(bzw.IP-Range) als Quelle zulassen.
Ohne diese Regel wächst /var/log/auth.log innerhalb weniger Tage auf 2MByte voller.. interessanter Usernamen -.-
Anstelle von <11.22.123.0> die IP des Remote-Computers(nicht des Servers!!) eintragen!

# [   ] [    ACC<=] SSHprovider                 [Port:   22 tcp] nur vom Ursprung <Serviceprovider IP-Pool> erlauben
-A INPUT  -i eth0 -s 11.22.123.0        -p tcp                  --dport    22   -m state --state NEW,ESTABLISHED        -j ACCEPT
-A OUTPUT -o eth0                       -p tcp  --sport    22                   -m state --state ESTABLISHED,RELATED    -j ACCEPT

Beispiel eine ganze IP-Range erlauben:
-A INPUT  -i eth0 -s 11.22.123.0/17     -p tcp                  --dport    22   -m state --state NEW,ESTABLISHED        -j ACCEPT
Die genauen Werte erfragt man sich bei seinem(hoffentlich) kompetenten Internetprovider.
Achtung! Beachten, das die eigene IP meist NICHT statisch ist. Eventuell hat der eigene Internetprovider ganze IP-Pools.

??. Alle anderen SSH Verbindungsversuche loggen und verwerfen

SSH-Fremdzugriffe verwerfen(ohne Protokollierung):
# [   ] [   /DRP<-] SSH                         [Port:   22 tcp] alle übrigen verwerfen
-A INPUT  -i eth0                       -p tcp                  --dport    22                                           -j DROP

Optional: SSH-Fremdzugriffe loggen() und verwerfen:
# [   ] [LOG/DRP<-] SSH                         [Port:   22 tcp] alle übrigen loggen und verwerfen
-A INPUT  -i eth0                       -p tcp                  --dport    22                                           -j LOG --log-prefix "IP4[dpt:00022.PRB]"
-A INPUT  -i eth0                       -p tcp                  --dport    22                                           -j DROP
Mit dieser Filterregel wird jeder (nicht vorher zugelassene)Zugriff auf Port 22(SSH) in /var/log/kernel.log protokolliert.
Sinnvoll wäre dann eine Umleitung des Systemlogdienstes, weil sonst die Logdatei arg unübersichtlich wird..

Es gibt noch viele weitere Möglichkeiten des "Feintunings", aber.. momentan bin ich anderweitig beschäftigt..
Keinesfalls vergessen, explizit die Dienste/Ports freizugeben, die man sonst noch so braucht..