Linux之nftables安装及简单使用

2026-03-11 11:14:44 95

Linux之nftables安装及简单使用

欢迎来到8455线路检测中心技术小课堂,每天分享一个技术小知识。


1. 概述 

NFTables 是 Netfilter 项目的一部分,于 Linux 内核 3.13 版本引入,用于替代传统的 iptables、ip6tables、arptables 和 ebtables 工具。它提供了一个更简洁、高效的框架来管理网络数据包过滤、网络地址转换(NAT)和数据包修改。

2. 架构与核心概念 

2.1 核心组件 

Tables(表):用于分类规则,常见的表有 ip、ip6、inet、arp、bridge、netdev。

Chains(链):规则链,可以是内置链(如 input、output、forward)或用户自定义链。

Rules(规则):包含匹配表达式和动作的过滤规则。

Expressions(表达式):用于匹配数据包的条件,如源地址、目标地址、协议等。

Actions(动作):对匹配数据包执行的操作,如 accept、drop、jump 等。

2.2 与传统 iptables 的区别 

统一的语法结构,不再区分 IPv4 和 IPv6。

使用集合和映射,提高规则处理效率。

支持规则集的原子更新,减少对系统的影响。

3. 安装与基本命令 

3.1 安装 

# Debian/Ubuntu

sudo apt install nftables

# RHEL/CentOS/Fedora

sudo yum install nftables

3.2 服务管理 

# 启动服务

sudo systemctl start nftables

# 开机自启

sudo systemctl enable nftables

# 查看状态

sudo systemctl status nftables

4. 基本语法 

4.1 创建表 

nft add table inet filter

4.2 创建链 

# 创建基础链

nft add chain inet filter input { type filter hook input priority 0\\; }

# 创建自定义链

nft add chain inet filter my_chain

4.3 添加规则 

# 允许 SSH 连接

nft add rule inet filter input tcp dport 22 accept

# 允许回环接口流量

nft add rule inet filter input iif lo accept

# 允许已建立和相关的连接

nft add rule inet filter input ct state established,related accept

# 丢弃其他所有流量

nft add rule inet filter input drop

5. 高级配置 

5.1 使用集合 

# 创建命名集合

nft add set inet filter allowed_ips { type ipv4_addr\\; }

# 添加元素到集合

nft add element inet filter allowed_ips { 192.168.1.100, 192.168.1.200 }

# 使用集合匹配

nft add rule inet filter input ip saddr @allowed_ips accept

5.2 使用映射 

# 创建映射

nft add map inet filter port_map { type inet_service : verdict \\; }

# 向映射添加项目

nft add element inet filter port_map { 80 : accept, 443 : accept, 22 : drop }

# 使用映射

nft add rule inet filter input tcp dport vmap @port_map

5.3 NAT 配置 

# 创建 nat 表

nft add table nat

# 创建 prerouting 链

nft add chain nat prerouting { type nat hook prerouting priority -100\\; }

# 创建 postrouting 链

nft add chain nat postrouting { type nat hook postrouting priority 100\\; }

# DNAT 规则

nft add rule nat prerouting daddr 203.0.113.1 tcp dport 80 dnat to 192.168.1.100:8080

# SNAT 规则

nft add rule nat postrouting oif eth0 snat to 203.0.113.1

6. 配置文件 

6.1 配置文件格式 

NFTables 配置文件通常位于 /etc/nftables.conf:

#!/usr/sbin/nft -f

# 清空所有规则

flush ruleset

# 定义表

table inet filter {

    # 定义集合

    set allowed_ips {

        type ipv4_addr

        elements = { 192.168.1.100, 192.168.1.200 }

    }

    

    set blocked_ports {

        type inet_service

        elements = { 25, 135, 137, 138, 139, 445 }

    }

    

    # 定义链

    chain input {

        type filter hook input priority 0; policy drop;

        

        # 允许回环接口

        iif lo accept

        

        # 允许已建立和相关的连接

        ct state established,related accept

        

        # 允许 ICMP

        meta l4proto icmp accept

        meta l4proto ipv6-icmp accept

        

        # 允许来自允许列表的 IP

        ip saddr @allowed_ips accept

        

        # 允许 SSH

        tcp dport 22 accept

        

        # 允许 HTTP/HTTPS

        tcp dport { 80, 443 } accept

        

        # 阻止危险端口

        tcp dport @blocked_ports drop

    }

    

    chain forward {

        type filter hook forward priority 0; policy drop;

    }

    

    chain output {

        type filter hook output priority 0; policy accept;

    }

}

6.2 加载配置 

# 从文件加载配置

nft -f /etc/nftables.conf

# 测试配置文件语法

nft -c -f /etc/nftables.conf

7. 实用命令 

7.1 查看规则 

# 查看所有规则

nft list ruleset

# 查看指定表的规则

nft list table inet filter

# 查看指定链的规则

nft list chain inet filter input

7.2 监控流量 

# 跟踪特定规则

nft add rule inet filter input tcp dport 22 counter accept

# 查看计数器

nft list ruleset -a

7.3 规则管理 

# 插入规则

nft insert rule inet filter input position 3 tcp dport 3306 drop

# 删除规则

nft delete rule inet filter input handle 3

# 清空链

nft flush chain inet filter input

# 删除表

nft delete table inet filter

8. 性能优化建议 

8.1 规则组织 

将最常匹配的规则放在前面

使用集合和映射优化匹配效率

合并相似规则减少规则数量

8.2 连接跟踪优化 

# 调整连接跟踪表大小echo 1000000 > /proc/sys/net/netfilter/nf_conntrack_max

9. 故障排除 

9.1 常用诊断命令 

# 查看规则处理情况

nft monitor

# 查看规则统计

nft list ruleset -a

# 检查系统日志

journalctl -u nftables -f

9.2 常见问题

规则不生效:检查链的优先级和钩子类型是否正确

连接跟踪问题:确认 conntrack模块已加载

性能问题:使用 nft monitor查看规则匹配频率

10. 迁移指南 

10.1 从 iptables 迁移 

# 将 iptables 规则转换为 nftables

iptables-save > iptables.rules

iptables-restore-translate -f iptables.rules > nftables.rules

nft -f nftables.rules

11. 安全最佳实践 

默认策略设置为 DROP

仅开放必要的端口和服务

使用有意义的链和规则名称

定期审查和清理旧规则

使用版本控制管理配置文件

12. 参考资料 

官方文档:https://wiki.nftables.org

手册页:man nft、man nftables

Netfilter 项目:https://www.netfilter.org


注意:在生产环境中应用任何防火墙规则前,请先在测试环境中验证,并确保有恢复计划(如通过串行控制台访问)。


8455线路检测中心官网上拥有完善的技术支持库可供参考,大家可自行查阅,更多技术问题,可以直接咨询。同时,8455线路检测中心整理了运维必备的工具包免费分享给大家使用,需要的朋友可以直接咨询。

更多技术知识,8455线路检测中心期待与你一起探索。


提交成功!非常感谢您的反馈,我们会继续努力做到更好!

这条文档是否有帮助解决问题?

非常抱歉未能帮助到您。为了给您提供更好的服务,我们很需要您进一步的反馈信息:

在文档使用中是否遇到以下问题:
XML 地图