Einrichten eines neuen Hetzner-Servers – Firewall

Vor langer, langer Zeit veröffentlichte Oskar Andreasson sein IPTables Tutorial. Ich würde es gerne verlinken, es ist aber offensichtlich nur noch bei fragwürdigen Quellen zu finden, die unangemessen viele Nutzerdaten verlangen. So gut dieses Tutorial war (und ist – die Grundlagen werden dort sehr gut erklärt), es ist aus der Mode gekommen. IPTables kann durch nftables oder firewalld ersetzt werden, und manches, wofür früher selbst geschriebene Chains nötig waren, ist jetzt als einfacher Befehl vorimplementiert.

Ich benutze nftables. Und zum jetzigen Zeitpunkt – der Server hat SSH als einzigen Dienst – ist die Konfiguration denkbar einfach. Im Wiki von nftables gibt es ein schönes Flussdiagramm, das zeigt, welcher Hook wofür genutzt wird. Wir werden allen lokalen Quellen erlauben, ins Internet zu verbinden, der Output Hook wird also hauptsächlich die Aufgabe haben, alle Pakete durchzulassen. Den Forward Hook brauchen wir erst, wenn wir den Server als Außenpunkt eines VPN konfigurieren. Die Hauptarbeit wird also auf dem Input Hook liegen; alle anderen Hooks haben im Moment mit uns nichts zu tun.

Die generelle Policy: drop. Jedes Paket, das nicht ausdrücklich angenommen wird, wird kommentarlos weggeworfen. Das heißt: ein Fehler, und wir haben uns ausgesperrt. Also sorgfältig arbeiten, zuerst policy accept anwenden und die counter sorgfältig beobachten (nft list ruleset). Erst wenn alles stimmt, auf policy drop wechseln.

Zunächst werfen wir alle einkommenden Pakete weg, die nur so machen, als ob sie zu einer bestehenden Verbindung gehörten, ohne dass es diese Verbindung gibt. Pakete zu bestehenden oder verwandten Verbindungen (manche Protokolle wie z.B. FTP benutzen mehr als eine Verbindung) werden akzeptiert. Verbindungen vom eigenen loopback-Inferface werden akzeptiert. Verbindungen von außen zum Loopback-Inferface werden weggeworfen. ICMP ist für das Funktionieren des Internets notwendig. Ja, da können auch Informationen über einen Rechner beschafft werden. Z.B. dass es ihn gibt, welche IPs er hat und welche Ports offen sind. Ohne diese Infos sind Dienste auf einem Server nicht erreichbar, und wer die IP seines Servers nicht preisgeben will, hat das Internet nicht verstanden und sollte keinen Server betreiben. Punkt. Ansonsten lassen wir noch einkommende Verbindungen auf dem SSH-Port zu (Achtung, das ist nicht der Standardport, sondern der, den wir in einer vorigen Folge eingestellt hatten), und das auch nur, wenn die IP-Adresse passt. Fertig.

#!/usr/sbin/nft -f

flush ruleset

table inet filter {
   chain input {
      type filter hook input priority 0; policy drop;
     ct state invalid counter drop comment „early drop of invalid packets“
      ct state {established, related} counter accept comment „accept all connections related to connections made by us“
      iif lo accept comment „accept loopback“
      iif != lo ip daddr 127.0.0.1/8 counter drop comment „drop ipv4 connections to loopback not coming from loopback“
      iif != lo ip6 daddr ::1/128 counter drop comment „drop ipv6 connections to loopback not coming from loopback“
      ip protocol icmp counter accept comment „accept all ICMP4 types“
      ip6 nexthdr icmpv6 counter accept comment „accept all ICMP6 types“
      ip daddr 65.21.136.15 tcp dport 6922 counter accept comment „accept SSH4“
      ip6 daddr 2a01:4f9:3b:25b0:9:6:1:101 tcp dport 6922 counter accept comment „accept SSH6“
counter comment „count dropped packets“
   }

   chain forward {
     type filter hook forward priority 0; policy drop;
     counter comment „count dropped packets“
   }

   # If you’re not counting packets, this chain can be omitted.
   chain output {
     type filter hook output priority 0; policy accept;
counter comment „count accepted packets“
   }
}

Dieses Regelset werden wir bei jeder Erweiterung des Servers um einen zusätzlichen Dienst anpassen müssen. Die Standardinstallation von Ubuntu erwartet das nftables-Script unter /etc/nftables.conf, es wird mit systemctl enable nftables.service für den Autostart registriert und mit service nftables start gestartet.

 

 

Schreibe einen Kommentar

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.