首页 > 其他分享 >nftables(8)表达式(4)使用举例

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

时间:2024-07-12 17:56:45浏览次数:10  
标签:arp 匹配 140.248 192.168 信息 nftables 举例 数据包 表达式

简介

        前几篇文章已经介绍了表达式的基本概念,数据类型、还有各种不同类型的表达式规则。表达式的使用方式非常复杂也非常灵活,具体怎么使用要根据自己的实际需求来确定。本篇文章主要介绍集中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配置与实现方式的逻辑。

标签:arp,匹配,140.248,192.168,信息,nftables,举例,数据包,表达式
From: https://blog.csdn.net/weixin_42064802/article/details/140370537

相关文章

  • c++参数包展开和折叠表达式
    template<typenameT>voidfun2(Tt){cout<<t<<endl;}//利用逗号表达式和初始化列表展开template<typename...Arg6>voidfun1(Arg6...args){intarr[]={(fun2(args),0)...};}template<typenameT>intfunc3Imp(T&&t......
  • [regex]正则表达式
    1.参考及测试文本正则表达式在线测试工具,选python语言,python字符串前直接加r防止正则表达式被转义github上找的学习资料测试字符串(随便敲的)ThefatcatsatonthematThecarparkedinthegarageAgarageisagoodplacetoparkacargoodplace.Thefatcatsat......
  • 数据结构笔记之表达式求值
    概念:运算是由运符和操作数组成的,DIY概念指的是左操作数、右操作数和运符之间的关系。中缀表达式:运符位于操作数之间,这是我们日常生活中最常用的表达式形式。后缀表达式:运符在操作数后面,这种表达式形式没有括号,易于解析。前缀表达式:运符在操作数前面,同样没有括号,但需要遵循不同......
  • Go语言---面向对象编程-匿名字段、同名字段、方法、方法集、方法的继承与重写、方法值
    基本概念对于面向对象编程的支持Go语言设计得非常简洁而优雅。因为,Go语言并没有沿袭传统面问对象编程中的诸多概念,比如继承(不支持继承,尽管匿名字段的内存布局和行为类似继承,但它并不是继承)、虚函数、构造所数和析构函数、隐藏的this指针等。尽管Go语言中没有封......
  • 正则表达式
    正则表达式RegularExpress【1】、三剑客与正则表达式1、注意事项正则符号都是英文符号,避免使用中文符号推荐使用grep/egrep命令,默认设置了别名alias,自动加上颜色【2】、符号概述正则:regularexpression(RE)正则表达式regularexpression符号基础正则BRE^......
  • cron表达式和crontab表达式
    每次写cron表达式老是迷迷糊糊不敢肯定,特此记录crontab表达式*****分时日月周域值范围域数值字符备注秒[第一位]0~59-*/,-分[第二位]0~59-*/ ,-时[第三位]0~59-*/ ,-日[第四位]1~31-*?/ ,LWC -月[第五位]1~12JAN-DEC[月份简写] -*/ ,-......
  • [C++] C++20约束表达式和requires子句
    约束约束是逻辑操作和操作数的序列,它指定了对模板实参的要求。合取两个约束的合取是用&&运算符。template<typenameT>conceptluser=std::integral<T>&&std::signed_integral<T>;需要约束同时满足两个要求。合取判断的时候,使用短路检测,即对std::integra......
  • Spark SQL中的正则表达式应用
    正则表达式是一种强大的文本处理工具,在SparkSQL中也得到了广泛支持。本文将介绍SparkSQL中使用正则表达式的主要方法和常见场景。目录1.正则表达式函数1.1regexp_extract1.2regexp_replace1.3regexp_like2.在WHERE子句中使用正则表达式3.在GROUPBY中使用正......
  • xxl-job中的cron表达式详解
    一、xxl-job的简介xxl-job是一个轻量级分布式任务调度平台,核心的设计目标:学习简单、开发迅速、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。而且有较为完善的说明文档《分布式任务调度平台XXL-JOB》和图形化操作界面。xxl-job是开源项目,在GitHub......
  • Day 10 逆波兰表达式求值,滑动窗口的最大值,前k个高频词
    逆波兰表达式求值逆波兰表达式:是一种后缀表达式,所谓后缀就是指运算符写在后面。#include<iostream>usingnamespacestd;#include<stack>strings;intmain(){ strings; cin>>s; stack<int>u; for(inti=0;i<s.size();i++) { if(s[i]=='+'|......