<?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/tags/%E7%BD%91%E7%BB%9C%E7%AE%A1%E7%90%86/</link>
        <description>Recent content in 网络管理 on KnightLi的博客</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-cn</language>
        <lastBuildDate>Sat, 18 Apr 2026 10:31:12 +0800</lastBuildDate><atom:link href="https://www.knightli.com/tags/%E7%BD%91%E7%BB%9C%E7%AE%A1%E7%90%86/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>理解 nftables 框架：表、链、规则和集合</title>
        <link>https://www.knightli.com/2026/04/18/nftables-framework-concepts/</link>
        <pubDate>Sat, 18 Apr 2026 10:31:12 +0800</pubDate>
        
        <guid>https://www.knightli.com/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/2026/04/18/nftables-quick-start/</link>
        <pubDate>Sat, 18 Apr 2026 10:22:07 +0800</pubDate>
        
        <guid>https://www.knightli.com/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>
