nftables:nft man文档阅读笔记
利用空闲时间学习了nftables的基础知识,其中官方的man page中包含了大量信息,在阅读过程中整理了一份带中文注释的笔记,以辅助加深记忆。
工具名称
nft -- 包过滤规则管理工具
基本用法
nft [ -n | --numeric ] [ -s | --stateless ] [ [-I | --includepath] directory ] [ [-f | --file] filename | [-i | --interactive] | cmd ]
nft [ -h | --help ] [ -v | --version ]
工具描述
nftables 作为新一代的防火墙策略框架,旨在替代之前的各种防火墙工具诸如iptables/ebtables等,而且提供了类似tc的带宽限速能力。而nft则提供了nftables的 命令行入口,是用户空间的管理工具。
选项说明
执行nft --help
查看完整帮助信息
-h, --help
查看帮助信息.
-v, --version
查看版本号.
-n, --numeric
以数值方式展示数据,可重复使用,一个-n表示不解析域名,第二次不解析端口号,第三次不解析协议和uid/gid。
-s, --stateless
省略规则和有状态对象的状态信息
-N
将ip地址解析成域名,依赖dns解析。
-a, --handle
输出内容中展示规则handle信息
-I, --includepath directory
添加include文件搜索目录
-f, --file filename
从文件获取输入
-i, --interactive
从交互式cli获取输入
文件格式
语法规定
单行过长可用\
换行连接;
多个命令写到同一行可用分号;
分隔;
注释使用井号#
打头;
标识符用大小写字母打头,后面跟数字字母下划线正斜杠反斜杠以及点号;
用双引号引起来表示纯字符串。
文件引用
include "filename"
可由外部文件通过include
导入到当前文件,用-I/--includepath
指定导入文件所在目录,如果include后面接的是目录而非文件,则整个目录的文件将以字母顺序依次导入。
符号变量
define variable = expr
$variable
Symbolic variables can be defined using the define statement. Variable references are expressions and can be used initialize other variables. The scope of a definition is the current block and all blocks contained within.
变量使用define
定义,变量引用属于表达式,可以用于初始化其他变量,变量的生效范围在当前block以及被包含的所有block内。
示例 1. 使用符号变量
define int_if1 = eth0
define int_if2 = eth1
define int_ifs = { $int_if1, $int_if2 }
filter input iif $int_ifs accept
地址族
根据处理的包的种类不同可以将其分为不同的地址族。不同的地址族在内核中包含有特定阶段的处理路径和hook点,当对应hook的规则存在时则会被nftables处理。具体类型如下:
ip
IPv4 地址族
ip6
IPv6 地址族
inet
Internet (IPv4/IPv6) 地址族
arp
ARP 地址族
bridge
Bridge 地址族
netdev
Netdev 地址族
所有nftables对象存在于特定的地址族namespace中,换言之所有identifier都含有一个特定的地址族,如果未指定则默认使用ip
地址族
IPv4/IPv6/Inet address families
IPv4/IPv6/Inet 地址族用于处理 IPv4和IPv6包,其在network stack中在不同的包处理阶段一共包含了5个hook.
Table 1. IPv4/IPv6/Inet 地址类hook列表
Hook名称 | 描述 |
---|---|
prerouting | 所有进入到系统的包都会被prerouting hook进行处理. 它在routing流程之前就被发起,用于靠前阶段的包过滤或者更改影响routing的包属性. |
input | 发往本地系统的包将被input hook处理. |
forward | 被转发到其他主机的包会经由forward hook处理. |
output | 由本地进程发送出去的包将被output hook处理. |
postrouting | 所有离开系统的包都将被postrouting hook处理. |
ARP address family
ARP地址族用于处理经由系统接收和发送的ARP包。一般在集群环境中对ARP包进行mangle处理以支持clustering。
Table 2. ARP address family hooks
Hook | 描述 |
---|---|
input | 分发到本机的包会经过input hook. |
output | 由本机发出的包会经过output hook. |
Bridge address family
bridge地址族处理通过桥接设备的ethernet包。
Netdev address family
Netdev地址族处理从ingress过来的包。
Table 3. Netdev address family hooks
Hook | Description |
---|---|
ingress | 所有进入系统的包都将被ingress hook处理。它在进入layer 3之前的阶段就开始处理。 |
Tables
{add | delete | list | flush} table [family] {table}
table是chain/set/stateful object的容器,table由其地址族和名字做标识。地址族必须属于ip, ip6, arp, bridge, netdev中的一种,inet地址族是一个虚拟地址族,同来创建同时包含IPv4和IPv6的table,如果没有指定地址族则默认使用ip
地址族。
add
添加指定地址族,指定名称的table
delete
删除指定的table
list
列出指定table中的所有chain和rule
flush
清除指定table中的所有chain和rule
Chains
{add} chain [family] {table} {chain} {hook} {priority} {policy} {device}
{add | create | delete | list | flush} chain [family] {table} {chain}
{rename} chain [family] {table} {chain} {newname}
chain是rule的容器,他们存在于两种类型,基础链(base chain)和常规链(regular chain)。base chain是网络栈中数据包的入口点,regular chain则可用于jump的目标并对规则进行更好地组织。
add
在指定table中添加新的链,当hook和权重值被指定时,添加的chain为base chain,将在网络栈中hook相关联。
create
与add
命令类似,不同之处在于当创建的chain存在时会返回错误。
delete
删除指定的chain,被删除的chain不能有规则且不能是跳转目标chain。
rename
重命名chain
list
列出指定chain中的所有rule
flush
清除指定chain中所有rule