<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>運維 on KnightLi的博客</title>
        <link>https://www.knightli.com/zh-tw/categories/%E9%81%8B%E7%B6%AD/</link>
        <description>Recent content in 運維 on KnightLi的博客</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-tw</language>
        <lastBuildDate>Sat, 18 Apr 2026 10:31:12 +0800</lastBuildDate><atom:link href="https://www.knightli.com/zh-tw/categories/%E9%81%8B%E7%B6%AD/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>理解 nftables 框架：表、鏈、規則和集合</title>
        <link>https://www.knightli.com/zh-tw/2026/04/18/nftables-framework-concepts/</link>
        <pubDate>Sat, 18 Apr 2026 10:31:12 +0800</pubDate>
        
        <guid>https://www.knightli.com/zh-tw/2026/04/18/nftables-framework-concepts/</guid>
        <description>&lt;p&gt;學習 &lt;code&gt;nftables&lt;/code&gt; 時，容易一開始就陷入命令細節：怎麼新增規則、怎麼刪除 handle、怎麼寫連接埠匹配。命令當然重要，但如果先把框架概念理清楚，後面讀規則、排查問題和設計規則集都會輕鬆很多。&lt;/p&gt;
&lt;p&gt;可以把 nftables 理解成一套分層結構：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;table&lt;/code&gt; 負責隔離規則空間。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;family&lt;/code&gt; 決定規則處理哪類網路協定。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;chain&lt;/code&gt; 決定規則在什麼階段執行。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rule&lt;/code&gt; 負責具體匹配和動作。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;set&lt;/code&gt;、&lt;code&gt;map&lt;/code&gt;、&lt;code&gt;verdict map&lt;/code&gt; 用來減少重複規則，讓規則集更易維護。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;下面按概念逐層說明。&lt;/p&gt;
&lt;h2 id=&#34;table規則的命名空間&#34;&gt;table：規則的命名空間
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;table&lt;/code&gt; 是 nftables 裡最外層的規則容器。不同 table 之間相互隔離，因此常見做法是把一組相關規則放進同一個 table。&lt;/p&gt;
&lt;p&gt;例如，你可以把過濾規則、NAT 規則或自訂測試規則分開放。這樣做的好處是邊界清楚：除錯時知道自己在改哪一組規則，清理時也不容易誤刪無關內容。&lt;/p&gt;
&lt;p&gt;table 本身不會直接處理封包。真正參與封包處理的是 table 裡面的 chain 和 rule。&lt;/p&gt;
&lt;h2 id=&#34;family規則面對哪類協定&#34;&gt;family：規則面對哪類協定
&lt;/h2&gt;&lt;p&gt;建立 table 時需要選擇 &lt;code&gt;family&lt;/code&gt;。它決定這張表裡的規則適用於哪類封包。&lt;/p&gt;
&lt;p&gt;常見 family 可以這樣理解：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ip&lt;/code&gt;：只處理 IPv4。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ip6&lt;/code&gt;：只處理 IPv6。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;inet&lt;/code&gt;：同時處理 IPv4 和 IPv6。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;arp&lt;/code&gt;：處理 ARP。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bridge&lt;/code&gt;：處理橋接層流量。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;netdev&lt;/code&gt;：更靠近網路設備入口，適合較早階段處理流量。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;日常寫普通防火牆規則時，&lt;code&gt;inet&lt;/code&gt; 很常用。它可以把 IPv4 和 IPv6 規則放在同一個 table 裡，避免維護兩套結構相似的規則。&lt;/p&gt;
&lt;h2 id=&#34;chain規則執行的位置&#34;&gt;chain：規則執行的位置
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;chain&lt;/code&gt; 是 rule 的列表。封包進入某個 hook 後，會按順序經過 chain 裡的規則。&lt;/p&gt;
&lt;p&gt;chain 大致可以分為兩類：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;基本 chain：掛到核心網路路徑的某個 hook 上，會被封包流程主動呼叫。&lt;/li&gt;
&lt;li&gt;常規 chain：不直接掛 hook，需要被其他規則跳轉呼叫。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;基本 chain 通常會指定幾個關鍵屬性：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;type&lt;/code&gt;：這條 chain 的用途，例如 &lt;code&gt;filter&lt;/code&gt;、&lt;code&gt;nat&lt;/code&gt;、&lt;code&gt;route&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hook&lt;/code&gt;：掛在哪個處理階段，例如 &lt;code&gt;prerouting&lt;/code&gt;、&lt;code&gt;input&lt;/code&gt;、&lt;code&gt;forward&lt;/code&gt;、&lt;code&gt;output&lt;/code&gt;、&lt;code&gt;postrouting&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;priority&lt;/code&gt;：同一個 hook 上有多條 chain 時，誰先執行。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;policy&lt;/code&gt;：沒有規則匹配時的預設動作，常見是 &lt;code&gt;accept&lt;/code&gt; 或 &lt;code&gt;drop&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;理解 chain 的關鍵是：規則不是「隨便寫在哪裡都能生效」。同一條規則放在 &lt;code&gt;input&lt;/code&gt;、&lt;code&gt;forward&lt;/code&gt; 或 &lt;code&gt;output&lt;/code&gt;，含義完全不同。&lt;/p&gt;
&lt;h2 id=&#34;rule匹配條件加動作&#34;&gt;rule：匹配條件加動作
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;rule&lt;/code&gt; 是 nftables 裡真正做判斷的地方。它通常由兩部分組成：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;匹配條件：例如來源 IP、目標 IP、協定、連接埠、介面、連線狀態。&lt;/li&gt;
&lt;li&gt;動作：例如 &lt;code&gt;accept&lt;/code&gt;、&lt;code&gt;drop&lt;/code&gt;、&lt;code&gt;reject&lt;/code&gt;、&lt;code&gt;counter&lt;/code&gt;、&lt;code&gt;jump&lt;/code&gt;、&lt;code&gt;return&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;規則會按順序求值。封包命中某條會終止流程的動作後，就不會繼續執行後面的規則。沒有命中時，則繼續往下走，直到 chain 結束或觸發預設策略。&lt;/p&gt;
&lt;p&gt;這也是為什麼規則順序很重要：更具體的規則通常要放在更寬泛的規則前面，否則可能永遠沒有機會被執行。&lt;/p&gt;
&lt;h2 id=&#34;set把一組值放在一起&#34;&gt;set：把一組值放在一起
&lt;/h2&gt;&lt;p&gt;如果有很多 IP、連接埠或介面需要匹配，直接寫多條規則會很難維護。&lt;code&gt;set&lt;/code&gt; 用來把一組同類型的值集中管理。&lt;/p&gt;
&lt;p&gt;例如，一組可信 IP、一組禁止存取的連接埠、一組需要限速的位址，都可以放進 set。規則只需要判斷某個值是否屬於這個 set。&lt;/p&gt;
&lt;p&gt;set 的好處是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;規則數量更少。&lt;/li&gt;
&lt;li&gt;可讀性更好。&lt;/li&gt;
&lt;li&gt;後續增刪元素更方便。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;當規則裡出現大量重複條件時，通常就該考慮用 set。&lt;/p&gt;
&lt;h2 id=&#34;map把匹配值映射成結果&#34;&gt;map：把匹配值映射成結果
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;map&lt;/code&gt; 可以理解成「查表」。它根據一個輸入值返回一個結果。&lt;/p&gt;
&lt;p&gt;例如，不同連接埠映射到不同標記，不同位址映射到不同處理參數，都可以透過 map 表達。相比寫多條 if/else 式規則，map 更集中，也更容易維護。&lt;/p&gt;
&lt;p&gt;set 關心的是「是否在集合裡」，map 關心的是「這個值對應什麼結果」。&lt;/p&gt;
&lt;h2 id=&#34;verdict-map把匹配值映射成動作&#34;&gt;verdict map：把匹配值映射成動作
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;verdict map&lt;/code&gt; 是 map 的一個重要用法：它把匹配值映射成 verdict，也就是規則動作。&lt;/p&gt;
&lt;p&gt;例如，不同 IP 段可以對應 &lt;code&gt;accept&lt;/code&gt;、&lt;code&gt;drop&lt;/code&gt; 或跳轉到不同 chain。這樣可以把很多分支判斷壓縮到一個結構裡。&lt;/p&gt;
&lt;p&gt;當規則集開始變複雜時，verdict map 很有用。它能減少重複規則，也能把策略表達得更像一張表，而不是一長串判斷語句。&lt;/p&gt;
&lt;h2 id=&#34;從概念看規則設計&#34;&gt;從概念看規則設計
&lt;/h2&gt;&lt;p&gt;設計 nftables 規則時，可以按這個順序思考：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;先確定規則屬於哪個 &lt;code&gt;family&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;再決定放進哪個 &lt;code&gt;table&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;然後選擇合適的 &lt;code&gt;hook&lt;/code&gt; 和 &lt;code&gt;chain&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;最後編寫具體 &lt;code&gt;rule&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;如果重複條件很多，再引入 &lt;code&gt;set&lt;/code&gt;、&lt;code&gt;map&lt;/code&gt; 或 &lt;code&gt;verdict map&lt;/code&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;這樣寫出來的規則會更容易維護，也更容易排錯。&lt;/p&gt;
&lt;h2 id=&#34;小結&#34;&gt;小結
&lt;/h2&gt;&lt;p&gt;nftables 的概念並不複雜，但層級很重要：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;table 管規則邊界。&lt;/li&gt;
&lt;li&gt;family 管協定範圍。&lt;/li&gt;
&lt;li&gt;chain 管執行位置。&lt;/li&gt;
&lt;li&gt;rule 管匹配和動作。&lt;/li&gt;
&lt;li&gt;set、map、verdict map 管複雜度。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;先理解這些概念，再去看具體命令，會比直接背命令更穩。尤其是在規則集變多以後，概念清楚能幫助你判斷：問題到底出在協定範圍、執行階段、規則順序，還是匹配條件本身。&lt;/p&gt;
&lt;h2 id=&#34;參考&#34;&gt;參考
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.redhat.com/zh-cn/documentation/red_hat_enterprise_linux/10/html/configuring_firewalls_and_packet_filters/concepts-in-the-nftables-framework&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://docs.redhat.com/zh-cn/documentation/red_hat_enterprise_linux/10/html/configuring_firewalls_and_packet_filters/concepts-in-the-nftables-framework&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>nftables 快速入門：表、鏈、規則和常用操作</title>
        <link>https://www.knightli.com/zh-tw/2026/04/18/nftables-quick-start/</link>
        <pubDate>Sat, 18 Apr 2026 10:22:07 +0800</pubDate>
        
        <guid>https://www.knightli.com/zh-tw/2026/04/18/nftables-quick-start/</guid>
        <description>&lt;p&gt;&lt;code&gt;nftables&lt;/code&gt; 是 Linux 上常用的封包過濾和防火牆規則管理工具。如果只是做設備連線控制、流量統計、連接埠匹配或簡單限速，不需要一開始就把完整規則體系全部學完，先理解三個概念就夠了：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;table&lt;/code&gt;：規則的容器。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;chain&lt;/code&gt;：規則執行的位置，通常會掛到某個 hook 上。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rule&lt;/code&gt;：真正的匹配條件和動作。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;下面整理一套最小可用的入門流程，適合先在測試環境裡做實驗。&lt;/p&gt;
&lt;h2 id=&#34;基礎結構&#34;&gt;基礎結構
&lt;/h2&gt;&lt;p&gt;先準備幾個變數，後面的命令會重複使用：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;table&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;customtable
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;chain&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;custom_control
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;target&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;drop
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;ip&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;192.168.18.251
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;mac&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;00:00:01:02:03:04
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;建立一個同時支援 IPv4 和 IPv6 的 &lt;code&gt;inet&lt;/code&gt; table：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nft add table inet &lt;span class=&#34;nv&#34;&gt;$table&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;再建立一條掛在 &lt;code&gt;forward&lt;/code&gt; 階段的 chain：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nft add chain inet &lt;span class=&#34;nv&#34;&gt;$table&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$chain&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;type&lt;/span&gt; filter hook forward priority 0&lt;span class=&#34;se&#34;&gt;\;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;這裡的 &lt;code&gt;type filter&lt;/code&gt; 表示做過濾規則，&lt;code&gt;hook forward&lt;/code&gt; 表示處理經過轉發的封包。&lt;/p&gt;
&lt;h2 id=&#34;常見匹配方式&#34;&gt;常見匹配方式
&lt;/h2&gt;&lt;p&gt;按來源 IP 匹配，通常可以理解為設備上傳方向：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nft add rule inet &lt;span class=&#34;nv&#34;&gt;$table&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$chain&lt;/span&gt; ip saddr &lt;span class=&#34;nv&#34;&gt;$ip&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$target&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;按目標 IP 匹配，通常可以理解為設備下載方向：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nft add rule inet &lt;span class=&#34;nv&#34;&gt;$table&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$chain&lt;/span&gt; ip daddr &lt;span class=&#34;nv&#34;&gt;$ip&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$target&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;按 MAC 位址匹配時，可以用 &lt;code&gt;ether saddr&lt;/code&gt; 控制上行：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nft add rule inet &lt;span class=&#34;nv&#34;&gt;$table&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$chain&lt;/span&gt; ether saddr &lt;span class=&#34;nv&#34;&gt;$mac&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$target&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;需要注意的是，在經過橋接、轉發或位址轉換的網路裡，下行封包未必能可靠用目標 MAC 過濾。實際做設備連線控制時，優先從 &lt;code&gt;ether saddr&lt;/code&gt; 或 IP 規則開始驗證。&lt;/p&gt;
&lt;p&gt;匹配連接埠時，可以同時覆蓋 TCP 和 UDP：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nft add rule inet &lt;span class=&#34;nv&#34;&gt;$table&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$chain&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt; tcp, udp &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt; dport &lt;span class=&#34;m&#34;&gt;22&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$target&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果要匹配連接埠範圍，可以使用比較表達式：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nft add rule inet &lt;span class=&#34;nv&#34;&gt;$table&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$chain&lt;/span&gt; tcp dport &lt;span class=&#34;se&#34;&gt;\&amp;gt;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1024&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$target&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;統計單個設備流量&#34;&gt;統計單個設備流量
&lt;/h2&gt;&lt;p&gt;如果只是想統計某個 IP 的上下行流量，可以用 &lt;code&gt;counter return&lt;/code&gt;。這樣命中後記錄計數並返回，後面還有其他統計規則時，能減少繼續匹配的開銷。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nft add rule inet &lt;span class=&#34;nv&#34;&gt;$table&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$chain&lt;/span&gt; ip saddr &lt;span class=&#34;nv&#34;&gt;$ip&lt;/span&gt; counter &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nft add rule inet &lt;span class=&#34;nv&#34;&gt;$table&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$chain&lt;/span&gt; ip daddr &lt;span class=&#34;nv&#34;&gt;$ip&lt;/span&gt; counter &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;查看統計結果：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nft list chain inet &lt;span class=&#34;nv&#34;&gt;$table&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$chain&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果需要看到每條規則的 &lt;code&gt;handle&lt;/code&gt;，加上 &lt;code&gt;-a&lt;/code&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nft -a list chain inet &lt;span class=&#34;nv&#34;&gt;$table&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$chain&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;handle&lt;/code&gt; 很重要，因為 nftables 刪除單條規則時通常要靠它定位。&lt;/p&gt;
&lt;h2 id=&#34;簡單限速&#34;&gt;簡單限速
&lt;/h2&gt;&lt;p&gt;限速可以用 &lt;code&gt;limit rate over&lt;/code&gt;。例如按 MAC 位址限制超過指定速率的流量：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;rate&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;unit&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;mbytes
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nft add rule inet &lt;span class=&#34;nv&#34;&gt;$table&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$chain&lt;/span&gt; ether saddr &lt;span class=&#34;nv&#34;&gt;$mac&lt;/span&gt; limit rate over &lt;span class=&#34;nv&#34;&gt;$rate&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$unit&lt;/span&gt;/second drop
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;這裡的 &lt;code&gt;mbytes&lt;/code&gt;、&lt;code&gt;kbytes&lt;/code&gt; 可以按日常理解的 M、K 來看，不需要再手動做 8 倍換算。實際使用時建議先用較寬鬆的值測試，確認命中方向和效果後再收緊。&lt;/p&gt;
&lt;h2 id=&#34;刪除和清理規則&#34;&gt;刪除和清理規則
&lt;/h2&gt;&lt;p&gt;先查看帶 &lt;code&gt;handle&lt;/code&gt; 的規則：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nft -a list chain inet &lt;span class=&#34;nv&#34;&gt;$table&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$chain&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;再按 handle 刪除某條規則：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nft delete rule inet &lt;span class=&#34;nv&#34;&gt;$table&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$chain&lt;/span&gt; handle &amp;lt;handle&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;清空某條 chain：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nft flush chain inet &lt;span class=&#34;nv&#34;&gt;$table&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$chain&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;刪除 chain：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nft delete chain inet &lt;span class=&#34;nv&#34;&gt;$table&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$chain&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;刪除整個 table：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nft delete table inet &lt;span class=&#34;nv&#34;&gt;$table&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;日常除錯時，建議先只清理自己建立的 table，不要直接改系統或其他服務自動生成的 table。這樣即使規則寫錯，也更容易回滾。&lt;/p&gt;
&lt;h2 id=&#34;使用建議&#34;&gt;使用建議
&lt;/h2&gt;&lt;p&gt;使用 nftables 時，可以優先自己建立獨立的 table 和 chain。這樣做有兩個好處：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;不容易和系統已有規則混在一起。&lt;/li&gt;
&lt;li&gt;除錯、清空和刪除都更安全。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;另外，規則寫完後一定要用 &lt;code&gt;nft list chain&lt;/code&gt; 看實際命中情況。尤其是 MAC、介面、連接埠和限速規則，不同設備、橋接方式和系統版本下表現可能不同，先小範圍測試比一次性寫複雜規則更穩。&lt;/p&gt;
&lt;h2 id=&#34;參考&#34;&gt;參考
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.right.com.cn/forum/thread-8369750-1-1.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://www.right.com.cn/forum/thread-8369750-1-1.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        
    </channel>
</rss>
