nttables 由三个主要组件组成: + 内核实现 + libnl netlink通信 + nftables用户空间前端

nftables 使用时会接触到四个概念:簇、表、链、规则。

nftables簇与iptables相应的程序对应:

nftables簇iptables实用程序
ipiptables
ip6ip6tables
inetiptables和ip6tables
arparptables
bridgeebtables

ip是默认簇,未指定时即为默认;inet是ip+ip6,inet不能用于nat链,只能用于filter链。

nftables 没有内置表,不限制表的创建,但是每个表属于一个簇(family),即只能适用于该簇的数据包。

链的目的是保存规则。与iptables中的链不同,nftables没有内置链。这意味着与iptables不同,如果链没有使用netfilter框架中的任何类型或钩子,则流经这些链的数据包不会被nftables触及。

链有两种类型 + 基本链是来自网络栈的数据包的入口点,需要指定钩子和优先级值。 + 常规链可以作为更好地处理的跳转目标。

规则由语句或表达式构成,包含在链中。

表达式由三部分组成:匹配 -> 判断 -> 处理,例如匹配某个协议的数据包,对其判断后,可以决定丢弃还是继续。

可用匹配的部分列表:

  • meta (元属性,如接口)
  • icmp (ICMP协议)
  • icmpv6 (ICMPv6协议)
  • ip (IP协议)
  • ip6 (IPv6协议)
  • tcp (TCP协议)
  • udp (UDP协议)
  • sctp (SCTP协议)
  • ct (链接跟踪)

使用示例

# 创建表
nft add table [family] [table-name]
# 列出表
nft list tables
# 列出表中的链和规则
nft list table [family] [table-name]
# 清空表,清空一个表中的所有规则
nft flush table [family] [table-name]
# 删除一个表,只能删除不包含链的表
nft flush table [family] [table-name]

# 创建链:常规链
nft add chain [family] [table-name] [chain-name]
# 创建链:基本链
nft add chain [family] [table-name] [chain-name] { type [type-name] hook [hook-name] priority [num] \; }
# 列出一个链中的所有规则
nft list chain [family] [table-name] [chain-name]
# 编辑链:要编辑一个链,只需按名称调用并定义要更改的规则
nft chain [family] [table-name] [chain-name] { [ type [type-name] hook [hook-name] device [device] priority [num] \; policy [默认行为] \; ] }
# 清空链:清空一个链的规则
nft flush chain [family] [table-name] [chain-name]
# 删除链:要删除的链不能包含任何规则或者跳转目标
nft delete chain [family] [table-name] [chain-name]

# 添加规则
nft add rule [family] [table-name] [chain-name] handle [插入位置] [规则表达式]
# 删除单个规则:使用句柄删除
nft delete rule [family] [table-name] [chain-name] handle [num]
# 确定规则的句柄
nft --handle list
# 

参考