Linux-nftables

https://netfilter.org/
https://netfilter.org/projects/iptables/index.html
https://netfilter.org/projects/nftables/index.html
https://www.netfilter.org/projects/nftables/manpage.html
https://wiki.nftables.org/wiki-nftables/index.php/Main_Page
https://wiki.nftables.org/wiki-nftables/index.php/Quick_reference-nftables_in_10_minutes
https://wiki.archlinux.org/index.php/Nftables
https://wiki.gentoo.org/wiki/Nftables
https://wiki.gentoo.org/wiki/Nftables/Examples
https://kernelnewbies.org/nftables_examples

1. Linux防火墙简介
2. nftables介绍
3. 为什么要使用nftables
4. Netfilter日志框架
5. nft命令介绍
6. nft基础操作
7. 更多规则选项

1. Linux防火墙简介

Linux系统较早使用的防火墙是(约1996年的Linux 2.0) ipfwadm 和(约1999年的Linux 2.2) ipchains。
基于以上版本经过重新设计和大幅改进后出现了(约2001年的Linux 2.4)的netfilter。一直应用到现在。

  • 包过滤框架:netfilter (约2001年Linux 2.4) 该框架内的软件支持包过滤,网络地址[和端口]转换(NA[P]T)和其他数据包重整。是Linux内核中的一组钩子,允许内核模块向网络堆栈注册回调函数。然后,对于遍历网络堆栈内的相应挂钩的每个数据包,回调注册的回调函数。
  • 用户工具集:iptables, nftables等
    • iptables (约2001年Linux 2.4) 是用户空间命令行程序,用于配置netfilter包过滤规则集。
    • nftables (约2013年Linux 3.13) 旨在取代现有iptables的{ip,ip6,arp,eb}表框架。(iptables,ip6tables,arptables,etables用于以太网桥过滤的功能。)


补充:firewalld也是Linux的防火墙,同时支持iptables和nftables,最新版本默认使用nftables。简单的说firewalld是基于nftfilter防火墙的用户界面工具。而iptables和nftables是命令行工具。firewalld引入区域的概念,可以动态配置,让防火墙配置及使用变得简便。详见firewalld.org

netfilter, iptables, nftables 都是netfilter项目。nftables 用于替代 iptables。
netfilter的功能很强大,远远超越防火墙的范围,详见项目主页。

2. nftables介绍

本文主要记录较新的nftables的特性及nft工具的使用。
nftables 提供了一个新的包过滤框架,该框架基于特定于网络的虚拟机(VM),一个新的用户空间实用程序(nft)和一个用于{ip,ip6}表的兼容层。
它使用现有的钩子,连接跟踪系统,用户空间排队组件和netfilter的日志子系统。
它由三个主要组件组成:内核实现,libnl netlink通信和nftables用户空间前端。
内核提供了netlink配置接口,以及运行时规则集评估,
libnl包含用于与内核通信的低级函数,
而nftables前端是用户通过nft进行交互的内容。

从Linux内核3.13版本开始(2013),nftables已经成为Linux内核主线的一部分。正在逐渐替换iptables。

3. 为什么要使用nftables

https://developers.redhat.com/blog/2016/10/28/what-comes-after-iptables-its-successor-of-course-nftables/
nftables对旧iptables提供的最显着的功能有:
支持查找表 - 无需进行线性规则评估
不再强制执行隐式规则计数器和地址/接口匹配的开销
拥有使用额外脚本的能力。
nftables不包含任何内置表。

可用性:
事务规则更新 - 所有规则都以原子方式应用
应用程序可以订阅nfnetlink通知,以便在添加或删除新规则时接收规则更新
nft命令行工具可以显示正在匹配的规则的实时日志,以便于规则集调试

nftables重用了netfilter框架的许多部分,例如连接跟踪和NAT设施。它还保留了命名法和基本iptables设计的几个部分,例如表格,链条和规则。
就像使用iptables一样,表充当链的容器,链包含单独的规则,可以执行诸如丢弃数据包,移动到下一个规则或跳转到新链的操作。

什么被替换?
从用户的角度来看,nftables添加了一个名为nft的新工具,它取代了iptables,arptables和ebtables中的所有其他工具。从架构的角度来看,它还取代了处理包过滤规则集的运行时评估的内核部分。

允许监控规则更新。nft工具可用于监视规则集中的更改,例如“nft monitor”显示从内核添加和删除的每个规则。
它还提供“跟踪模式”,系统管理员可以在此处执行“添加规则修改” prerouting ip saddr 10.2.3.4 meta nftrace set 1'。
然后,“nft monitor trace”将显示与来自IP地址10.2.3.4的数据包匹配的每个规则。

4. Netfilter日志框架

Nftables 7 : Nftables Logging
http://computer-outlines.over-blog.com/article-nftables-7-nftables-logging-123303629.html
/proc/net/netfilter/nf_log
从Linux 2.6.14开始,可以通过内核数据包过滤器记录的用户空间数据包进行传递。
有两个工具:
QUEUE et NFQUEUE:外部应用程序用于决策(SNORT IDS / IPS,NuFW,ulogd,...)
LOG et NFLOG:用于外部日志记录(Wireshark,Syslog,...)

NFlog是一个新的iptables和Nftables的目标是通过虚拟设备记录数据包。
NFLOG目标会复制数据包并将其发送到指定的netlink套接字。

$ sudo cat /proc/net/netfilter/nf_log
 0 NONE ()
 1 NONE ()
 2 NONE ()// IPv4
 3 NONE ()
 4 NONE ()// Novell IPX
 5 NONE ()
 6 NONE ()
 7 NONE ()
 8 NONE ()
 9 NONE ()
10 NONE ()// IPv6
11 NONE ()
12 NONE ()
// 行号是协议。
比如启用IPv6 nfnetlink_log:
echo "nfnetlink_log" > /proc/sys/net/netfilter/nf_log/10
$ ls /proc/net/netfilter/nf_log
/proc/net/netfilter/nf_log
$ ls /proc/sys/net/netfilter/nf_log
0  1  10  11  12  2  3  4  5  6  7  8  9
$ sudo cat /proc/net/netfilter/nf_log
...
10 nfnetlink_log(nfnetlink_log)

5. nft命令介绍

不同与iptables,nftables不包含任何内置表。还拥有使用额外脚本的能力, 拥有一些高级的类似编程语言的能力,例如定义变量和包含外部文件。
与iptables类似的是,表层次结构:表包含链,链里是具体的过滤规则。处理规则则由 地址,接口,端口或包含当前处理数据包中的其他数据等表达式以及诸如drop, queue, continue等声明组成。
可以用于多种地址族的过滤和处理:

  • ip: IPv4 地址
  • ip6: IPv6 地址
  • inet: IPv4 和 IPv6 地址
  • arp: 地址解析协议(ARP)地址
  • bridge: 处理桥接数据包


注:当没有指定地址族时,默认为IP。

特定的地址族包含钩子,对ip,ipv6,和inet地址族来说,可以应用如下钩子

  • prerouting: 刚到达并且未被处理过的数据包
  • input: 已经被接收并且已经经过prerouting钩子的传入数据包
  • forward: 如果数据包将被发送到另一个设备,他将会通过forward钩子
  • output: 从本地系统传出的数据包
  • postrouting: 仅仅在离开系统之前


ARP地址族只能使用input和output钩子。

$ nft -h
  -h, --help 显示帮书
  -v, --version 显示版本信息

  -c, --check 检查命令的有效性,而不实际应用更改。
  -f, --file <filename> 包含文件内容<filename>
  -i, --interactive 从命令行读取输入

  -j, --json 以JSON格式化输出
  -n, --numeric 指定一次后,以数字方式显示网络地址(默认行为)。
  指定两次以数字方式显示Internet服务(端口号)。
指定三次以数字方式显示协议,用户ID和组ID。
  -s, --stateless 省略规则集的有状态信息。
  -N 将IP地址转换为名称。
  -a, --handle 显示规则句柄handle.
  -e, --echo Echo what has been added, inserted or replaced.
  -I, --includepath <directory> 添加<directory>目录到包含文件的搜索路径中。默认为: /usr/share
  --debug <level [,level...]> 添加调试,在level处(scanner, parser, eval, netlink, mnl, proto-ctx, segtree, all)

# nft 操作符 操作目标 操作内容
操作符: 增,删,改,查,清除,插入,创建
操作目标: 表,链(),规则()
表操作(add,delete,list,flush;
链操作(add,delete,rename,list,flush,create);链类型(type:filter,route,nat);链钩子(hook...)
规则(add,delete,insert;
操作内容:...

查询所有表名
nft list tables

查询某个表的内容
nft list table 表名

    \Subcmd→
cmd↓\
表语法
table
链语法
chain
规则语法
rule
备注
add添加到末尾
create除非已存在同名链
insert插入到指定位置
delete 
flush 
rename链名称
list 

 

6. nft基础操作

https://yq.aliyun.com/articles/531207
1、增
增加表:nft add table fillter
增加链:nft add chain filter input { type filter hook input priority 0 \; } # 要和hook(钩子)相关连
增加规则:nft add rule filter input tcp dport 22 accept
2、删
只需要把上面的 add 改为 delete 即可
3、改
更改链名用rename
更改规则用replace
4、查
nft list ruleset # 列出所有规则
nft list tables # 列出所有表
nft list table filter # 列出filter表
nft chain filter input # 列出filter表input链
以上命令后面也可以加 -nn  用于不解析ip地址和端口
加 -a 用于显示 handles

7. 更多规则选项

声明

1accept接受接受 包停止处理
2drop丢弃丢弃 包停止处理
3reject拒绝驳回 包停止处理
4queue队列发送包 到用户空间程序停止处理
5continue继续继续处理包 
6return返回发送到调用的规则链进行处理 
7jump
<chain>
跳跃发送到指定的规则链进行处理当完成时或执行了返回的声明,返回到调用的规则链
8goto
<chain>
转到发送到指定的规则链进行处理不返回到调用的规则链
9limitlimit达到接收包的匹配限制,则根据规则处理包
10loglog日志记录 包继续处理

meta 元表达式

66metartclassidRouting realm路由领域     
67lengthLength of the packet in bytes: meta length > 1000以字节为单位的数据包长度:元长度> 1000     
68protocolethertype protocol: meta protocol vlanethertype协议:元协议vlan     
69priorityTC packet priorityTC包优先级     
70markPacket mark包标记     
71iifInput interface index输入接口索引76metaoifOutput interface index输出接口索引
72iifnameInput interface name输入接口名称77oifnameOutput interface name输出接口名称
73iiftypeInput interface type输入接口类型78oiftypeOutput interface hardware type输出接口硬件类型
74skuidUID associated with originating socket与原始套接字关联的UID79skgidGID associated with originating socket与原始套接字关联的GID
75iifgroup Input interface group输入接口组80oifgroupOutput interface group输出接口组

ct 连接跟踪

54ctdirectionDirection of the packet relative to the connection数据包相对于连接的方向     
55markConnection mark连接标记     
56expirationConnection expiration time连接到期时间     
57helperHelper associated with the connection辅助与连接相关联     
58l3protoLayer 3 protocol of the connection连接的第3层协议     
59protocolLayer 4 protocol of the connection for the given direction给定方向的连接的第4层协议     
60stateState of the connection连接状态63ctstatusStatus of the connection连接状态
61saddrSource address of the connection for the given direction给定方向的连接的源地址64daddrDestination address of the connection for the given direction给定方向的连接的目标地址
62proto-srcLayer 4 protocol source for the given direction给定方向的第4层协议源65proto-dstLayer 4 protocol destination for the given direction给定方向的第4层协议目的地

IPv4 IPv6 报头表达式

1iphdrlengthIP header lengthIP标头长度     
2tosType of Service服务类型     
3idIP IDIP ID     
4frag-offFragmentation offset碎片偏移     
5ttlTime to live生存的时间     
6protocolUpper layer protocol上层协议     
7checksumIP header checksumIP头校验和     
8versionIp Header versionIp Header版本12ip6versionIP header versionIP标头版本
9saddrSource address来源地址13saddrSource Address来源地址
10daddrDestination address目的地址14daddrDestination Address目的地址
11lengthTotal packet length总包长度15lengthPayload length有效载荷长度
     16priority 优先
     17nexthdrNext header type (Upper layer protocol number)下一个标题类型
(上层协议号)
     18flowlabelFlow label流标签
     19hoplimitHop limit跳限制

TCP UDP 报头表达式

20tcpsequenceSequence number序列号     
21ackseqAcknowledgement number致谢号码     
22doffData offset数据偏移     
23flagsTCP flagsTCP标志     
24windowWindow窗口     
25urgptrUrgent pointer紧急指针     
26sportSource port源端口29udpsportSource port源端口
27dportDestination port目的端口30dportdestination port目的端口
28checksumChecksum校验31checksumChecksum校验
     32lengthTotal packet length总包长度

其他匹配项目

33udplitesportSource port源端口
34dportdestination port目的端口
35cscovChecksum coverage校验和覆盖范围
36checksumChecksum校验
37sctpsportSource port源端口
38dportdestination port目的端口
39vtagVerification tag验证标签
40checksumChecksum校验
41dccpsportSource port源端口
42dportdestination port目的端口
43ahnexthdrNext header protocol (Upper layer protocol)下一个标头协议(上层协议)
44hdrlengthAH header lengthAH标头长度
45spiSecurity Parameter Index安全参数索引
46sequenceSequence Number序列号
47espspiSecurity Parameter Index安全参数索引
48sequenceSequence Number序列号
49ipcompnexthdrNext header protocol (Upper layer protocol)下一个标头协议(上层协议)
50flagsFlags
51cfiCompression Parameter Index压缩参数索引
52icmptypeicmp packet typeicmp数据包类型
53icmpv6typeicmpv6 packet typeicmpv6数据包类型