Wie man pf Firewall und Fail2ban unter FreeBSD 12.0 einrichtet
PF (Packet Filter) ist ein BSD-lizensierter Stateful Packet Filter. Er wurde für OpenBSD entwickelt und ist auf viele BSD-Betriebssysteme portiert worden, darunter auch FreeBSD. Die pf-Firewall filtert den TCP/IP-Verkehr, kann NAT (Network Address Translation) durchführen und bietet Bandbreitenkontrolle und Paketpriorisierung.
Diese Anleitung zeigt dir, wie du die PF-Firewall auf einem FreeBSD 12.0-System einrichtest. Wir werden die PF-Firewall aktivieren, die Grundkonfiguration erstellen und anschließend Fail2ban mit der PF-Firewall installieren und einrichten, um IP-Adressen zu sperren.
Voraussetzung
Für diese Anleitung verwenden wir die neueste Version von FreeBSD 12.0 mit 1 GB RAM und 2 CPUs. Stelle sicher, dass du Root-Rechte auf dem System hast.
Was wir tun werden:
- Aktivieren der pf Firewall
- Grundlegende Konfiguration der pf Firewall
- Fail2ban installieren und konfigurieren
- Fail2ban und pf Firewall einrichten
Schritt 1 – Aktiviere die pf Firewall
Standardmäßig ist das FreeBSD-System mit der pf Firewall integriert. Sie ist in den FreeBSD-Kernel eingebettet, aber der Dienst wird noch nicht auf dem Server ausgeführt.
Die pf-Firewall kann aktiviert werden, indem du die Konfiguration in die Datei „/etc/rc.conf“ einträgst. Führe den folgenden Befehl aus, um die pf-Firewall zu aktivieren.
echo 'pf_enable="YES"' >> /etc/rc.conf echo 'pf_rules="/usr/local/etc/pf.conf"' >> /etc/rc.conf
Aktiviere dann das pf log für das pf firewall log.
echo 'pflog_enable="YES"' >> /etc/rc.conf echo 'pflog_logfile="/var/log/pflog"' >> /etc/rc.conf
Jetzt ist die pf-Firewall unter FreeBSD 12.0 aktiviert, aber wir können die pf-Firewall nicht sofort starten. Denn wir müssen unsere Dienste zu den pf-Regeln hinzufügen.
Schritt 2 – Grundlegende Konfiguration der pf Firewall
In diesem Schritt führen wir eine grundlegende Konfiguration der Pf-Firewall durch. Wir erstellen die Pf-Firewall-Konfiguration, definieren die Dienste und erlauben den Zugriff auf unsere Dienste.
Gehe in das Verzeichnis „/usr/local/etc“ und erstelle eine neue Konfiguration namens „pf.conf“ mit dem Editor vim.
cd /usr/local/etc/ vim pf.conf
Lege nun das externe Interface und die IP-Adresse fest.
# Define External Interface and IP Address ext_if="vtnet0" ext_ip="SERVER-IP-ADDRESS"
Lege die TCP- und UDP-Dienste fest, die du zulassen willst.
# Define TCP and UDP Services ext_tcp_ports="{ ssh, smtp, smtps, imaps, http, https, domain }" ext_udp_ports="{ domain, ntp }"
Vertraue immer auf die lokale Schnittstelle und IP-Adresse.
# Skip the localhost set skip on lo0
Richte die Log-Schnittstelle ein.
# Log interface set loginterface $ext_if
Richte die Standardrichtlinie ein, um alle Verbindungen zum Server zu blockieren und alle ausgehenden Verbindungen vom Server durchzulassen.
# Default Policy block in all pass out all keep state
Erlaube das ICMP-Protokoll, um den Server anzupingen.
# Allow Ping pass inet proto icmp icmp-type echoreq
Erlaube unsere Dienste auf den oben definierten TCP- und UDP-Ports.
# Allow Services and Log pass in proto tcp from any to any port $ext_tcp_ports pass in proto udp from any to any port $ext_udp_ports
Protokolliere jeden Zugriff auf das SSH- und HTTP-Protokoll im pflog.
pass log quick proto tcp from any to any port { ssh,http }
Speichern und schließen.
Unten siehst du die fertige Grundkonfiguration.
# Define External Interface and IP Address ext_if="vtnet0" ext_ip="139.180.220.96" # Define TCP and UDP Services ext_tcp_ports="{ ssh, smtp, smtps, imaps, http, https, domain }" ext_udp_ports="{ domain, ntp }" # Skip the localhost set skip on lo0 # Log interface set loginterface $ext_if # Default Policy block in all pass out all keep state # Allow Ping pass inet proto icmp icmp-type echoreq # Allow Services pass in proto tcp from any to any port $ext_tcp_ports pass in proto tcp from any to any port $ext_udp_ports # Log access for ssh and http pass log quick proto tcp from any to any port { ssh,http }
Überprüfe nun die pf Firewall-Regel, bevor du den Dienst startest, und stelle sicher, dass es keinen Fehler gibt.
service pf check
Starte nun die Dienste pflog und pf mit dem folgenden Befehl.
service pflog start service pf start
Der pf-Dienst wurde gestartet, und deine SSH-Verbindung zum Server wird getrennt. Du kannst dich wieder per SSH mit dem Server verbinden, und zwar über den Port 22, der von der pf-Firewall geöffnet wurde.
Außerdem kannst du die Liste der Pf-Regeln mit der Befehlszeile „pfctl“ (siehe unten) überprüfen.
pfctl -s rules
Du erhältst dann das unten stehende Ergebnis.
Schritt 3 – Fail2ban installieren und konfigurieren
In diesem Schritt installieren wir Fail2ban, aktivieren die Sperrung für den SSH-Dienst und konfigurieren die Fail2ban-Bann-Aktion mit der Pf-Firewall.
Installiere fail2ban mit dem unten stehenden pkg-Befehl.
pkg install py27-fail2ban py27-pyinotify
Sobald die Installation abgeschlossen ist, gehst du in das Verzeichnis „/usr/local/etc/fail2ban“ und erstellst eine neue Jail für den SSH-Dienst im Verzeichnis „jail.d“.
cd /usr/local/etc/fail2ban vim jail.d/sshd-pf.conf
Füge die unten stehende Konfiguration ein.
[ssh] enabled = true filter = sshd action = pf logpath = /var/log/auth.log findtime = 600 maxretry = 3 bantime = 3600
Speichere und schließe.
Als Nächstes erstellst du eine Sicherungskopie der Standardkonfiguration der pf-Aktion im Verzeichnis „action.d“ und erstellst eine neue.
mv action.d/pf.conf action.d/pf.conf.orig vim action.d/pf.conf
Füge die folgende Konfiguration ein.
[Definition] actionstart = actionstop = actioncheck = actionban = /sbin/pfctl -t <tablename> -T add <ip>/32 actionunban = /sbin/pfctl -t <tablename> -T delete <ip>/32 [Init] tablename = fail2ban
Speichere und schließe.
Füge nun den fail2ban-Dienst zum Systemstart hinzu.
sysrc fail2ban_enable=yes
Starte den Dienst und überprüfe seinen Status.
service fail2ban start service fail2ban status
Der fail2ban-Dienst läuft unter FreeBSD 12.0 mit der pf-Firewall als Ban-Action.
Schritt 4 – Fail2ban und pf Firewall einrichten
Um die Ban-Aktion für Fail2ban mit der pf-Firewall zu aktivieren, müssen wir die Block-Zusatzkonfiguration zur pf-Konfiguration „pf.conf“ hinzufügen.
Gehe in das Verzeichnis „/usr/local/etc“ und bearbeite die Datei „pf.conf“.
cd /usr/local/etc/ vim pf.onf
Füge die folgende Konfiguration am Ende der Zeile ein.
# Fail2Ban table <fail2ban> persist block quick proto tcp from <fail2ban> to $ext_if port ssh
Speichere und schließe.
Lade nun die Firewall-Konfiguration neu
service pf reload
Damit ist die Konfiguration der pf-Firewall und von fail2ban abgeschlossen. Alle IP-Adressen, die von fail2ban abgefangen werden, werden von der pf-Firewall gesperrt.
Schritt 5 – Zusätzlich
Nachfolgend findest du einige Befehle, die du zur Verwaltung der pf firewall verwenden kannst.
Überprüfen des Status der pf firewall
service pf status
Zeige pf firewall Regeln
pfctl -s rules pfctl -v -s rules
Status der Verbindung zum pf Interface anzeigen
pfctl -s state
Blockierte IP-Adressen in der ‚fail2ban‘-Tabelle anzeigen
pfctl -t fail2ban -T show
Anzeigen der pflog-Datei mit tcpdump
tcpdump -n -e -ttt -r /var/log/pflog