nftables(2)表、链、规则查询和管理(新增、插入、修改、删除)

nftables(2)表、链、规则查询和管理(新增、插入、修改、删除)上面所介绍的就是 nftables 基本的表 链 规则的创建和管理 如果熟悉 iptables 的配置方式的话 那么 nftables 的配置逻辑理解起来还是相对比较容易的

大家好,欢迎来到IT知识分享网。

简介

在上篇文章中,我们介绍了nftables基本原理以及与iptables的区别,nftables安装和配置保存的操作。这篇文章主要介绍nftables的基本操作,表、链、规则的新增、插入、修改、删除等操作。

注意:在进行nftables实验时和iptables一样,请务必在个人的测试机上进行,不要在有任何业务的机器上进行测试。

在进行测试前,为保障我们环境的纯粹性,我们需要将nftables清空,以便进行后续的各项实验测试。

nft flush ruleset #清除 nftables 中的所有规则 nft list ruleset
nftables(2)表、链、规则查询和管理(新增、插入、修改、删除)
此时我的nftables没有任何规则

nftables 中的表是一个包含链、规则、集合和其他对象集合的名字空间。

每个表都必须分配一个地址系列。地址系列定义此表处理的数据包类型。在创建表时,可以设置以下地址系列之一:

  • ip:仅匹配 IPv4 数据包。如果没有指定地址系列,这是默认设置。
  • ip6 :仅匹配 IPv6 数据包.
  • inet:匹配 IPv4 和 IPv6 数据包。
  • arp:匹配 IPv4 地址解析协议(ARP)数据包。
  • bridge:匹配通过网桥设备的数据包。
  • netdev:匹配来自 ingress 的数据包。

添加表

nft add table <table_address_family> <table_name> nft list tables #列出所有表 nft list table <table_name> #列出指定表的规则 nft list table <table_address_family> <table_name> #列出对应族中对应对应表的所有规则
nftables(2)表、链、规则查询和管理(新增、插入、修改、删除)
不指定地址族默认就是ip,通过list tables查看创建的表

 删除表

nft delete table <table_address_family> <table_name>
nftables(2)表、链、规则查询和管理(新增、插入、修改、删除)
通过delete删除表

刷新表

当我们需要清除一个表中的所有规则但是不需要删除我们表的结构和配置的时候可以通过以下命令实现:

nft flush table <table_address_family> <table_name>

链的用途是包含规则,与 iptables 中的链不同,nftables 中没有内置链。这意味着,如果没有任何类型或钩子使用链,nftables 将不会触及流经这些链的数据包,因为它们没有定义任何规则来处理这些数据包。

表由链组成,链又是规则的容器。存在以下两种规则类型:

基本链 :可以使用基本链作为来自网络堆栈的数据包的入口点。

常规链 :可以将常规链用作 jump 目标来更好地组织规则。

基本链

nft add chain <table_address_family> <table_name> <chain_name> { type <type> hook <hook> priority <priority> \; policy <policy> \; }

链类型

类型 地址系列 钩子 描述

filter

all

all

标准链类型

nat

ip,ip6,inet

preroutinginputoutputpostrouting

这个类型的链根据连接跟踪条目执行原生地址转换。只有第一个数据包会遍历此链类型。

route

ip,ip6

output

如果 IP 头的相关部分已更改,则接受的遍历此链类型的数据包会导致新的路由查找。

链优先级

priority 参数指定数据包遍历具有相同 hook 值的链的顺序。可以将此参数设为整数值,或使用标准优先级名称。数字较低的链首先被处理,并且可以是负数。

文本值 数字值 地址系列 钩子

raw

-300

ip,ip6,inet

all

mangle

-150

ip,ip6,inet

all

dstnat

-100

ip,ip6,inet

prerouting

-300

bridge

prerouting

filter

0

ip,ip6,inet,arp,netdev

all

-200

bridge

all

security

50

ip,ip6,inet

all

srcnat

100

ip,ip6,inet

postrouting

300

bridge

postrouting

out

100

bridge

output

链策略

如果此链中的规则没有指定任何操作,则链策略定义 nftables 是否应该接受或丢弃数据包。可以在链中设置以下策略之一:

  • accept (默认)
  • drop

常规链

nft add chain <table_address_family> <table_name> <chain_name>

查看链

nft list chains #列出所有链信息 nft list chain 族类型 表名 链名 

编辑链

想要编辑链,只需按其名称调用它并定义要更改的规则

nft chain <table_address_family> <table_name> <chain_name> { type <type> hook <hook> priority <priority> \; policy <policy> \; }

删除链

和删除表一样通过delete参数

 nft delete chain 族类型 表名 链名

刷新来自链的规则

清空指定表中特定链的所有规则,但保留该链的结构和配置

nft flush chain 族类型 表名 链名

举例

定义一个表为filter-table,定义一个链为input-chain,设置类型为filter,hook为input,优先级为-10

nftables(2)表、链、规则查询和管理(新增、插入、修改、删除)
如上图所示,我们通过add chain命令添加了链,没有指定任何policy参数,此时默认的参数为accept

此时需要将该链默认动作指定为drop,应该怎么做呢?

通过如下方式可以实现,但是该命令的后果将会直接拒绝所有input的数据包,切记不可随意配置。该动作就相当于我们iptables中默认的filter链中INPUT表的默认动作。

nft chain ip filter-table input-chain '{ type filter hook input priority -10 ; policy drop ; }'

规则

规则定义对通过包含此规则的链的数据包执行的操作。规则由表达式或语句构成,并包含在链中。如果规则还包含匹配表达式,则 nftables 仅在所有之前的表达式都应用时才执行操作。

添加规则

nft add rule <table_address_family> <table_name> <chain_name> <rule> 此命令在链的末尾附加新规则。 如果要在链的开头添加一条规则,请使用 nft insert 命令而不是 nft add

指定位置添加规则

在iptables中我们可以通过在rule前面添加序号来删除增加规则和设置匹配顺序,在nftables中同样也可以通过该方式实现,那么就是handle参数

nft add rule <table_address_family> <table_name> <chain_name> <handle> <rule> 如果未指定handle值,则默认在最后添加规则 如果要在指定位置插入规则,则需要使用如下命令 nft insert rule <table_address_family> <table_name> <chain_name> <handle> <rule> 此时如果未指定handle值,则在链开头添加规则

查看规则

nft list chain 族类型 表名 链名 nft --handle list chain 族类型 表名 链名 nft -a list chain 族类型 表名 链名 通过-a/--handle参数可以查看携带handle值的规则信息

删除规则

单个规则只能通过handle删除。

 nft delete rule <table_address_family> <table_name> <chain_name> handle x 通过对应的handle值删除对应的规则

刷新规则

# nft flush table 表名 # nft flush chain 族类型 表名 链名

举例

nftables(2)表、链、规则查询和管理(新增、插入、修改、删除)
环境和前面的iptables/firewalld是一样的,本机内网ip地址192.168.140.250

拒绝192.168.140.248访问本机80端口

nftables(2)表、链、规则查询和管理(新增、插入、修改、删除)
通过tcp dport 80 drop拒绝目的端口是80的流量,没有指定任何handle值,因为是add rule所以会在末尾添加规则。通过nft -a参数可以查看handle值,此时值为3

测试访问

nftables(2)表、链、规则查询和管理(新增、插入、修改、删除)
此时已经无法访问无法访问

规则顺序测试

nftables(2)表、链、规则查询和管理(新增、插入、修改、删除)
如上图所示直接通过insert    handle 3插入一个tcp 50-80端口的accept规则,那么此时能否正常访问呢?

nftables(2)表、链、规则查询和管理(新增、插入、修改、删除)
此时已经可以通过140.248正常访问250的80端口了

nftables(2)表、链、规则查询和管理(新增、插入、修改、删除)
直接通过add添加一个规则,阻止tcp50-100端口,那么该条规则就会被插入到末尾,此时,我们80可以正常访问,
注意:真实匹配规则的时候不是按照handle这个数值来匹配的,而是按照规则的前后顺序来匹配的。

nftables(2)表、链、规则查询和管理(新增、插入、修改、删除)
当没有保存nftables规则的时候,通过flush命令就可以清空该条链的规则

总结

上面所介绍的就是nftables基本的表、链、规则的创建和管理,如果熟悉iptables的配置方式的话,那么nftables的配置逻辑理解起来还是相对比较容易的。大家可以多做实验理解表、链、规则的相关性和其互相的关系,如果不是非常清楚,可以参考iptables部分相关的文章。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/110691.html

(0)
上一篇 2026-01-29 20:33
下一篇 2026-01-29 21:00

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信