iptables匹配connlimit限制并发连接数量
以下规则将每个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限制并发连接数量相关推荐
- linux的TCP连接数量最大不能超过65535个,那服务器是如何应对百万千万的并发的?
光是在知乎上这个问题我都看了好几遍了,问之前先搜一下不好吗?简单说来: TCP连接数量最大不能超过65535是错的. 一个连接由一个5元组决定(protocol,local IP,local port ...
- 100万并发连接服务器笔记之处理端口数量受限问题
第二个遇到的问题:端口数量受限 一般来说,单独对外提供请求的服务不用考虑端口数量问题,监听某一个端口即可.但是向提供代理服务器,就不得不考虑端口数量受限问题了.当前的1M并发连接测试,也需要在客户端突 ...
- Linux的TCP连接数量最大不能超过65535个吗,那服务器是如何应对百万千万的并发的?
最大并发tcp连接数是多少呢? 首先,问题中描述的65535个连接指的是客户端连接数的限制. 在tcp应用中,server事先在某个固定端口监听,client主动发起连接,经过三次握手后建立tcp连接 ...
- 防火墙 之 iptables 匹配条件讲解
1 概述 iptables命令中,需要根据匹配的条件作出相应的动作,本文将结合例子,讲解匹配条件 匹配条件分为基本和扩展的条件 基本:通用的,PARAMETERS,无需加载模块,由iptables ...
- 关于 TCP 并发连接的几个思考题与试验
陈硕 (giantchen AT gmail) blog.csdn.net/Solstice 前几天我在新浪微博上出了两道有关 TCP 的思考题,引发了一场讨论 http://weibo.com/17 ...
- 文件共享服务器连接数问题,共享服务器上连接数量的设置
共享服务器上连接数量的设置 内容精选 换一换 场景描述每个虚拟私有云VPC代表一个私有网络,与其他VPC逻辑隔离,您可以将业务系统部署在华为云上,构建云上私有网络环境.如果您有多个业务系统例如生产环境 ...
- 转:多线程环境下调用 HttpWebRequest 并发连接限制
.net 的 HttpWebRequest 或者 WebClient 在多线程情况下存在并发连接限制,这个限制在桌面操作系统如 windows xp , windows 7 下默认是2,在服务器操作 ...
- 多线程环境下调用 HttpWebRequest 并发连接限制
.net 的 HttpWebRequest 或者 WebClient 在多线程情况下存在并发连接限制,这个限制在桌面操作系统如 windows xp , windows 7 下默认是2,在服务器操作 ...
- lvs增加并发连接,解决因为哈希表过小导致软中断过高问题
LVS,一个N久前就在使用的东西,目前来说配置什么的也没什么问题.只是个人觉得随着业务的上涨和流量的增加,它的连接数必然也会增长,所以在配置的时候就想直接把它改大. 在安装好后(Cento ...
最新文章
- Windows Phone SDK update for Windows Phone 7.8
- SQL Server时间粒度系列----第6节基于当前日的小时数和分钟数与mysql unix_timestamp和from_unixtime的mssql实现...
- DeDeCMS后台批量修改替换sql语句大全
- IIS内部服务错误aspx与asp
- hadoop--HDFS搭建客户端API环境
- 南阳理工学院计算机acm,南阳理工学院计算机学院ACM队成员获奖情况[荣誉记]
- s7200cpu224xp手册_西门子S7-200模块CPU224XPCN可编程控制器
- c语言中难度程序,c语言自学难度高么
- 408计算机考研 各科题目题号,2021考研408计算机专业基础综合数据结构试题特点分析...
- 用户行为监控(Piwik)
- Spring boot 整合Druid框架不支持瀚高,报dbtype not support
- 常用邮箱POP3和SMTP服务器
- 手机 APP 的卖货界面
- 什么是虚拟机?虚拟机有那几种
- js function后面小括号
- java线段的平移和旋转,几何变换(旋转、缩放、平移)
- 微服务构建思路与方法论
- Vue-你不知道的Bus中央数据总线学习
- 图片怎么无损放大?来试试这3款图片工具
- 结构体 7.公共钥匙盒