nft介绍与应用

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 的数据包,即统一了 ipip6 簇,可以更容易地定义规则,注:当没有指定地址簇时,默认为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

(0)
上一篇 2021年8月6日
下一篇 2021年8月6日

相关推荐

发表回复

登录后才能评论