探索nftables 打造高效安全的新一代Linux防火牆

最後更新日期: 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的優勢可以總結為以下幾點:

  1. 高效能:nftables使用內核級的虛擬機(Netfilter Virtual Machine)來處理數據包,減少了規則匹配的開銷,提升了性能。
  2. 靈活性:支援動態規則更新,允許在不重啟防火牆的情況下修改規則,適合高可用性場景。
  3. 統一框架:將IPv4、IPv6、ARP和橋接等協議的過濾功能整合到單一工具中,減少學習成本。
  4. 簡潔語法:nftables的語法更直觀,支援腳本化操作,便於自動化管理。
  5. 可擴展性:支援自定義數據結構(如映射和集合),方便處理複雜的網路策略。

這些優勢使得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的鏈更加靈活,支援兩種類型:

  1. 基礎鏈(Base Chains):與特定的內核鉤子(Hook)關聯,直接處理網路數據包。常見的鉤子包括:
    • input:處理發往本機的數據包。
    • output:處理本機發出的數據包。
    • forward:處理轉發的數據包。
    • prerouting:處理進入本機前的數據包。
    • postrouting:處理即將離開本機的數據包。
  2. 普通鏈(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提供了豐富的動作選項,涵蓋過濾、修改、記錄和重定向等多種場景。以下是常見動作的詳細介紹:

  1. 接受(accept)
    • 功能:允許數據包通過,繼續後續處理或傳輸。
    • 應用場景:用於允許特定的合法流量,例如允許SSH或HTTP服務的訪問。
    • 範例
      nft add rule inet my_table input tcp dport 22 accept

      此規則允許目標端口為22(SSH)的TCP數據包通過。

  2. 丟棄(drop)
    • 功能:無聲丟棄數據包,不發送任何回應。
    • 應用場景:用於阻止不需要的流量,例如來自黑名單IP的訪問。丟棄動作比拒絕(reject)更隱蔽,因為它不會通知發送方。
    • 範例
      nft add rule inet my_table input ip saddr 192.168.1.100 drop

      此規則丟棄來自192.168.1.100的數據包。

  3. 拒絕(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端口不可達訊息。

  4. 跳轉(jump)
    • 功能:將數據包的處理轉交給指定的普通鏈。
    • 應用場景:用於模組化管理,將複雜規則拆分到多個鏈中。例如,將所有TCP流量跳轉到專門的鏈進行進一步檢查。
    • 範例
      nft add chain inet my_table tcp_chain
      nft add rule inet my_table input tcp jump tcp_chain

      此規則將所有TCP數據包跳轉到名為tcp_chain的普通鏈進行處理。

  5. 返回(return)
    • 功能:從當前鏈返回到調用它的上一層鏈,繼續執行後續規則。
    • 應用場景:用於在普通鏈中提前終止處理,回到基礎鏈。例如,在檢查某些條件後決定不再執行當前鏈的後續規則。
    • 範例
      nft add rule inet my_table tcp_chain tcp dport 80 return

      此規則在tcp_chain中匹配到端口80的TCP數據包後返回到上一層鏈。

  6. 記錄(log)
    • 功能:記錄數據包的相關資訊(如來源IP、端口)到日誌,常用於調試或監控。
    • 應用場景:用於追蹤異常流量或審計防火牆行為。支援自定義日誌前綴和級別。
    • 範例
      nft add rule inet my_table input log prefix "[NFTABLES_DROP] " drop

      此規則記錄所有被丟棄的數據包,添加前綴“[NFTABLES_DROP]”,並將日誌寫入系統日誌。

  7. 計數(counter)
    • 功能:統計匹配數據包的數量和流量大小。
    • 應用場景:用於監控特定流量的使用情況,例如統計某端口的訪問次數。
    • 範例
      nft add rule inet my_table input tcp dport 443 counter accept

      此規則允許HTTPS流量並記錄匹配的數據包數量。

  8. 地址轉換(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。

  9. 限制(limit)
    • 功能:限制數據包的處理頻率,防止過載。
    • 應用場景:用於緩解DDoS攻擊或限制特定服務的訪問頻率。
    • 範例
      nft add rule inet my_table input tcp dport 22 limit rate 5/minute accept

      此規則限制SSH連接每分鐘最多5次,超出限制的數據包將被丟棄。

  10. 隊列(queue)
    • 功能:將數據包發送到用戶空間的應用程式進行處理。
    • 應用場景:用於進階流量分析或與外部工具(如IDS/IPS系統)整合。
    • 範例
      nft add rule inet my_table input queue

      此規則將匹配的數據包發送到用戶空間處理。

實際應用

規則的動作可用於實現多種防火牆功能,例如:

  • 允許特定服務(如SSH、HTTP)的流量。
  • 阻止來自特定IP的惡意訪問。
  • 將流量重定向到其他設備。
  • 記錄異常流量以便後續分析。

注意事項

  • 規則的順序至關重要,nftables按順序逐條匹配,匹配到的第一條規則將決定數據包的命運。
  • 動作可能會影響性能,例如過多的日誌記錄或計數可能增加系統負載。
  • 某些動作(如dnat、snat)需要在特定的鉤子(如prerouting、postrouting)中使用。

2.4 集合(Sets)和映射(Maps)

定義與功能

集合和映射是nftables的創新功能,極大提升了其靈活性和效率:

  1. 集合(Sets)
    • 用於儲存一組元素,例如IP地址、端口、MAC地址等。
    • 支援動態更新,無需重載規則即可添加或刪除元素。
    • 支援高效的批量匹配,例如檢查數據包的來源IP是否在某個黑名單中。
    • 可設置超時(timeout),元素在指定時間後自動移除。
  2. 映射(Maps)
    • 將鍵值對映射到特定動作,例如將來源IP映射到目標地址。
    • 適用於動態分發流量,如負載均衡或NAT(網路地址轉換)。

集合和映射的優勢在於,它們將數據儲存在內核中,匹配效率遠高於逐條規則檢查。

實際應用

  • 集合:用於黑名單或白名單管理。例如,動態封鎖頻繁發送請求的IP。
  • 映射:用於負載均衡或流量重定向。例如,將訪問某個公共IP的流量分發到多個後端伺服器。

範例

  1. 創建一個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秒後自動從集合中移除。

  2. 創建一個映射實現簡單負載均衡:
    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吧!通過簡單的學習和實踐,您將能輕鬆構建一個高效、安全的網路環境。立即動手,體驗下一代防火牆的無限可能!