Ich habe mich mal mit iptables herumgeschlagen. Nicht ganz freiwillig, denn es gibt mit ufw auch einfacher nutzbare Firewall Lösungen. Dennoch erreicht man bei regelmäßiger Beschäftigung mit Linux als Server irgendwann den Punkt, an dem man um iptables nicht mehr herumkommt. Ich möchte hier nun noch einmal festhalten, was ich gelernt habe. So prägt sich das besser ein.
Status prüfen und resetten
Bevor man damit beginnt iptables Regeln anzulegen, sollte man mit iptables -F
dafür sorgen, dass alle bisherigen Regeln entfernt werden. Mit iptables -L
kann man alle momentan gesetzten Regeln ansehen.
Das Flushen der iptables Regeln ist aber immer mit Vorsicht zu genießen: Schnell kann man sich hier den eigenen Ast absägen, indem man die ssh Verbindung zum Server blockiert. Während ich den Umgang mit iptables gelernt habe, ist mir das mehrfach passiert :)
Erste Regeln und Defaults
Es gibt drei verschiedene Chains, die man mit Regeln versehen kann: INPUT, OUTPUT und FORWARD. Alle Chains werden mit einem Default versehen. Er legt fest, was mit Paketen passiert, auf die keine spezifische Regel zutrifft.
Es ist eine gute Idee alle eingehenden Pakete grundsätzlich zu verwerfen, wenn der Port nicht extra freigegeben wurde. Das geht mit iptables -D INPUT -j DROP
. Das sollte man jedoch erst tun, nachdem man zumindest ssh explizit freigegeben hat! Ihr erinnert euch, die Sache mit dem Ast.
Die Freigabe von ssh sieht dann so aus:
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
Das -A INPUT hängt die neue Regel an die bestehende Input Chain an (append). Das -p tcp legt fest, dass die Regel für TCP Pakete gilt. Der –dport 22 legt den Zielport fest, für ssh natürlich die 22. Selbsterklärend das -j ACCEPT, um diese Pakete anzunehmen. Auf die gleiche Weiße lassen sich Ports für alle Art von Services freigeben.
Jetzt steht iptables -D INPUT -j DROP
nichts mehr im Wege. Aber ab jetzt Vorsicht mit iptables -F
: Hier werden nur die spezifischen Regeln verworfen (unter anderem die ssh Freigabe), nicht jedoch der Default (DROP).
Ausgehende Paket freigeben und Antworten akzeptieren
Falls ihr nicht ganz genau sagen könnt, welche Art von Pakete euren Server verlassen, dann ist iptables -D OUTPUT -j ACCEPT
ein tragbarer Default. Wichtig ist jedoch, dass Antwortpakete auch akzeptiert werden (wir verwerfen ja eigentlich alle eingehenden Pakete). Dazu gibt es spezielle Regeln, die ein eingehendes Paket auf einem eigentlich gesperrten INPUT Port genau dann erlauben, wenn es ein Antwortpaket ist:
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
Lokalen Traffic erlauben
Viel Software unterhält sich über das lo
Interface untereinander auf dem Server. Hier kann man getrost jeglichen Traffic freigeben:
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables speichern
Die iptables Regeln sind nur so lange aktiv, bis ihr das System neu startet. Ohne extra Anstrengung werden die iptables Regeln nicht gespeichert. Abhilfe schafft apt-get install iptables-persistent
. Nun lässt sich der aktuelle Stand der iptables mit iptables-save > /etc/iptables/rules.v4
sichern. Hat man auch Regeln für IPv6 gesetzt, dann sollte man ip6tables-save > /etc/iptables/rules.v6
nicht vergessen. Diese Regeln werden dann beim Systemstart wieder geladen.
Komplettes Beispiel
# Flush iptables
iptables -F
# Accept input loopback packages
iptables -A INPUT -i lo -j ACCEPT
# Accept output loopback packages
iptables -A OUTPUT -o lo -j ACCEPT
# Allow input traffic for self initialized connections
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# Allow output traffic for self initialized connections
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# Allow incoming SSH on port 22
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# Drop all input packages by default
iptables -P INPUT DROP
# Allow all outgoing packets by default
iptables -P OUTPUT ACCEPT
# Drop all forward packages by default
iptables -P FORWARD DROP
# Install iptables-persistent
apt-get install iptables-persistent
# save iptables
bash -c "iptables-save > /etc/iptables/rules.v4"
bash -c "ip6tables-save > /etc/iptables/rules.v6"
Symbolfoto oben: pixabay.com unter CC0 Linzenz