nft
nft 介绍
nftables 是新的数据包分类框架,新的linux防火墙管理程序,旨在替代现存的 {ip,ip6,arp,eb}_tables,在 Linux 内核版本高于 3.13 时可用。提供一个新的命令行工具 nft,语法与 iptables 不同。
官方Wiki:https://wiki.nftables.org
官方文档:https://www.netfilter.org/projects/nftables/manpage.html
参考文档:https://www.mankier.com/8/nft
nft 相关概念
nftables 和 iptables 一样,由表(table)、链(chain)和规则(rule)组成,其中表包含链,链包含规则,规则是真正的 action,规则由地址,接口,端口或包含当前处理数据包中的其他数据等表达式以及诸如drop, queue, continue等声明组成。
与 iptables 相比,nftables 主要有以下几个变化:
- iptables 规则的布局是基于连续的大块内存的,即数组式布局;而 nftables 的规则采用链式布局,即数组和链表的区别
- iptables 大部分工作在内核态完成,如果要添加新功能,只能重新编译内核;而 nftables 的大部分工作是在用户态完成的,添加新功能更加容易,不需要改内核
- nftables不包含任何内置表和链
- 拥有使用额外脚本的能力, 拥有一些高级的类似编程语言的能力,例如定义变量和包含外部文件
- iptables 有内置的链,即使只需要一条链,其他的链也会跟着注册;而 nftables 不存在内置的链,可以按需注册。由于 iptables 内置了一个数据包计数器,所以即使这些内置的链是空的,也会带来性能损耗
- 简化了 IPv4/IPv6 双栈管理
- 原生支持集合、字典和映射
nftables 的每个表只有一个地址簇,并且只适用于该簇的数据包。表可以指定五个簇中的一个:
nftables簇 | iptables命令行工具 |
---|---|
ip IPv4 地址 | iptables |
ip6 IPv6 地址 | ip6tables |
inet IPv4 和 IPv6 地址 | iptables和ip6tables |
arp 地址解析协议(ARP)地址 | arptables |
bridge 处理桥接数据包 | ebtables |
inet
同时适用于 IPv4 和 IPv6 的数据包,即统一了 ip
和 ip6
簇,可以更容易地定义规则,注:当没有指定地址簇时,默认为ip
IPv4/IPv6/Inet address family hooks
┌────────────┬──────────────────────────────────────┐
│Hook │ Description │
├────────────┼──────────────────────────────────────┤
│prerouting │ All packets entering the system are │
│ │ processed by the prerouting hook. It │
│ │ is invoked before the routing │
│ │ process and is used for early fil‐ │
│ │ tering or changing packet attributes │
│ │ that affect routing. │
├────────────┼──────────────────────────────────────┤
│input │ Packets delivered to the local sys‐ │
│ │ tem are processed by the input hook. │
├────────────┼──────────────────────────────────────┤
│forward │ Packets forwarded to a different │
│ │ host are processed by the forward │
│ │ hook. │
├────────────┼──────────────────────────────────────┤
│output │ Packets sent by local processes are │
│ │ processed by the output hook. │
├────────────┼──────────────────────────────────────┤
│postrouting │ All packets leaving the system are │
│ │ processed by the postrouting hook.
链是用来保存规则的,和表一样,链也需要被显示创建,因为 nftables 没有内置的链。链有以下两种类型:
- 基本链 : 数据包的入口点,需要指定钩子类型和优先级,相当于内置链
- 常规链 : 不需要指定钩子类型和优先级,可以用来做跳转,从逻辑上对规则进行分类,类似于自定义链
范例:
[root@centos8 ~]#rpm -ql nftables
/etc/nftables
/etc/nftables/all-in-one.nft
/etc/nftables/arp-filter.nft
/etc/nftables/bridge-filter.nft
/etc/nftables/inet-filter.nft
/etc/nftables/ipv4-filter.nft
/etc/nftables/ipv4-mangle.nft
/etc/nftables/ipv4-nat.nft
/etc/nftables/ipv4-raw.nft
/etc/nftables/ipv6-filter.nft
/etc/nftables/ipv6-mangle.nft
/etc/nftables/ipv6-nat.nft
/etc/nftables/ipv6-raw.nft
/etc/nftables/netdev-ingress.nft
/etc/sysconfig/nftables.conf
/usr/lib/.build-id
/usr/lib/.build-id/68
/usr/lib/.build-id/68/8ad5e5fdc5ba8d10bf227ba50d77fd99040c1c
/usr/lib/.build-id/cc
/usr/lib/.build-id/cc/43827ec42d27875c99ce6bd0f0537614e0129a
/usr/lib/systemd/system/nftables.service
/usr/lib64/libnftables.so.0
/usr/lib64/libnftables.so.0.0.0
/usr/sbin/nft
/usr/share/licenses/nftables
/usr/share/licenses/nftables/COPYING
/usr/share/man/man8/nft.8.gz
[root@centos8 ~]#cat /etc/sysconfig/nftables.conf
#
# This this will contain your nftables rules and
# is read by the systemd service when restarting
#
# These provide an iptables like set of filters
# (uncomment to include)
# include "/etc/nftables/bridge-filter.nft"
# include "/etc/nftables/inet-filter.nft"
# include "/etc/nftables/ipv4-filter.nft"
# include "/etc/nftables/ipv4-mangle.nft"
# include "/etc/nftables/ipv4-nat.nft"
# include "/etc/nftables/ipv6-filter.nft"
# include "/etc/nftables/ipv6-mangle.nft"
# include "/etc/nftables/ipv6-nat.nft
[root@centos8 ~]#systemctl start nftables
nft 常见用法
nft 命令格式
[root@centos8 ~]#nft --help
Usage: nft [ options ] [ cmds... ]
选项说明
-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>目录到包含文件的搜索路径中。默认为: /etc
--debug <level [,level...]> 添加调试,在level处(scanner, parser, eval, netlink, mnl, proto-ctx, segtree, all)
nft 命令基本格式
nft 操作符 操作目标 操作内容
操作符: 增,删,改,查,清除,插入,创建
操作目标: 表,链,规则
表操作:add,delete,list,flush
链操作:add,delete,rename,list,flush,create
链类型:filter,route,nat
链钩子:hook
规则:add,delete,insert
操作内容:...
规则选项
1 | accept | 接受 | 接受 包 | 停止处理 |
---|---|---|---|---|
2 | drop | 丢弃 | 丢弃 包 | 停止处理 |
3 | reject | 拒绝 | 驳回 包 | 停止处理 |
4 | queue | 队列 | 发送包 到用户空间程序 | 停止处理 |
5 | continue | 继续 | 继续处理包 | |
6 | return | 返回 | 发送到调用的规则链进行处理 | |
7 | jump |
跳跃 | 发送到指定的规则链进行处理 | 当完成时或执行了返回的声明,返回到调用的规则链 |
8 | goto |
转到 | 发送到指定的规则链进行处理 | 不返回到调用的规则链 |
9 | limit | limit | 达到接收包的匹配限制, | 则根据规则处理包 |
10 | log | log | 日志记录 包 | 继续处理 |
查看
nft list ruleset # 列出所有规则
nft list tables # 列出所有表
nft list table filter # 列出ip簇的filter表
nft list table inet filter # 列出inet簇的filter表
nft list chain filter input # 列出filter表input链
以上命令后面也可以加 -nn 用于不解析ip地址和端口
加 -a 用于显示 handles
范例:
[root@centos8 ~]#nft list tables
[root@centos8 ~]#vim /etc/sysconfig/nftables.conf
#删除此行前的注释
include "/etc/nftables/inet-filter.nft"
[root@centos8 ~]#systemctl restart nftables.service
[root@centos8 ~]#nft list tables
table inet filter
#默认为ip簇,无规则
[root@centos8 ~]#nft list table filter
Error: Could not process rule: No such file or directory
list table filter
^^^^^^
[root@centos8 ~]#nft list table inet filter
table inet filter {
chain input {
type filter hook input priority 0; policy accept;
}
chain forward {
type filter hook forward priority 0; policy accept;
}
chain output {
type filter hook output priority 0; policy accept;
}
}
[root@centos8 ~]#nft list ruleset
table inet filter {
chain input {
type filter hook input priority 0; policy accept;
}
chain forward {
type filter hook forward priority 0; policy accept;
}
chain output {
type filter hook output priority 0; policy accept;
}
}
增加
增加表: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
删
只需要把上面的 add 改为 delete 即可
改
更改链名用rename
更改规则用replace
本文链接:http://www.yunweipai.com/35076.html
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/52540.html