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