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