decramy.net

Webstek van Tjerk Jan


Overgesptapt naar nftables

Na sysvinit vervangen is door systemd is het nu ook de tijd aan iptables om een opvolger te krijgen: nftables. Ik heb tot nu toe altijd ferm gebruikt om mijn ruleset iets meer "sugar" te geven. En wat MaxKellerman zelf ook al schrijft; de toegevoegde waarde van ferm om regels eenvoudiger weer te geven vervalt bij de nieuwkomer omdat het reeds ingebouwd is. Men heeft bij de ontwikkeling van nftables dus gekeken naar hoe rulesets beter beschreven kunnen worden dan losse commando's middels nesting etc.

Op de wikipagina van Debian over nftables geeft men aan dat je vooral firewalld moet gebruiken. Nu heb ik daar even naar gekeken en ik vind het maar niks. Ik houd ervan om mijn ruleset in configuratiefiles vast te leggen (zoals ik dat bij ferm heb gedaan) en niet over te moeten stappen op losse commando's. In een eerdere discussie op IRC gaf ewoud aan zelf in nftables.conf te schrijven. Dat lijkt veel meer op de manier die ik prefereer. Maar de Debian-standaard is redelijk... leeg.

Bij deze dus een paar snippets hoe ik mijn nftables-ruleset heb gebouwd. Ik heb letterlijk de regels die ik had omgezet: een basisconfiguratie die wat initiatie doet (en mezelf niet buiten sluit), met een include van een directory. In de directory heb ik wat losse bestanden staan specifiek voor de 'rol'.

De basisconfiguratie in /etc/nftables.conf:

#!/usr/sbin/nft -f

flush ruleset

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

        # connection tracking
        ct state invalid drop
        ct state {established, related} accept

        # allow local packet
        iiface lo accept

        # respond to ping
        ip protocol icmp counter accept

        # allow SSH connections
        tcp dport 22 counter accept
    }
    chain output {
        type filter hook output priority 0; policy accept;

        # connection tracking
        ct state invalid drop
        ct state {established, related} accept
    }
    chain forward {
        type filter hook forward priority 0; policy drop;

        # connection tracking
        ct state invalid drop
        ct state {established, related} accept
    }
}



# include all files in a given directory using an absolute path
include "/etc/nftables/*.nft"

Het bestand wat ervoor zorgt dat mijn LAN het internet op kan /etc/nftables/lan.nft:

#!/sbin/nft -f

define LAN = {192.168.0.0/24, 2a02::/64}


# Allow LAN (ipv4 & ipv6) to be forwarded
table inet filter chain forward saddr $LAN accept

# and masquerade ipv4
table ip nat {
        chain postrouting {
                type nat hook postrouting priority 100; policy accept;
                saddr $LAN masquerade
        }
}

En de diensten die op de machine zelf staan beschikbaar maken /etc/nftables/local.conf:

#!/sbin/nft -f

table inet filter chain input {
        tcp dport ssh accept

        tcp dport {http, https, 8080, 8443} accept
}

Wat mij nog rest is mijn docker-configuratie omzetten in nftables. Ik heb bovenstaande nog niet getest, maar ik zal e.e.a. bijwerken als dat wel is gedaan.

Referenties:

  • https://wiki.nftables.org/wiki-nftables/index.php/Scripting over hoe includes werken
  • https://wiki.gentoo.org/wiki/Nftables/Examples simpele voorbeelden
  • https://wiki.nftables.org/wiki-nftables/index.php/Main_Page#Examples Nog meer voorbeelden
  • https://thermalcircle.de/doku.php?id=blog:linux:nftables_packet_flow_netfilter_hooks_detail
Huh?
Persoonlijke webstek op het internet van Tjerk Jan. De site is begonnen om mijn documentatie-behoefte een plekje te geven en in plaats van een afgeschermde wiki ben ik de boel maar op het publieke internet gaan zetten. Ik houd me naast mijn werk bezig met mijn (klus-)huis, welke ik zo veel als mogelijk computergestuurd maak. Hobbymatig ook een server in een datacenter hangen waar mail en ander klein prul draait.