nftables

nftables er en brannmur for linux hvor du kan definere regler via en konfigurasjonsfil eller CLI.

Installasjon

Kan installeres fra distroens repoer vanligvis, men de er ikke alltid oppdatert, så en kan heller kompilere dem manuelt fra nettsiden deres for de nyeste versjonene. nftables krever også libnftnl og libmnl, og diverse andre devel-filer (som ofte kan installeres via distroens pakkesystem).

Linker for nedlasting
nftables
libnftnl
libmnl

Denne fremgangsmåten kan brukes på alle tre:

wget https://www.netfilter.org/pub/nftables/nftables-1.1.0.tar.xz
tar -xvf nftables-1.1.0.tar.xz
cd nftables-1.1.0

# hvis kun configure.ac og ikke configure finnes, kjør 
# autoreconf -fi først for å generere make filer
# for nftables er disse flaggene bra:
# ./configure --disable-man-doc --disable-debug --with-json
./configure

make -j12
make install

Funksjon

Trafikk i nftables flyter i denne rekkefølgen:
ingress → prerouting → input/forward → output → postrouting

Ingress - tidlig filtrering av pakker
Kjører så fort en ny pakke ankommer maskinen/interfacet. Kan for eksempel brukes til å blokkere eller akseptere trafikk fra en spesifikk IP-addresse.

Prerouting - før videresending
Kjører før noen routing regler. Kan for eksempel brukes til å videresend port fra en port til en annen, eller videresende traffik til en annen maskin på nettverket

Input - trafikk for lokal maskin
Brukes til å lage regler for pakker for hva som skal skje på den lokale maskinen, som kan for eksempel være å akseptere SSH og HTTPS.

Forward - videresending av traffikk
Brukes til å videresende trafikk til for eksempel docker eller vpn tjenester

Output - pakker som er generert på den lokale maskinen
For eksempel nginx som sender ut en request

Postrouting - hva som skal skje før trafikken forlater maskinen
Skjer enten ved forward -> postrouting eller output -> postrouting.

Konfigurering

Man kan lage så mange table ip .. { } man vil, som inneholder de spesifikke chain metodene over.

Nedenfor er et eksempel på konfigurasjon av nftables med /etc/nftables.conf.

#!/usr/sbin/nft -f

# clear alle regler før nye blir lastet inn
flush ruleset

# regler for ip (ipv4 (ip) og ipv6 (ip6), inet = begge)
table ip filter_custom {

    # kommunikasjon inn
    chain input {

        # chain filter, hook til input, pri 0 (ned til -100), default drop
        type filter hook input priority 0
        policy drop

        # aksepter etablished,related pakker, new aksepteres på portene under
        ct state established,related accept

        # loopback traffic
        iifname lo accept

        # tillatt traffikk på port 80-http og 3306-mysql fra vpn og 192.168.10.155
        ip saddr { 10.0.0.0/24, 192.168.10.155 } tcp dport { 80, 3306 } accept

        # aksepter new tcp/udp pakker
        # tcp 139: samba server
        # tcp 443: https
        # tcp 445: samba server
        # tcp 22: ssh
        # udp 137: netbios-ns
        # udp 138: samba client
        # udp 443: http3
        ct state new tcp dport { 22, 139, 443, 445 } accept
        ct state new udp dport { 137, 138, 443 } accept

    }

    # kommunikasjon mellom interfacer (docker/wireguard/internet)
    chain forward {

        # chain filter, hook til forward, pri 0, default accept (for at docker/wg sk>
        type filter hook forward priority 0
        policy accept

        # kommunikasjon begge veier eth0/docker0
        # kun hvis docker skal nås eksternt
        # ikke nødvendig hvis det går igjennom for eksempel nginx (lokalt)
        # iifname "eth0" oifname "docker0" accept
        # iifname "docker0" oifname "eth0" accept

        # kommunikasjon begge veier eth0/wg0
        iifname "eth0" oifname "wg0" accept
        iifname "wg0" oifname "eth0" accept

    }

    # kommunikasjon ut
    chain output {

        # chain filter, hook til output, pri 0, default accept
        type filter hook output priority 0
        policy accept

    }

}

# regler for NAT/masquerading (bruk public IP istedenfor lokal)
table ip nat_custom {

    chain postrouting {

        # chain nat, hook til postrouting, pri 100, default accept
        type nat hook postrouting priority 100
        policy accept

        # Masquerade kommunikasjon som forlater eth0 fra wireguard
        oifname "eth0" ip saddr 10.0.0.0/24 masquerade

    }

}

nft list ruleset
nft flush ruleset
nft -f /etc/nftables.conf