以下规则将每个IP的最大并发连接数量控制在5个,使用connlimit-above或者connlimit-upto都可实现。

# iptables -I INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 5 -j DROP
#
# iptables -L -n -v
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)pkts bytes target     prot opt in     out     source               destination         0     0 DROP       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22 flags:0x17/0x02 #conn src/32 > 5
#
#
# iptables -I INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-upto 5 -j ACCEPT
#
# iptables -L -n -v
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)pkts bytes target     prot opt in     out     source               destination         0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22 flags:0x17/0x02 #conn src/32 <= 5

以下规则将每个C网段内的所有地址的连接总数量控制在5个。

# iptables -I INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 5 --connlimit-mask 24 -j DROP
#
# iptables -L -n -v
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)pkts bytes target     prot opt in     out     source               destination         0     0 DROP       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22 flags:0x17/0x02 #conn src/24 > 5

默认情况下–connlimit-saddr是生效的,以下指定–connlimit-daddr,控制到每个目的地址的连接数量不超过5个。

# iptables -I INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 5 --connlimit-daddr -j DROP
#
# iptables -L -n -v
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)pkts bytes target     prot opt in     out     source               destination         0     0 DROP       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22 flags:0x17/0x02 #conn dst/32 > 5

connlimit匹配

内核函数connlimit_mt_init注册了connlimit_mt_reg匹配结构。

static struct xt_match connlimit_mt_reg __read_mostly = {.name       = "connlimit",.revision   = 1,.family     = NFPROTO_UNSPEC,.checkentry = connlimit_mt_check,.match      = connlimit_mt,.matchsize  = sizeof(struct xt_connlimit_info),.usersize   = offsetof(struct xt_connlimit_info, data),.destroy    = connlimit_mt_destroy,.me         = THIS_MODULE,
};
static int __init connlimit_mt_init(void)
{return xt_register_match(&connlimit_mt_reg);
}

配置检查函数connlimit_mt_check如下,这里初始化conncount相关结构,keylen包括zone区ID和相应协议组的地址长度。

static int connlimit_mt_check(const struct xt_mtchk_param *par)
{struct xt_connlimit_info *info = par->matchinfo;unsigned int keylen;keylen = sizeof(u32);if (par->family == NFPROTO_IPV6)keylen += sizeof(struct in6_addr);elsekeylen += sizeof(struct in_addr);/* init private data */info->data = nf_conncount_init(par->net, par->family, keylen);return PTR_ERR_OR_ZERO(info->data);

匹配函数connlimit_mt,如果报文已经带有连接跟踪结构,取出其中的原始方向tuple,否则,解析报文的tuple,解析失败,返回false,未能匹配。

static bool
connlimit_mt(const struct sk_buff *skb, struct xt_action_param *par)
{const struct xt_connlimit_info *info = par->matchinfo;struct nf_conntrack_tuple tuple;const struct nf_conntrack_tuple *tuple_ptr = &tuple;const struct nf_conntrack_zone *zone = &nf_ct_zone_dflt;const struct nf_conn *ct;u32 key[5];ct = nf_ct_get(skb, &ctinfo);if (ct != NULL) {tuple_ptr = &ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple;zone = nf_ct_zone(ct);} else if (!nf_ct_get_tuplepr(skb, skb_network_offset(skb),xt_family(par), net, &tuple)) {goto hotdrop;}

否则,成功获取报文的tuple信息,对于IPv6,如果设置了XT_CONNLIMIT_DADDR标志(–connlimit-daddr),key值选取报文的目的地址,否则,选取源地址。

    if (xt_family(par) == NFPROTO_IPV6) {const struct ipv6hdr *iph = ipv6_hdr(skb);union nf_inet_addr addr;memcpy(&addr.ip6, (info->flags & XT_CONNLIMIT_DADDR) ?&iph->daddr : &iph->saddr, sizeof(addr.ip6));for (i = 0; i < ARRAY_SIZE(addr.ip6); ++i)addr.ip6[i] &= info->mask.ip6[i];memcpy(key, &addr, sizeof(addr.ip6));key[4] = zone->id;} else {const struct iphdr *iph = ip_hdr(skb);key[0] = (info->flags & XT_CONNLIMIT_DADDR) ?iph->daddr : iph->saddr;key[0] &= info->mask.ip;key[1] = zone->id;}

对于IPv4协议,处理与以上相同,另外,key值中的地址部分需要与配置的掩码进行与操作(&)。之后,由key值和tuple值来获取连接的数量,最后,检查是否满足限制条件。

   connections = nf_conncount_count(net, info->data, key, tuple_ptr, zone);if (connections == 0)/* kmalloc failed, drop it entirely */goto hotdrop;return (connections > info->limit) ^ !!(info->flags & XT_CONNLIMIT_INVERT);hotdrop:par->hotdrop = true;return false;

内核版本 5.10

iptables匹配connlimit限制并发连接数量相关推荐

  1. linux的TCP连接数量最大不能超过65535个,那服务器是如何应对百万千万的并发的?

    光是在知乎上这个问题我都看了好几遍了,问之前先搜一下不好吗?简单说来: TCP连接数量最大不能超过65535是错的. 一个连接由一个5元组决定(protocol,local IP,local port ...

  2. 100万并发连接服务器笔记之处理端口数量受限问题

    第二个遇到的问题:端口数量受限 一般来说,单独对外提供请求的服务不用考虑端口数量问题,监听某一个端口即可.但是向提供代理服务器,就不得不考虑端口数量受限问题了.当前的1M并发连接测试,也需要在客户端突 ...

  3. Linux的TCP连接数量最大不能超过65535个吗,那服务器是如何应对百万千万的并发的?

    最大并发tcp连接数是多少呢? 首先,问题中描述的65535个连接指的是客户端连接数的限制. 在tcp应用中,server事先在某个固定端口监听,client主动发起连接,经过三次握手后建立tcp连接 ...

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

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

  5. 关于 TCP 并发连接的几个思考题与试验

    陈硕 (giantchen AT gmail) blog.csdn.net/Solstice 前几天我在新浪微博上出了两道有关 TCP 的思考题,引发了一场讨论 http://weibo.com/17 ...

  6. 文件共享服务器连接数问题,共享服务器上连接数量的设置

    共享服务器上连接数量的设置 内容精选 换一换 场景描述每个虚拟私有云VPC代表一个私有网络,与其他VPC逻辑隔离,您可以将业务系统部署在华为云上,构建云上私有网络环境.如果您有多个业务系统例如生产环境 ...

  7. 转:多线程环境下调用 HttpWebRequest 并发连接限制

    .net 的 HttpWebRequest 或者 WebClient 在多线程情况下存在并发连接限制,这个限制在桌面操作系统如 windows xp , windows  7 下默认是2,在服务器操作 ...

  8. 多线程环境下调用 HttpWebRequest 并发连接限制

    .net 的 HttpWebRequest 或者 WebClient 在多线程情况下存在并发连接限制,这个限制在桌面操作系统如 windows xp , windows  7 下默认是2,在服务器操作 ...

  9. lvs增加并发连接,解决因为哈希表过小导致软中断过高问题

    LVS,一个N久前就在使用的东西,目前来说配置什么的也没什么问题.只是个人觉得随着业务的上涨和流量的增加,它的连接数必然也会增长,所以在配置的时候就想直接把它改大.       在安装好后(Cento ...

最新文章

  1. Windows Phone SDK update for Windows Phone 7.8
  2. SQL Server时间粒度系列----第6节基于当前日的小时数和分钟数与mysql unix_timestamp和from_unixtime的mssql实现...
  3. DeDeCMS后台批量修改替换sql语句大全
  4. IIS内部服务错误aspx与asp
  5. hadoop--HDFS搭建客户端API环境
  6. 南阳理工学院计算机acm,南阳理工学院计算机学院ACM队成员获奖情况[荣誉记]
  7. s7200cpu224xp手册_西门子S7-200模块CPU224XPCN可编程控制器
  8. c语言中难度程序,c语言自学难度高么
  9. 408计算机考研 各科题目题号,2021考研408计算机专业基础综合数据结构试题特点分析...
  10. 用户行为监控(Piwik)
  11. Spring boot 整合Druid框架不支持瀚高,报dbtype not support
  12. 常用邮箱POP3和SMTP服务器
  13. 手机 APP 的卖货界面
  14. 什么是虚拟机?虚拟机有那几种
  15. js function后面小括号
  16. java线段的平移和旋转,几何变换(旋转、缩放、平移)
  17. 微服务构建思路与方法论
  18. Vue-你不知道的Bus中央数据总线学习
  19. 图片怎么无损放大?来试试这3款图片工具
  20. 结构体 7.公共钥匙盒

热门文章

  1. 你不甘堕落,却又不思进取
  2. 解决微信开发者工具预览和真机调试灰色不能点击问题
  3. win10启动项无法自启动
  4. c语言代码实现杀掉excel进程,C# 获取进程退出代码的实现示例
  5. Matlab legend 水平放置
  6. 数据分析里面的 aha 时刻
  7. 动手学Zeppelin数据挖掘生产力怪兽
  8. Android App 性能优化之稳定性
  9. jdk详细安装步骤图解
  10. mysql用户分配权限