当前位置:网站首页 > 技术博客 > 正文

nftables(6)表达式(4)使用举例

简介

        前几篇文章已经介绍了表达式的基本概念,数据类型、还有各种不同类型的表达式规则。表达式的使用方式非常复杂也非常灵活,具体怎么使用要根据自己的实际需求来确定。本篇文章主要介绍集中nftables中的策略设置,以便加深对表达式的理解。

实验环境

和我们在做iptables、firewalld测试时的环境是一模一样,内部区域为192.168.140.0/24网段,nftables配置在主机B上,分为内部区域,和外部区域。其中主机A的网关是主机B 192.168.140.250,主机B的网关是主机C模拟的公网192.168.170.128。
​​​​​
清空现有防火墙的配置信息

限速

我们在做iptables和firewalld测试的时候都做过相关数据包限速的功能,大家还记得iptables/firewalld是如何实现对数据包进行限速的吗?如果不记得可以查看前面有关iptables和firewalld的相关文章。

基于数据包限速 

假设我都nftables主机的192.168.140.250接口每分钟最多接收10个ICMP echo-request报文,那么我们该如何设置呢?

如上图所示,先创建一个table filter,然后在这个filter中创建一个chain名称为input,然后关联都input钩子上,优先级为-10,默认策略accept。
该命令配置一个icmp 类型为echo-request的数据包的速率为每分钟10个数据包,注意我们是在input调用的。那么此时我们的限速策略有效果吗?
此时是没有效果的,因为我们的默认策略是accept,所以要想有效果,需要在后面再添加一条拒绝icmp的策略。
此时再追加一条策略,默认动作是drop,注意,drop就会丢弃数据包,不会返回任何信息。
注意,这些序号是不连续的,如果想要看到更好的效果,可以将动作修改为reject
将动作修改为reject后就会有对应的提示
此时不通的时候就会有对应的提示,因为我们设置的是10/minute,即每分钟10个数据包,每6秒接收一个数据包,中间就会有5个数据包会被reject,前面有5个数据包是默认通的,因为默认的burst是5,可以通过修改burst来修改这个数值
添加一个burst为10packets
此时就会先放行10个数据包不受我们策略限速的影响,这里使用的是令牌桶算法,详细的算法解释请会看iptables有关限速部分的内容,有详细的介绍信息。

基于速率的限速

如果我想要限速从192.168.140.248接收数据包的速率限制为1mbytes/s该如何限制呢?

通过ip saddr限制数据包的源IP地址,通过rate 1 mbytes/second限制速率为1动作为accept,第二条命令即超过1mbytes/second动作为drop
此时就可以看到对应的限速效果。

匹配数据包头部信息

匹配以太网头部信息

        现在我要匹配从192.168.140.128来的数据包的数量信息,但是不是通过ip地址来匹配,而是通过mac地址来匹配进行计数,该如何操作呢?

这是192.168.140.248的mac地址
这里直接通过ether 和counter参数来进行基于源mac地址来的数据包进行计数,当从192.168.140.248接口ping192.168.140.250时,就会匹配该规则进行计数了。

匹配IP头部信息

        其实我们前面所配置的ip saddr就已经匹配了IP头部的ip地址信息字段了,ip头部有哪些信息可以通过前面的文章进行回顾一下,我这里也放一张简单的图来看一下:

通过ip protocol tcp 来计算tcp连接数量,有关更多的ip头部匹配信息,可以查看上篇文章payload expression的相关介绍。

匹配tcp端口信息

匹配从248来的目标tcp端口为1000-2000,3000的数据包

匹配arp头部信息

arp地址族

ARP地址族处理系统接收和发送的ARP报文。它通常用于对ARP报文进行分组。

ARP address family hooks
钩子(Hook) 描述(Description)
input 发送到本地系统的数据包通过输入钩子(input hook)进行处理。
output 由本地系统发送的数据包通过输出钩子(output hook)进行处理。

可以通过限制arp信息来限制某些arp请求,例如,现在需要限制拒绝接收192.168.140.248来的arp请求,即丢弃从192.168.140.248来的arp请求。

创建arp的表filter-arp,然后创建arp链,匹配input钩子,默认动作为accept
将从192.168.140.248来的arp数据包drop掉

测试

在192.168.140.248上查看arp表,然后清空arp缓存。此时已经没有了192.168.140.250相关的arp信息

此时ping不通,是因为本地没有192.168.140.250的mac地址,通过arp请求时,140.250 drop掉了所有的从192.168.140.248来的arp请求。

手动添加arp信息 

在192.168.140.248上手动添加140.250的mac地址信息
同理在192.168.140.250上添加248的arp信息
此时在192.168.140.248就可以正常ping通192.168.140.250了

匹配路由信息

如果我想要记录本机通过default路由条目访问的数据包数量信息,应该如何记录呢?
在filter表中添加一个postrouting链,并且将其与postrouting钩子关联,优先级为-10,默认策略为accept
添加一条规则,rt即路由表达式,大家可以参考路由表达式中的介绍,nexthop即下一跳地址,默认路由的下一跳地址为192.168.140.2,所以我这里写为这个地址,然后通过counter计数。
此时就可以看到数据统计信息

匹配元数据信息

匹配接口信息

如果我需要匹配这台主机的接口数据信息,那么可以直接通过前面介绍的元数据表达式来实现该功能。

直接通过iif 加上接口

基于时间匹配策略

如果我们在应用策略的时候需要设置策略的生效时间,那么可以基于时间设置。比如每天8:00-19:00拒绝从192.168.140.199来的数据包,那么我们该如何做呢?

day 1-5表示星期一到星期五

匹配连接状态

我们在iptables --state模块中介绍过有关连接状态的信息,在firewalld中也有介绍对应的信息,详细介绍可以参考iptables扩展模块--state,nftables可以通过CONNTRACK EXPRESSIONS表达式来设置对应内容。

设置本机可以主动发起连接,但是不能被动连接

设置本机可以主动发起连接,但是从192.168.140.248来的数据包不能主动发起连接。

ct state new表示匹配新建的连接,动作为reject
此时从192.168.140.248访问250就不能主动发起连接了,但是250可以向248主动发起连接,因为主动发起连接后回来的数据包匹配不了ct state new的策略,后面有accept策略,所以可以正常访问。

总结

以上基本的配置内容只是作为前面表达式的补充,更多的配置方式需要大家自己根据自己的想法和需求进行尝试。可以与我们前面iptables、friewalld中的策略进行对比实验,能更深入的理解iptables、firewalld、nftables配置与实现方式的逻辑。

版权声明


相关文章:

  • 在Ubuntu下rtorrent编译安装笔记2024-10-18 19:01:00
  • Linux 首次引入 nftables2024-10-18 19:01:00
  • entos下rtorrent与rutorrent一键安装包2024-10-18 19:01:00
  • js switch语句的使用2024-10-18 19:01:00
  • JS中switch case,多个case对于同一操作的写法2024-10-18 19:01:00
  • js switch语句多个条件相同处理写法2024-10-18 19:01:00
  • JS switch 语句格式 使用方法2024-10-18 19:01:00
  • vue2到vue3的极简迁移之路2024-10-18 19:01:00
  • 树莓派硬件pwm引脚频率2024-10-18 19:01:00
  • 树莓派 lcd16022024-10-18 19:01:00