0

0

Linux nftables 与 iptables 对比分析

舞夢輝影

舞夢輝影

发布时间:2026-02-11 21:05:29

|

886人浏览过

|

来源于php中文网

原创

新建规则不该再用 iptables,因内核3.13起nftables已是官方默认框架,2026年主流发行版将停用iptables原生后端,仅通过兼容层运行,带来性能损耗与行为差异。

linux nftables 与 iptables 对比分析

为什么现在新建规则不该再用 iptables

内核从 3.13 开始,nftables 就已是官方推荐的默认防火墙框架;2026 年主流发行版(如 RHEL 9、Debian 12+、Ubuntu 22.04 LTS 及更新)已默认停用 iptables 命令的原生后端,转而通过 iptables-compat 层模拟运行——这层翻译不仅引入额外开销,还屏蔽了连接跟踪状态、计数器精度等底层行为差异。

  • 线性匹配 vs 哈希/树结构:iptables 的 INPUT 链规则是纯顺序遍历,1000 条规则平均要检查 500 次才能命中;nftables 在内核中用高效数据结构索引,同规模下匹配延迟可压到亚微秒级
  • UDP 高频场景尤其明显:DNS、QUIC、gRPC-Web 等服务依赖无状态快速放行,iptables 的 conntrack 强制介入常导致 CPU 占用突增,而 nftables 支持 ct state invalid drop + udp dport @allowed_ports 这类原子组合,避免状态表膨胀
  • iptables-save 导出的规则无法直接复用于 nftables;反向转换要用 iptables-translate,但该工具不处理自定义模块(如 ipset 替代方案需手动重写为 set

nftables 中 inet 表怎么真正实现 IPv4/IPv6 双栈统一

很多人以为加个 inet 地址簇就能“自动兼容双栈”,实际不是:它只表示“此表可同时注册 IPv4 和 IPv6 hook”,但规则本身仍需显式声明协议上下文。漏掉这点,会导致 IPv6 流量静默丢弃。

  • 正确写法是:在匹配条件中明确使用 ipip6,或用 meta nfproto 区分;例如 tcp dport 22 不生效,必须写成 ip tcp dport 22ip6 tcp dport 22
  • 若想一条规则覆盖双栈,得用 inet 表 + 协议无关匹配,比如:nft add rule inet filter input meta nfproto { ip, ip6 } tcp dport 22 accept
  • 回环地址也要分开处理:ip saddr 127.0.0.1ip6 saddr ::1 不能合并;更稳妥的做法是用 meta iifname "lo",它不依赖地址族

添加 INPUT 规则时最容易被忽略的三个 hook 依赖

nftables 的基链(base chain)不是“摆设”,它绑定到 netfilter 的具体 hook 点,而某些关键动作(如连接跟踪初始化、raw 表 bypass)只在特定 hook 才生效。跳过它们,ct state established 类规则可能永远不匹配。

Linux+PHP+MySQL案例教程
Linux+PHP+MySQL案例教程

本书以培养高级网站建设与管理人才为目标,内容循序渐进,由浅入深,通过大量的实例系统全面地介绍了Linux+PHP+MySQL环境下的网络后台开发技术。本书详尽分析了近30个典型案例。包括计数器、网站流量统计、留言板、论坛系统、聊天室、投票与调查、用户管理、新闻发布系统、广告轮播、购物系统等等,力求让读者通过对案例的学习,轻松掌握PHP和MySQL的编程精要,迅速掌握网络后台开发技巧。   本书适

下载
  • prerouting hook 是 conntrack 初始化必经之路:没在这里注册 ct 相关 chain,后续所有 ct state 判断都会返回 invalid
  • input hook 处理本机接收包,但若你启用了 nf_conntrack_helper(如 FTP、SIP),helper 模块必须在 raw 表的 prerouting 中启用,否则 ALG 不工作
  • 策略(policy)设置有陷阱:执行 nft add chain inet filter input { type filter hook input priority 0 \; policy drop \; } 后,所有未显式 accept 的包立即被丢弃——包括你还没来得及加的 SSH 规则。建议先设 policy accept,规则就位后再改

从 iptables 迁移时最痛的三处语法断层

翻译工具能搞定 80% 的基础规则,但以下三类必须手改,否则运行时报错或逻辑错位:

  • -m multiport --dports 22,80,443 → 必须转为 nftables setnft add set inet filter ssh_http { type inet_service \; },再用 tcp dport @ssh_http 引用;直接写逗号列表会报错
  • -j LOG --log-prefix "DROP: " → nftables 没有内置 log prefix,得用 log prefix "DROP: " level warn,且 level 参数不可省略,否则日志不输出
  • -j REJECT --reject-with icmp-host-prohibited → nftables 中 reject 是独立表达式,写法是 reject with icmp type host-prohibited(注意 type 关键字和连字符位置)

复杂点在于:nftables 的规则是“原子提交”的,但它的错误提示极其简陋——比如少一个分号、括号不匹配,nft 命令只会报 Error: syntax error,连第几行都懒得说。建议用 nft -f /tmp/rules.nft 分文件调试,别硬敲长命令。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

351

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

326

2023.10.25

treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

540

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

26

2025.12.22

深入理解算法:高效算法与数据结构专题
深入理解算法:高效算法与数据结构专题

本专题专注于算法与数据结构的核心概念,适合想深入理解并提升编程能力的开发者。专题内容包括常见数据结构的实现与应用,如数组、链表、栈、队列、哈希表、树、图等;以及高效的排序算法、搜索算法、动态规划等经典算法。通过详细的讲解与复杂度分析,帮助开发者不仅能熟练运用这些基础知识,还能在实际编程中优化性能,提高代码的执行效率。本专题适合准备面试的开发者,也适合希望提高算法思维的编程爱好者。

38

2026.01.06

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

409

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

586

2023.08.10

点击input框没有光标怎么办
点击input框没有光标怎么办

点击input框没有光标的解决办法:1、确认输入框焦点;2、清除浏览器缓存;3、更新浏览器;4、使用JavaScript;5、检查硬件设备;6、检查输入框属性;7、调试JavaScript代码;8、检查页面其他元素;9、考虑浏览器兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

192

2023.11.24

2026春节习俗大全
2026春节习俗大全

本专题整合了2026春节习俗大全,阅读专题下面的文章了解更多详细内容。

68

2026.02.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 8.9万人学习

Git 教程
Git 教程

共21课时 | 3.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号