nftables 簡介
nftables 是 Linux 一組新興起的封包過濾工具,他的目的是要取代大家耳熟能詳的 iptables。那麼到底為何要取代 iptables 呢,而其又有什麼優點呢?
在 Linux 上的防火牆或封包過濾一般都是透過 netfilter 這個 kernel 的功能去實作的,包含 iptables、ebtables、firewalld 等軟體都一樣,而 nftables 當然也是如此,只不過它和其他軟體的不同之處在於:nftables 是直接控制 netfilter,設定上非常貼切 kernel netfilter 的原始格式,也因此可以只用單一工具就控制所有類型的協定。不像 iptables 只能控制 IPv4、想要設定 IPv6 得用 ip6tables、想要控制 bridge 就要用 ebtables。
也因為它是直接控制 netfilter,所以它也可以顯示或控制其他防火牆程式寫在 netfilter 中的表,像是用 iptables 沒辦法檢視 firewalld 到底寫了哪些 rules 在 kernel 中,但 nftables 就可以。
更新:iptables 有兩種版本,一種是基於 xtables 的舊框架 (legacy);另一種則是基於 netfilter 的版本 (nf_tables),只有用 netfilter 的版本 nftables 才看得到 iptables 的規則喔。可以用 iptables -V
來檢視目前用的是哪個版本。
nftables 表的類型
Type | Protocol | Chain Type | ||
---|---|---|---|---|
ip | IPv4 | filter nat route |
||
ip6 | IPv6 | filter nat route |
||
inet | IPv4&IPv6 | filter nat |
||
arp | ARP | filter | ||
bridge | Ethernet | filter | ||
netdev | Any | filter |
藉由定義不同類型的表,可以過濾不同類型的封包。而且若是單純要過濾 port,更可以用 inet 一次兼顧 IPv4 & IPv6,就不需要寫兩次同樣的 rule 了。
結語
以往使用 iptables 的最大問題便是當要修改規則時,因為 docker / wireguard / kubernetes 都共用同一張表,造成他們的 Chain 都一起被洗掉,不得不跟著重啟這些服務。若未來各服務的 rule 都獨立在不同 tables 中,相信可以避免這類問題的發生。
nftables 的功能也相對的較 iptables 強大,光 nft(8) man page 就長達 3425 行,這裡就不詳述使用方式,有興趣的人可以參考以下網址的文件學習。