20. Januar 2019

Eigene Iptables Regeln als Systemd Service nach Neustart automatisch laden

Eigene Firewall Regeln mit iptables werden nach einem Neustart des Rechners nicht automatisch angewendet. Damit man nicht plötzlich ohne Firewall dasteht, lassen sich die Regeln mit einem Systemd Service neu laden.

Dazu erstellt man eine eigene Systemd Unit, die das automatische Laden der iptables Filterregeln erledigt. So werden die eigenen Firewall Regeln dauerhaft angewendet, ohne dass man sich jedes Mal darum kümmern muss.

 

Eine Firewall mit eigenen iptables Regeln sperrt unerwünschte Verbindungen.
Eine Firewall mit eigenen iptables Regeln sperrt unerwünschte Verbindungen ins Heimnetz.

Systemd Service für das Laden der Firewall erstellen - IPv4

Zuerst hat man sich einige iptables Regeln mit einem Texteditor erstellt. Diese Textdatei wird danach unter /etc/my-iptables.rules gespeichert.

# Beispiel
*filter
-P OUTPUT ACCEPT
-P INPUT DROP
-A INPUT -i lo -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
#...

(Dies nur als Beispiel, nicht als vollständige Firewall - eine Anleitung für eine Firewall mit iptables findet sich im Arch Wiki)

Als nächstes wird mit einem Texteditor eine einfache Systemd Unit erstellt, die das Laden der iptables Regeln übernimmt:

[Unit]
Description = Apply my IPv4 Iptables Rules
Before=network.target

[Service]
Type=oneshot
ExecStart=/bin/sh -c "/sbin/iptables-restore < /etc/my-iptables.rules"

[Install]
WantedBy=multi-user.target

Diese Datei wird nach /etc/systemd/system/my-iptables-rules.service gespeichert.

Der Service muss jetzt noch aktiviert werden:

sudo systemctl start my-iptables-rules.service

sudo systemctl enable my-iptables-rules.service
 
Mit dem 2. Befehl "enable" wird der Dienst nach jedem Neustart auch wieder neu gestartet.
 
Um den Service zu deaktivieren, muss einmal
sudo systemctl disable my-iptables-rules.service

in die Kommandozeile eingegeben werden, und der Rechner neu gestartet werden.

Statusanzeige und Bearbeitung

Den Status kann mit systemctl abgefragt werden:
systemctl status my-iptables-rules.service

Dabei ist es ganz praktisch, dass bei Fehlern gleich die Zeile angegeben wird, in dem der Fehler erscheint. Hat man sich z.B. in Zeile 41 verschrieben, wird es in der Statusabfrage angegeben.

Nach einer Korrektur an den Regeln my-iptables.rules müssen die Dienste neu geladen werden

sudo systemctl daemon-reload

sudo systemctl restart my-iptables-rules.service

 

Bei der Überprüfung des Status wird angezeigt, dass sich in Zeile 41 ein Fehler befindet. Nachdem die Iptables Regeln mit dem Texteditor nano korrigiert wurden, werden die Firewall Regeln mit Erfolg geladen.
Bei der Überprüfung des Status wird angezeigt, dass sich in Zeile 41 ein Fehler befindet. Nachdem die iptables Regeln mit dem Texteditor nano korrigiert wurden, wird die Firewall mit Erfolg geladen.

 

Die Regeln kann man sich mit

sudo iptables -L -v 

anzeigen lassen.

IPv6

Für IPv6 gilt dasselbe. Hierbei werden ip6tables genutzt. Die Regeln werden in eine Textdatei unter /etc/my-ip6tables.rules gespeichert.

Der Systemd Service lautet in dem Fall:

[Unit] 
Description = Apply my IPv6 Iptables Rules
Before=network.target

[Service] 
Type=oneshot ExecStart=/bin/sh -c "/sbin/ip6tables-restore < /etc/my-ip6tables.rules"

[Install]
WantedBy=multi-user.target

Neuen Kommentar schreiben