最後更新日期: 2025 年 4 月 26 日
引言:為什麼需要了解nftables?
在數位時代,網路安全已成為每個企業、組織甚至個人用戶不可忽視的議題。隨著網路攻擊手段日益複雜,傳統的防火牆技術逐漸顯得力不從心。作為Linux系統中最新一代的防火牆框架,nftables以其高效、靈活和強大的功能,成為保護網路安全的理想選擇。本文將深入淺出地介紹nftables的背景、核心功能、實際應用場景以及如何入門使用,帶您一窺這款現代防火牆的魅力。
無論您是系統管理員、網路工程師,還是對網路安全感興趣的愛好者,這篇文章將幫助您快速掌握nftables的精髓,並了解如何利用它來打造一個更安全的網路環境。
第一章:什麼是nftables?
1.1 nftables的誕生背景
nftables是Linux核心中的新一代防火牆框架,於2014年正式進入Linux Kernel 3.13,旨在取代老舊的iptables。iptables雖然功能強大,但隨著網路技術的發展,其設計上的局限性逐漸暴露,例如規則處理效率低、語法複雜、以及對新協議支援不足等問題。
nftables的開發由Netfilter項目團隊主導,目標是提供一個更高效、更靈活且易於維護的防火牆解決方案。與iptables不同,nftables採用了一種全新的設計理念,將多個子系統(如iptables、ip6tables、arptables和ebtables)統一到一個框架中,極大簡化了管理流程。
1.2 nftables的核心優勢
nftables相較於iptables的優勢可以總結為以下幾點:
- 高效能:nftables使用內核級的虛擬機(Netfilter Virtual Machine)來處理數據包,減少了規則匹配的開銷,提升了性能。
- 靈活性:支援動態規則更新,允許在不重啟防火牆的情況下修改規則,適合高可用性場景。
- 統一框架:將IPv4、IPv6、ARP和橋接等協議的過濾功能整合到單一工具中,減少學習成本。
- 簡潔語法:nftables的語法更直觀,支援腳本化操作,便於自動化管理。
- 可擴展性:支援自定義數據結構(如映射和集合),方便處理複雜的網路策略。
這些優勢使得nftables不僅適用於個人伺服器,也能滿足企業級網路環境的需求。
第二章:nftables的核心概念
要理解nftables的運作方式,必須先熟悉其幾個核心概念:表(Tables)、鏈(Chains)、規則(Rules)、集合(Sets)和映射(Maps)。這些概念是nftables的基石,類似防火牆的「建築模塊」,每個模塊都有其獨特功能,共同構成一個靈活且強大的防火牆系統。
2.1 表(Tables)
定義與功能
表是nftables中的頂層結構,相當於一個「命名空間」,用於組織和管理所有的防火牆規則。每個表可以包含多個鏈(Chains),並與特定的協議族相關聯,例如:
- inet:同時支援IPv4和IPv6。
- ip:僅支援IPv4。
- ip6:僅支援IPv6。
- bridge:用於橋接網路。
- arp:用於處理ARP協議。
表的設計允許用戶根據需求創建多個獨立的規則集,互不干擾。例如,您可以為Web伺服器創建一個表,為資料庫伺服器創建另一個表,各自管理不同的規則。
實際應用
表的靈活性使其適合分層管理。例如,在企業環境中,您可能需要為不同部門的伺服器設置獨立的防火牆策略,這時可以為每個部門創建一個表,確保規則清晰且易於維護。
範例
創建一個名為my_table
的表,適用於IPv4和IPv6協議:
nft add table inet my_table
此命令創建了一個空的表,後續可以在其中添加鏈和規則。
注意事項
- 表的名稱必須唯一,且應避免使用過長或複雜的名稱。
- 刪除表時,表內的所有鏈和規則也會一併刪除,需謹慎操作。
2.2 鏈(Chains)
定義與功能
鏈是表的子結構,用於存放一組規則。鏈類似於iptables中的INPUT、FORWARD、OUTPUT等概念,但nftables的鏈更加靈活,支援兩種類型:
- 基礎鏈(Base Chains):與特定的內核鉤子(Hook)關聯,直接處理網路數據包。常見的鉤子包括:
- input:處理發往本機的數據包。
- output:處理本機發出的數據包。
- forward:處理轉發的數據包。
- prerouting:處理進入本機前的數據包。
- postrouting:處理即將離開本機的數據包。
- 普通鏈(Regular Chains):不與鉤子直接關聯,類似於子程序,供基礎鏈或其他普通鏈調用,用於組織複雜的規則邏輯。
每個鏈都有自己的優先級(Priority)和默認策略(Policy),例如接受(accept)或丟棄(drop)。
實際應用
基礎鏈適用於直接過濾網路流量,例如限制伺服器的輸入流量;普通鏈則適用於模組化管理,例如將一組規則封裝為一個普通鏈,供多個基礎鏈重複調用,從而簡化配置。
範例
創建一個輸入基礎鏈,默認策略為丟棄:
nft add chain inet my_table input { type filter hook input priority 0 \; policy drop \; }
此命令創建了一個名為input
的基礎鏈,處理所有發往本機的數據包,未匹配任何規則的數據包將被丟棄。
注意事項
- 基礎鏈必須指定鉤子和類型(如filter、nat等),普通鏈則無需。
- 優先級決定鏈的執行順序,數值越小越先執行。
2.3 規則(Rules)
定義與功能
規則是nftables的核心執行單元,定義了如何處理特定的數據包。每條規則包含:
- 匹配條件:例如來源IP、目標端口、協議類型等。
- 動作:決定匹配數據包的處理方式,例如接受、丟棄、記錄等。
規則的設計極其靈活,支援多種匹配方式,包括:
- 基本匹配:如IP地址、端口、協議。
- 高級匹配:如連接狀態(ct state)、數據包頭字段。
- 集合匹配:匹配一組IP或端口(詳見2.4節)。
動作詳解
動作是規則的「執行部分」,決定匹配數據包的命運。nftables提供了豐富的動作選項,涵蓋過濾、修改、記錄和重定向等多種場景。以下是常見動作的詳細介紹:
- 接受(accept):
- 功能:允許數據包通過,繼續後續處理或傳輸。
- 應用場景:用於允許特定的合法流量,例如允許SSH或HTTP服務的訪問。
- 範例:
nft add rule inet my_table input tcp dport 22 accept
此規則允許目標端口為22(SSH)的TCP數據包通過。
- 丟棄(drop):
- 功能:無聲丟棄數據包,不發送任何回應。
- 應用場景:用於阻止不需要的流量,例如來自黑名單IP的訪問。丟棄動作比拒絕(reject)更隱蔽,因為它不會通知發送方。
- 範例:
nft add rule inet my_table input ip saddr 192.168.1.100 drop
此規則丟棄來自192.168.1.100的數據包。
- 拒絕(reject):
- 功能:丟棄數據包並向發送方返回錯誤訊息(如ICMP不可達)。
- 應用場景:用於明確拒絕某些流量,例如告知客戶端某端口不可用。需指定拒絕類型(如
with icmp type port-unreachable
)。 - 範例:
nft add rule inet my_table input tcp dport 23 reject with icmp type port-unreachable
此規則拒絕目標端口為23(Telnet)的TCP數據包,並返回ICMP端口不可達訊息。
- 跳轉(jump):
- 功能:將數據包的處理轉交給指定的普通鏈。
- 應用場景:用於模組化管理,將複雜規則拆分到多個鏈中。例如,將所有TCP流量跳轉到專門的鏈進行進一步檢查。
- 範例:
nft add chain inet my_table tcp_chain nft add rule inet my_table input tcp jump tcp_chain
此規則將所有TCP數據包跳轉到名為
tcp_chain
的普通鏈進行處理。
- 返回(return):
- 功能:從當前鏈返回到調用它的上一層鏈,繼續執行後續規則。
- 應用場景:用於在普通鏈中提前終止處理,回到基礎鏈。例如,在檢查某些條件後決定不再執行當前鏈的後續規則。
- 範例:
nft add rule inet my_table tcp_chain tcp dport 80 return
此規則在
tcp_chain
中匹配到端口80的TCP數據包後返回到上一層鏈。
- 記錄(log):
- 功能:記錄數據包的相關資訊(如來源IP、端口)到日誌,常用於調試或監控。
- 應用場景:用於追蹤異常流量或審計防火牆行為。支援自定義日誌前綴和級別。
- 範例:
nft add rule inet my_table input log prefix "[NFTABLES_DROP] " drop
此規則記錄所有被丟棄的數據包,添加前綴“[NFTABLES_DROP]”,並將日誌寫入系統日誌。
- 計數(counter):
- 功能:統計匹配數據包的數量和流量大小。
- 應用場景:用於監控特定流量的使用情況,例如統計某端口的訪問次數。
- 範例:
nft add rule inet my_table input tcp dport 443 counter accept
此規則允許HTTPS流量並記錄匹配的數據包數量。
- 地址轉換(dnat/snat):
- 功能:
- dnat(目標地址轉換):修改數據包的目標地址和端口,常用於負載均衡或端口轉發。
- snat(來源地址轉換):修改數據包的來源地址,常用於NAT或偽裝(masquerade)。
- 應用場景:用於將外部流量重定向到內部伺服器,或隱藏內部網路的真實IP。
- 範例:
nft add rule inet my_table prerouting ip daddr 192.168.1.100 tcp dport 80 dnat to 10.0.0.1:8080
此規則將發往192.168.1.100:80的流量重定向到10.0.0.1:8080。
- 功能:
- 限制(limit):
- 功能:限制數據包的處理頻率,防止過載。
- 應用場景:用於緩解DDoS攻擊或限制特定服務的訪問頻率。
- 範例:
nft add rule inet my_table input tcp dport 22 limit rate 5/minute accept
此規則限制SSH連接每分鐘最多5次,超出限制的數據包將被丟棄。
- 隊列(queue):
- 功能:將數據包發送到用戶空間的應用程式進行處理。
- 應用場景:用於進階流量分析或與外部工具(如IDS/IPS系統)整合。
- 範例:
nft add rule inet my_table input queue
此規則將匹配的數據包發送到用戶空間處理。
實際應用
規則的動作可用於實現多種防火牆功能,例如:
- 允許特定服務(如SSH、HTTP)的流量。
- 阻止來自特定IP的惡意訪問。
- 將流量重定向到其他設備。
- 記錄異常流量以便後續分析。
注意事項
- 規則的順序至關重要,nftables按順序逐條匹配,匹配到的第一條規則將決定數據包的命運。
- 動作可能會影響性能,例如過多的日誌記錄或計數可能增加系統負載。
- 某些動作(如dnat、snat)需要在特定的鉤子(如prerouting、postrouting)中使用。
2.4 集合(Sets)和映射(Maps)
定義與功能
集合和映射是nftables的創新功能,極大提升了其靈活性和效率:
- 集合(Sets):
- 用於儲存一組元素,例如IP地址、端口、MAC地址等。
- 支援動態更新,無需重載規則即可添加或刪除元素。
- 支援高效的批量匹配,例如檢查數據包的來源IP是否在某個黑名單中。
- 可設置超時(timeout),元素在指定時間後自動移除。
- 映射(Maps):
- 將鍵值對映射到特定動作,例如將來源IP映射到目標地址。
- 適用於動態分發流量,如負載均衡或NAT(網路地址轉換)。
集合和映射的優勢在於,它們將數據儲存在內核中,匹配效率遠高於逐條規則檢查。
實際應用
- 集合:用於黑名單或白名單管理。例如,動態封鎖頻繁發送請求的IP。
- 映射:用於負載均衡或流量重定向。例如,將訪問某個公共IP的流量分發到多個後端伺服器。
範例
- 創建一個IP黑名單集合並阻止匹配的流量:
nft add set inet my_table blocklist { type ipv4_addr \; flags timeout \; } nft add rule inet my_table input ip saddr @blocklist drop nft add element inet my_table blocklist { 192.168.1.100 timeout 60s }
此規則創建一個名為
blocklist
的集合,阻止來自192.168.1.100的流量,該IP將在60秒後自動從集合中移除。 - 創建一個映射實現簡單負載均衡:
nft add map inet my_table lb_map { type ipv4_addr : ipv4_addr \; } nft add element inet my_table lb_map { 192.168.1.100 : 10.0.0.1, 192.168.1.101 : 10.0.0.2 } nft add rule inet my_table forward ip daddr 192.168.1.100-192.168.1.101 dnat to @lb_map
此規則將目標地址為192.168.1.100或192.168.1.101的流量分發到後端伺服器10.0.0.1或10.0.0.2。
注意事項
- 集合和映射的名稱在表內必須唯一。
- 動態更新集合時,需確保元素類型與集合定義一致。
第三章:nftables的實際應用場景
nftables的靈活性使其適用於多種場景,以下是一些常見的應用案例:
3.1 基本防火牆設置
對於小型伺服器,nftables可用於設置基本的防火牆規則。例如,允許SSH(22端口)訪問,阻止其他未授權的連接:
nft add table inet my_table
nft add chain inet my_table input { type filter hook input priority 0 \; policy drop \; }
nft add rule inet my_table input tcp dport 22 accept
nft add rule inet my_table input ct state established,related accept
這段腳本創建了一個名為my_table
的表,定義了一個輸入鏈,僅允許SSH流量和已建立的連接通過,其他數據包一律丟棄。
3.2 防止DDoS攻擊
nftables支援動態集合,可以用於限制特定IP的連接頻率,從而緩解DDoS攻擊。例如:
nft add set inet my_table blocklist { type ipv4_addr \; flags timeout \; }
nft add rule inet my_table input ip saddr @blocklist drop
nft add rule inet my_table input limit rate 10/second ip saddr timeout 60s add @blocklist
這段規則限制每個IP每秒最多10次連接,超過限制的IP將被加入黑名單並阻止訪問。
3.3 負載均衡
通過映射功能,nftables可以實現簡單的負載均衡。例如,將流量分發到多個後端伺服器:
nft add map inet my_table lb_map { type ipv4_addr : ipv4_addr \; }
nft add element inet my_table lb_map { 192.168.1.100 : 10.0.0.1, 192.168.1.101 : 10.0.0.2 }
nft add rule inet my_table forward ip daddr 192.168.1.100-192.168.1.101 dnat to @lb_map
這段規則將目標地址為192.168.1.100或192.168.1.101的流量分發到後端伺服器10.0.0.1或10.0.0.2。
3.4 日誌記錄與監控
nftables支援數據包日誌記錄,方便監控異常流量。例如:
nft add rule inet my_table input log prefix "[NFTABLES_DROP] " drop
這條規則記錄所有被丟棄的數據包,並添加前綴“[NFTABLES_DROP]”以便後續分析。
第四章:如何開始使用nftables?
4.1 安裝與環境準備
大多數現代Linux發行版(如Ubuntu 20.04+、Debian 10+、CentOS 8+)已預裝nftables。若未安裝,可使用以下命令安裝:
# Ubuntu/Debian
sudo apt update
sudo apt install nftables
# CentOS/RHEL
sudo yum install nftables
安裝完成後,啟動nftables服務:
sudo systemctl enable nftables
sudo systemctl start nftables
4.2 編寫第一個nftables腳本
假設您需要設置一個簡單的防火牆,允許HTTP(80端口)和HTTPS(443端口)流量,阻止其他流量。以下是一個示例腳本:
#!/usr/sbin/nft -f
# 清空現有規則
flush ruleset
# 創建表
table inet my_table {
# 定義輸入鏈
chain input {
type filter hook input priority 0; policy drop;
# 允許已建立的連接
ct state established,related accept
# 允許本地回環
iif lo accept
# 允許HTTP和HTTPS
tcp dport { 80, 443 } accept
# 記錄並丟棄其他流量
log prefix "[NFTABLES_DROP] " drop
}
# 定義轉發鏈
chain forward {
type filter hook forward priority 0; policy drop;
}
# 定義輸出鏈
chain output {
type filter hook output priority 0; policy accept;
}
}
將上述內容保存為firewall.nft
,然後執行:
sudo nft -f firewall.nft
4.3 持久化配置
為了確保重啟後規則仍然生效,需將規則保存到配置文件中。例如,在Ubuntu上:
sudo nft list ruleset > /etc/nftables.conf
然後確保nftables服務隨系統啟動:
sudo systemctl enable nftables
4.4 常見命令速查
以下是nftables常用命令:
- 查看當前規則:
nft list ruleset
- 清空規則:
nft flush ruleset
- 添加規則:
nft add rule <table> <chain> <條件> <動作>
- 刪除表:
nft delete table <table_name>
第五章:nftables與iptables的比較
雖然nftables是iptables的繼任者,但許多系統管理員仍在使用iptables。以下是兩者的對比:
特性 | nftables | iptables |
---|---|---|
性能 | 高效,內核虛擬機加速 | 較慢,逐條匹配規則 |
語法 | 簡潔,支援腳本化 | 複雜,命令式語法 |
協議支援 | 統一支援IPv4、IPv6、橋接等 | 分別使用iptables、ip6tables等 |
動態更新 | 支援動態規則更新 | 需要重載全部規則 |
擴展性 | 支援集合、映射等高級功能 | 功能較為基礎 |
對於新項目,推薦直接使用nftables;對於已有iptables配置,可以使用iptables-nft
工具進行兼容性轉換。
第六章:進階功能與未來發展
6.1 進階功能
nftables的進階功能包括:
- 流量整形:結合
tc
工具實現帶寬限制。 - 狀態機匹配:使用連接跟踪(conntrack)進行精細化控制。
- 模組化設計:支援外部模組擴展,適應未來協議。
6.2 nftables的未來
隨著5G、IoT和雲原生技術的普及,nftables的靈活性使其在邊緣計算、容器網路(如Kubernetes)和SDN(軟體定義網路)中有廣闊的應用前景。Netfilter團隊也在持續優化nftables,未來可能新增更多功能,如AI驅動的異常檢測。
結語:為什麼選擇nftables?
nftables不僅是iptables的升級版,更是Linux防火牆技術的一次革命。其高效的性能、簡潔的語法和強大的擴展性,讓它成為現代網路安全的首選工具。無論您是想保護個人伺服器,還是構建企業級防火牆,nftables都能提供靈活且可靠的解決方案。
現在就開始探索nftables吧!通過簡單的學習和實踐,您將能輕鬆構建一個高效、安全的網路環境。立即動手,體驗下一代防火牆的無限可能!