IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> iptables匹配rateest -> 正文阅读

[系统运维]iptables匹配rateest

rateest匹配帮助信息如下。

# iptables -m rateest -h

rateest match options:
 --rateest1 name                Rate estimator name
 --rateest2 name                Rate estimator name
 --rateest-delta                Compare difference(s) to given rate(s)
 --rateest-bps1 [bps]           Compare bps
 --rateest-pps1 [pps]           Compare pps
 --rateest-bps2 [bps]           Compare bps
 --rateest-pps2 [pps]           Compare pps
 [!] --rateest-lt               Match if rate is less than given rate/estimator
 [!] --rateest-gt               Match if rate is greater than given rate/estimator
 [!] --rateest-eq               Match if rate is equal to given rate/estimator

如下配置,首先配置两个estimator目标,用于评估两个网口的速率值。

# iptables -t mangle -A POSTROUTING -o ens38 -j RATEEST
       --rateest-name ratetg1 --rateest-interval 250ms --rateest-ewma 0.5s
#
# iptables -t mangle -A POSTROUTING -o ens39 -j RATEEST
       --rateest-name ratetg2 --rateest-interval 250ms --rateest-ewma 0.5s
#
# iptables -t mangle -L -n -v

Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
   85 13128 RATEEST    all  --  *      ens38   0.0.0.0/0            0.0.0.0/0            name ratetg1 interval 250.0ms ewmalog 500.0ms
    0     0 RATEEST    all  --  *      ens39   0.0.0.0/0            0.0.0.0/0            name ratetg2 interval 250.0ms ewmalog 500.0ms

其次,配置rateest匹配策略。对于ftp新建连接,策略一,如果2.5mbit与评估器1速率的差值大于2mbit与评估器2的差值,设置标记1,可以认为评估器1所对应的接口ens38相比于评估器2所对应的接口ens39还有可用带宽。

策略二,如果2mbit与评估器2速率的差值大于2.5mbit与评估器1的差值,设置标记2,可以认为评估器2所对应的接口ens39还有可用带宽。

# iptables -t mangle -N balance
#
# iptables -t mangle -A balance -m conntrack --ctstate NEW -m helper --helper ftp
       -m rateest --rateest-delta
	   --rateest1 ratetg1 --rateest-bps1 2.5mbit --rateest-gt
	   --rateest2 ratetg2 --rateest-bps2 2mbit
	   -j CONNMARK --set-mark 1

# iptables -t mangle -A balance -m conntrack --ctstate NEW -m helper --helper ftp
       -m rateest --rateest-delta
	   --rateest1 ratetg2 --rateest-bps1 2mbit --rateest-gt
	   --rateest2 ratetg1 --rateest-bps2 2.5mbit
	   -j CONNMARK --set-mark 2
#
#
# iptables -t mangle -L -n -v

Chain balance (0 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 CONNMARK   all  --  *      *       0.0.0.0/0            0.0.0.0/0            ctstate NEW helper match "ftp" 
	rateest match ratetg1 delta bps 312500 gt ratetg2 bps 250000 CONNMARK set 0x1
    0     0 CONNMARK   all  --  *      *       0.0.0.0/0            0.0.0.0/0            ctstate NEW helper match "ftp" 
	rateest match ratetg2 delta bps 250000 gt ratetg1 bps 312500 CONNMARK set 0x2

绝对模式策略如下,当速率评估器ratetg1的速率超过3mbit时,丢弃报文。

# iptables -t mangle -A FORWARD -m conntrack --ctstate NEW  \
		-m rateest --rateest1 ratetg1 --rateest-gt   \
		--rateest-bps2 10mbit     \
		-j DROP
# 
# 
# iptables -t mangle -L -v -n

    0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            ctstate NEW 
	rateest match ratetg1 bps 1250000 gt

注意,这里显示的bps为1250000,其由 10 * 1000 000 / 8计算而来。如果速率指定为10Mibit,那么显示值为 10 * 1024*1024 /8等于1310720。

rateest匹配

函数xt_register_match注册匹配结构xt_rateest_mt_reg。

static struct xt_match xt_rateest_mt_reg __read_mostly = {
    .name       = "rateest",
    .revision   = 0,
    .family     = NFPROTO_UNSPEC,
    .match      = xt_rateest_mt,
    .checkentry = xt_rateest_mt_checkentry,
    .destroy    = xt_rateest_mt_destroy,
    .matchsize  = sizeof(struct xt_rateest_match_info),
    .usersize   = offsetof(struct xt_rateest_match_info, est1),
    .me         = THIS_MODULE,
};
static int __init xt_rateest_mt_init(void)
{
    return xt_register_match(&xt_rateest_mt_reg);

配置检查函数如下,绝对模式和相对模式不能同时配置,速率控制bps(每秒比特位)或者pps(每秒报文数)至少选择其一。比较方式为相等/小于/大于三种,其它为不合法。

static int xt_rateest_mt_checkentry(const struct xt_mtchk_param *par)
{
    struct xt_rateest_match_info *info = par->matchinfo;
    struct xt_rateest *est1, *est2;
    int ret = -EINVAL;

    if (hweight32(info->flags & (XT_RATEEST_MATCH_ABS |
                     XT_RATEEST_MATCH_REL)) != 1)
        goto err1;

    if (!(info->flags & (XT_RATEEST_MATCH_BPS | XT_RATEEST_MATCH_PPS)))
        goto err1;

    switch (info->mode) {
    case XT_RATEEST_MATCH_EQ:
    case XT_RATEEST_MATCH_LT:
    case XT_RATEEST_MATCH_GT:
        break;
    default:
        goto err1;
    }

其次,确认配置的estimator是否存在。相对模式下,两个estimator都要存在。

    ret  = -ENOENT;
    est1 = xt_rateest_lookup(par->net, info->name1);
    if (!est1)
        goto err1;

    est2 = NULL;
    if (info->flags & XT_RATEEST_MATCH_REL) {
        est2 = xt_rateest_lookup(par->net, info->name2);
        if (!est2)
            goto err2;
    }
    info->est1 = est1;
    info->est2 = est2;

匹配判断函数如下,对于rateest-delta差值配置,首先计算配置的首个速率与首个estimator评估速率的差值,确保最小差值为零。否则,对于非差值的情况,直接使用estimator-1的评估值。

static bool
xt_rateest_mt(const struct sk_buff *skb, struct xt_action_param *par)
{
    const struct xt_rateest_match_info *info = par->matchinfo;
    struct gnet_stats_rate_est64 sample = {0};
    u_int32_t bps1, bps2, pps1, pps2;
    bool ret = true;

    gen_estimator_read(&info->est1->rate_est, &sample);

    if (info->flags & XT_RATEEST_MATCH_DELTA) {
        bps1 = info->bps1 >= sample.bps ? info->bps1 - sample.bps : 0;
        pps1 = info->pps1 >= sample.pps ? info->pps1 - sample.pps : 0;
    } else {
        bps1 = sample.bps;
        pps1 = sample.pps;
    }

绝对模式(absolute)下,使用配置的第二个速率值(bps2/pps2)。否则,使用第二个estimator评估的速率,在开启rateest-delta差值配置的情况下,计算第二个配置速率与estimator-2评估的速率的查找,差值最小为零。

    if (info->flags & XT_RATEEST_MATCH_ABS) {
        bps2 = info->bps2;
        pps2 = info->pps2;
    } else {
        gen_estimator_read(&info->est2->rate_est, &sample);

        if (info->flags & XT_RATEEST_MATCH_DELTA) {
            bps2 = info->bps2 >= sample.bps ? info->bps2 - sample.bps : 0;
            pps2 = info->pps2 >= sample.pps ? info->pps2 - sample.pps : 0;
        } else {
            bps2 = sample.bps;
            pps2 = sample.pps;
        }
    }

根据大于、小于、等于三个比较配置,判断以上得到的四个速率值的关系。

    switch (info->mode) {
    case XT_RATEEST_MATCH_LT:
        if (info->flags & XT_RATEEST_MATCH_BPS)
            ret &= bps1 < bps2;
        if (info->flags & XT_RATEEST_MATCH_PPS)
            ret &= pps1 < pps2;
        break;
    case XT_RATEEST_MATCH_GT:
        if (info->flags & XT_RATEEST_MATCH_BPS)
            ret &= bps1 > bps2;
        if (info->flags & XT_RATEEST_MATCH_PPS)
            ret &= pps1 > pps2;
        break;
    case XT_RATEEST_MATCH_EQ:
        if (info->flags & XT_RATEEST_MATCH_BPS)
            ret &= bps1 == bps2;
        if (info->flags & XT_RATEEST_MATCH_PPS)
            ret &= pps1 == pps2;
        break;
    }
    ret ^= info->flags & XT_RATEEST_MATCH_INVERT ? true : false;
    return ret;

内核版本 5.10

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-04-26 12:16:02  更:2022-04-26 12:19:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 19:50:38-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码