nftables: Firewall-Einstellungen – Digitaler Schutzschild Teil12

Vorwort

Ich nenne die Serie »digitaler Schutzschild«, weil alle Maßnahmen in der Summe dazu beitragen, die Privatsphäre und auch Sicherheit bestmöglich bzw. meinen Anforderungen entsprechend zu schützen. Die Beiträge werden eher kurz bzw. kompakt sein und gehen nicht zu sehr ins Detail. Das soll dem Informationsgehalt jedoch keinen Abbruch tun.

Digitaler Schutzschild

Seit Einführung von Debian Buster wird als Paketfilter auf nftables gesetzt – iptables wird also abgelöst. Die neue Syntax von nftables ist zunächst gewöhnungsbedürftig – allerdings einfacher zu lesen. Nachfolgend möchte ich mein nftables-Regelset vorstellen:

####################
# Purge/Flush      #
####################
flush ruleset

#########################
# Incoming IPv4-Traffic #
#########################
table ip filter { 	
   chain input { 		
      type filter hook input priority 0; policy drop;

      # Allow packets to established/related connections 
      ct state established,related accept 

      # Drop invalid connections 
      ct state invalid drop     
      
      # Allow loopback interface 		
      iifname lo accept

      # Allow ICMPv4: Ping requests | Error messages | Router selection messages
      ip protocol icmp icmp type { echo-request, echo-reply, destination-unreachable, time-exceeded, parameter-problem, router-solicitation, router-advertisement } accept

      # Reject other packets
      ip protocol tcp reject with tcp reset
   }
#########################
# Forward IPv4-Traffic  #
#########################
   chain forward { 		
      type filter hook forward priority 0; policy drop; 	
   }
#########################
# Outgoing IPv4-Traffic #
#########################
   chain output { 		
      type filter hook output priority 0; policy accept; 
		
      # Allow loopback interface 		
      oifname lo accept	
   }
}

####################
# IPv6             #
####################
table ip6 filter { 	
   chain input { 		
      type filter hook input priority 0; policy drop;
   }
   chain forward { 		
      type filter hook forward priority 0; policy drop; 	
   }
   chain output { 		
      type filter hook output priority 0; policy drop; 	
   }
}

Das Regelset unterscheidet zwischen IPv4 und IPv6. Aus diversen Gründen habe ich auf meinem Rechner IPv6 komplett deaktiviert (nicht zur Nachahmung empfohlen) – und zusätzlich komplett innerhalb nftables blockiert. Wer IPv4 und IPv6 gleich behandeln möchte, der kann das Regelset wie folgt vereinfachen:

####################
# Purge/Flush      #
####################
flush ruleset

####################
# Incoming Traffic #
####################
table inet filter { 	
   chain input { 		
      type filter hook input priority 0; policy drop;

      # Allow packets to established/related connections 
      ct state established,related accept
 
      # Drop invalid connections 
      ct state invalid drop

      # Allow loopback interface 		
      iifname lo accept

      # Allow ICMPv4: Ping requests | Error messages | Router selection messages
      ip protocol icmp icmp type { echo-request, echo-reply, destination-unreachable, time-exceeded, parameter-problem, router-solicitation, router-advertisement } accept
      
      # Allow ICMPv6 traffic (https://tools.ietf.org/html/rfc4890#page-18)
      ip6 nexthdr icmpv6 icmpv6 type { destination-unreachable, packet-too-big, time-exceeded, echo-request, parameter-problem, echo-reply, nd-router-solicit, nd-router-advert, nd-neighbor-solicit, nd-neighbor-advert, ind-neighbor-solicit, ind-neighbor-advert } accept
	
      # Reject other packets
      ip protocol tcp reject with tcp reset
      ip6 nexthdr tcp reject with tcp reset
   }
####################
# Forward Traffic  #
####################
   chain forward { 		
      type filter hook forward priority 0; policy drop; 	
   }
####################
# Outgoing Traffic #
####################
   chain output { 		
      type filter hook output priority 0; policy accept; 
		
      # Allow loopback interface 		
      oifname lo accept	
   }
}

Anbei noch ein paar ausgewählte Befehle für den Praxiseinsatz.

Regelset aus Datei laden:

nft -f <Dateiname>

Aktives Regelset anzeigen lassen:

nft list ruleset

Einzelnen iptables-Befehl in ntftables-Syntax umwandeln:

iptables-translate -A OUTPUT -o lo -j ACCEPT
ip6tables-translate -A OUTPUT -o lo -j ACCEPT

Regelset löschen / zurücksetzen:

nft flush ruleset

Eine schöne Befehlsübersicht findet ihr auch im nftables-Wiki.

Dieser Beitrag ist Teil einer Artikelserie:
Der Kuketz-Blog ist spendenfinanziert! Mitmachen ➡