🐧 Linux Firewalld / iptables / nftables 深度比較與最佳實務
Linux 防火牆技術隨著 Kernel Netfilter 架構多年演進,目前主要存在三種層級與角色:
- iptables — 傳統 Netfilter API,20 年歷史(逐步被取代)
- nftables — 新世代防火牆框架(官方未來方向)
- Firewalld — 管理工具/前端介面(非防火牆本體)
許多使用者容易誤解 Firewalld 與 nftables、iptables 的關係,因此本篇內容會以「架構 → 概念 → 指令 → 實務 → 最佳實務」方式一次講清楚。
🔥 一、三者的核心定位(不要再搞混)
| 名稱 | 層級 | 用途 | 是否建議未來使用 |
|---|---|---|---|
| iptables | Kernel Netfilter API | 傳統封包過濾與 NAT | ❌ 逐步淘汰 |
| nftables | 新一代 Netfilter API | 更高效的防火牆與 NAT 模型 | ✅ 是未來主力 |
| Firewalld | 管理前端(非防火牆) | 以 Zone / Service 管理規則 | ✅ 桌面 / Server 推薦 |
重點:Firewalld 不是 Kernel Firewall,本質上只是「控制後端」的工具。
RHEL8 / CentOS 8 / Rocky 8、RHEL9 開始:
- Firewalld → 預設後端使用 nftables
- iptables → 使用 iptables-nft 模式(已轉譯為 nftables)
因此大多數現代系統即使你輸入 iptables -L,實際上也是由 nftables 接手。
🐧 二、iptables 與 nftables 的架構差異
1. iptables 架構(傳統)
- 基於「四張表 + 五個鏈」
- 大量規則會明顯拖慢效能(線性搜尋)
- IPv4 與 IPv6 需分開管理
- NAT 與 Filter 彼此獨立,維護成本高
2. nftables 架構(新一代)
- 所有功能統一在「table → chain → rule」模型內
- 採用 B-Tree 方式搜尋,大量規則效能遠高於 iptables
- IPv4/IPv6 同時處理(不需 iptables/ip6tables 分開)
- 支援「set / map」高階語法,大幅降低 rule 數量
簡單講:iptables 太老舊,只適合兼容;nftables 才是現代架構。
🧩 三、Firewalld 與 nftables 的關係
Firewalld 本身不是防火牆,而是:
- Zone 管理模型(public、dmz、work …)
- Service 事先定義 port/protocol
- Rich rule 類似 iptables 的語法
- 後端可切換:iptables 或 nftables
RHEL8 之後 Firewalld 80% 以上的部署都使用:
Firewalld → nftables → Kernel Netfilter
因此 Firewalld 最大意義是:
- 簡化管理
- 減少語法錯誤
- 大量使用者不需碰 nftables 原始語法
⚙️ 四、常用指令對照表
1. 查看規則
| iptables | nftables | Firewalld |
|---|---|---|
iptables -L -n -v |
nft list ruleset |
firewall-cmd --list-all |
2. 新增規則
| iptables | nftables | Firewalld |
|---|---|---|
iptables -A INPUT -p tcp --dport 22 -j ACCEPT |
nft add rule inet filter input tcp dport 22 accept |
firewall-cmd --add-service=ssh --permanent |
📘 五、Firewalld 最佳實務(企業 100% 通用)
1. 僅使用 permanent + reload(不要用 runtime-only)
firewall-cmd --add-service=https --permanent
firewall-cmd --reload
2. 如果要寫複雜規則 → 用 rich rule
firewall-cmd --add-rich-rule='rule family=ipv4 source address=10.0.0.0/24 port port=22 protocol=tcp accept'
3. 大型企業環境 → 建議直接寫 nftables policy
理由:- 可讀性更好
- 效能更強
- 支援 set/map 表達式,規則更少
🔧 六、nftables 最佳實務(高階環境建議直接採用)
1. 基礎架構
table inet filter {
chain input {
type filter hook input priority 0;
ct state established,related accept
iif lo accept
ip saddr 192.168.1.0/24 tcp dport { 22, 80, 443 } accept
drop
}
}
2. 使用集合(set)一次處理多 IP
set admin_hosts {
type ipv4_addr;
elements = { 192.168.1.10, 192.168.1.20 }
}
tcp dport 22 ip saddr @admin_hosts accept
3. IPv4/IPv6 同時管理(inet table)
這是 iptables 做不到的,也是 nftables 最大優勢之一。
💡 七、iptables 是否仍需要?
| 情境 | 建議 |
|---|---|
| 舊版系統(CentOS 6/7、Debian 8) | 只能使用 iptables |
| 新版系統(RHEL8+、Debian 12、Ubuntu 22.04) | 改用 nftables(或 Firewalld) |
| 容器(Docker、Kubernetes) | 仍會看到 iptables,但內核可能已經用 nftables |
結論:iptables 不會立即消失,但已被視為 legacy 技術。
🏁 八、建議你該用哪一個?(快速決策)
- 一般 Linux Server → Firewalld
- 企業、客製需求、效能要求 → nftables
- 舊環境 → iptables(無法避免)
若你只有一台伺服器:用 Firewalld 最省時。 若你要做安全審計、SIEM、政治大學資安研究:用 nftables 才是王道。
沒有留言: