statistic匹配帮助信息如下。

# iptables -m statistic -hstatistic match options:--mode mode                    Match mode (random, nth)random mode:
[!] --probability p              Probabilitynth mode:
[!] --every n                    Match every nth packet--packet p                      Initial counter value (0 <= p <= n-1, default 0)

如下策略配置,使用nth模式,每三个报文中丢弃第二个报文(报文索引由0开始)。

# iptables -A INPUT -s 192.168.1.105 -p icmp -m statistic --mode nth --every 3 --packet 1 -j DROP
#
# iptables -L -v -n
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)pkts bytes target     prot opt in     out     source               destination         0     0 DROP       icmp --  *      *       192.168.1.105        0.0.0.0/0            statistic mode nth every 3 packet 1

如下策略,对于源自192.168.1.105的ICMP报文,按照50%的概率执行丢弃。

# iptables -A INPUT -s 192.168.1.105 -p icmp -m statistic --mode random --probability 0.5 -j DROP
#
# iptables -L -v -n
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)pkts bytes target     prot opt in     out     source               destination         0     0 DROP       icmp --  *      *       192.168.1.105        0.0.0.0/0            statistic mode random probability 0.50000000000

statistic匹配

函数xt_register_match注册匹配结构xt_statistic_mt_reg。

static struct xt_match xt_statistic_mt_reg __read_mostly = {.name       = "statistic",.revision   = 0,.family     = NFPROTO_UNSPEC,.match      = statistic_mt,.checkentry = statistic_mt_check,.destroy    = statistic_mt_destroy,.matchsize  = sizeof(struct xt_statistic_info),.usersize   = offsetof(struct xt_statistic_info, master),.me         = THIS_MODULE,
};
static int __init statistic_mt_init(void)
{return xt_register_match(&xt_statistic_mt_reg);

配置检查函数如下,检查策略模式的合法性,分配statistic的私有结构xt_statistic_priv。

static int statistic_mt_check(const struct xt_mtchk_param *par)
{struct xt_statistic_info *info = par->matchinfo;if (info->mode > XT_STATISTIC_MODE_MAX ||info->flags & ~XT_STATISTIC_MASK)return -EINVAL;info->master = kzalloc(sizeof(*info->master), GFP_KERNEL);if (info->master == NULL)return -ENOMEM;atomic_set(&info->master->count, info->u.nth.count);

匹配判断函数如下,对于random模式,判断取得的随机值是否小于概率值probability,这里的probability并不是命令行的设置值,而是在iptables中进行了转换(乘以0x80000000),对于以上设置的概率0.5,iptables将probability设置为(0x80000000*0.5),即probability位于(prandom_u32() & 0x7FFFFFFF)的中心位置。

static bool
statistic_mt(const struct sk_buff *skb, struct xt_action_param *par)
{const struct xt_statistic_info *info = par->matchinfo;bool ret = info->flags & XT_STATISTIC_INVERT;int nval, oval;switch (info->mode) {case XT_STATISTIC_MODE_RANDOM:if ((prandom_u32() & 0x7FFFFFFF) < info->u.random.probability)ret = !ret;break;

对于nth模式,在函数statistic_mt_check中将master->count初始化为(every - packet的差值),所以对于首次匹配,count再增加packet数量的计数,就可匹配。对于之后的匹配,计数都是every数量的报文。

    case XT_STATISTIC_MODE_NTH:do {oval = atomic_read(&info->master->count);nval = (oval == info->u.nth.every) ? 0 : oval + 1;} while (atomic_cmpxchg(&info->master->count, oval, nval) != oval);if (nval == 0)ret = !ret;break;}return ret;

内核版本 5.10

iptables匹配statistic相关推荐

  1. 防火墙 之 iptables 匹配条件讲解

     1  概述 iptables命令中,需要根据匹配的条件作出相应的动作,本文将结合例子,讲解匹配条件 匹配条件分为基本和扩展的条件 基本:通用的,PARAMETERS,无需加载模块,由iptables ...

  2. iptables匹配multiport

    multiport匹配帮助信息如下.multiport有三个选项.其中,–source-port(简写–sports)用于指定源端口,多个源端口使用逗号分隔,当指定源端口范围时,使用分号表示区间(po ...

  3. iptables匹配iprange

    iprange匹配帮助信息如下. iprange match options: [!] --src-range ip[-ip] Match source IP in the specified ran ...

  4. iptables匹配功能length

    用于匹配报文特定长度,或者范围,这里的报文长度指的是4层数据的长度,如TCP/UDP/ICMP等.以下仅允许数据包小于100字节的ping请求数据进入. # iptables -I INPUT -p ...

  5. iptables匹配connlimit限制并发连接数量

    以下规则将每个IP的最大并发连接数量控制在5个,使用connlimit-above或者connlimit-upto都可实现. # iptables -I INPUT -p tcp --syn --dp ...

  6. iptables(四)iptables匹配条件总结之一

    经过前文的总结,我们已经能够熟练的管理规则了,但是我们使用过的"匹配条件"少得可怜,之前的示例中,我们只使用过一种匹配条件,就是将"源地址"作为匹配条件. 那么 ...

  7. iptables匹配quota

    quota匹配帮助信息如下. # iptables -m quota -h quota match options: [!] --quota quota quota (bytes) 如下,当主机192 ...

  8. iptables匹配ttl

    TTL匹配帮助信息如下,可判断相等,大于和小于三种关系. # iptables --match ttl -h ttl match options: [!] --ttl-eq value Match t ...

  9. iptables之xtables_addons浅度解析

    xtables_addons 1.46的几个特性是比较有意思,本文不会列出所有的特性,仅仅针对少数几个来分析.也不会给出太具体的配置,因为这些配置都可以从manual上得到或者被google到,以下所 ...

  10. K8S kube-proxy iptables 原理分析

    Precondition 什么是 Kube Proxy Kube Proxy 原理 部署环境 搭建一个GuestBook 例子 分析iptables 1. 创建iptables实现外网通过nodePo ...

最新文章

  1. Jekyll博客统计访问量,阅读量工具总结--LeanCloud,不蒜子,Valine,Google Analytics
  2. 4.2小时完成数万年计算,比超级计算机快亿亿亿倍!量子计算机“祖冲之号”“九章”再升级...
  3. json html显示中文乱码,后台请求json文件,中文出现乱码
  4. C++ Primer 5th笔记(6)chapter6 函数:函数指针
  5. 一个现金流量表的代码
  6. linux搭建ca服务器搭建,linux下安装EJBCA 搭建私有CA服务器
  7. vmware的3种网络模式
  8. CodeForces - 468B Two Sets(并查集+思维)
  9. (z) 傅里叶分析之掐死教程(完整版)
  10. 简单实现顶部固定,中部自适应布局
  11. [0630]Tyvj 1063 数字串
  12. 信息学奥赛一本通 2031:【例4.17】四位完全平方数
  13. tf.nn.sigmoid_cross_entropy_with_logits 分类
  14. Android学习之路五:Dialog和Toast
  15. excel与access结合运用_如何在EXCEL与ACCESS之间建立关联
  16. 常用排序算法总结与英文翻译
  17. find()的基本使用
  18. Python入门学习笔记
  19. Qt建立文件夹、判断文件夹是否存在、文件夹是否为空、清空文件夹
  20. java开发10k到12k面试问题整理

热门文章

  1. linux如何结束at命令,Linux命令总结--at命令(atq.atrm)
  2. github 乱码网页排版
  3. 前端框架 — Bootstrap
  4. 大点符号pt 1初学者指南
  5. leetcode:1000. 合并石头的最低成本(区间dp,困难)
  6. 女性三围--表单只能输入数字和英文输入下的逗号
  7. Vue中金额、日期 格式化插件@formatjs/intl使用
  8. [JT]攻防世界web专项qwq
  9. Failed opening .rdb for saving: Permission denied
  10. Delphi XE2控件安装方法