求助:怎么限制一段端口范围每个端口连接数?

2015-01-24 19:31:35 +08:00
 GavinMa
求助:怎么限制一段端口范围每个端口连接数?
比如端口范围为20000-30000,共1W个端口,每个端口的连接数为5,iptable 代码该怎么写呢?

我查到的资料,限制单一端口貌似是这么写:
iptables -I INPUT -p tcp --dport 10000 -m connlimit --connlimit-above 5 -j DROP

ubuntu系统,在此先感谢!
11524 次点击
所在节点    Linux
28 条回复
bellchu
2015-01-24 20:40:25 +08:00
Ip tables -a input -p top --dport xxx -m connlimit --connlimit-above 100 --connlimit-mask 0 -j reject


手机打字 将就看吧
bellchu
2015-01-24 20:44:20 +08:00
--dport 20000:30000 就是20000到30000
GavinMa
2015-01-24 23:53:00 +08:00
@bellchu 好的,我试试。感谢帮忙。
ryd994
2015-01-25 19:21:49 +08:00
@bellchu 这个是某范围内所有端口连接的总数啊
--connlimit-mask 0只是不管哪个IP来源,全都一起计算而已
bellchu
2015-01-25 20:48:48 +08:00
@ryd994 呃。。。。。。。你这么一说好像是啊,

这么写
iptables -A INPUT -p tcp -m multiport --dports 20000:30000 -m connlimit --connlimit-above 5 --connlimit-mask 0 -j REJECT
ryd994
2015-01-26 01:31:31 +08:00
@bellchu 这……真的行吗?multiport和connlimit是两个match,相互之间不影响的吧……
@GavinMa 先问问你要实现的什么目的?为什么要这么做?是为了抗dos呢?还是应用需求?说实话如果强求每个端口而不是总数限制的话,我想不到好办法
bellchu
2015-01-26 09:11:23 +08:00
@ryd994 两个-m为啥不行?
ryd994
2015-01-26 09:45:55 +08:00
@bellchu m是match,只管自己这个模块里能不能满足要求。如果每个模块都满足,那么-j生效。
m和m之间根本就是不同的程序,怎么会搭界?
如果不相信的话为何不自己验证一下?
bellchu
2015-01-26 10:49:12 +08:00
ryd994
2015-01-26 11:15:19 +08:00
@bellchu
…………又没说你语法不对
telnet 连连看啊
bellchu
2015-01-26 11:56:31 +08:00
bellchu
2015-01-26 12:08:09 +08:00
发现个问题,connlimit不会减计数,断开之后还算连接着,保持被REJECT状态。除非iptables -F,不然就算连接清空了还是连不上被REJECT。楼主还是用hitcount hashlimit之类来做限制吧。
ryd994
2015-01-26 20:18:21 +08:00
@bellchu connlimit肯定会减的,我的web服务器上就用着,要是不减还得了………
而且问题不在于限制是不是两个连接,而是这个限制是总限制还是每端口。我测试的结果就是,如果
ryd994
2015-01-26 20:19:05 +08:00
@bellchu 如果一个端口上有两个连接,第三个无论是哪个端口,都会被拒绝
bellchu
2015-01-26 22:21:35 +08:00
@ryd994 mask改32呢
bellchu
2015-01-26 23:02:45 +08:00
@ryd994 count不减少是因为TIME_WAIT的timeout时间在我机器上是120秒,你可能写的DROP,所以连接马上被关闭了,而我写的是REJECT所以一直在WAIT。
mask改32的现象是source ip限制为单个,而不是匹配所有ip。
至于你说的两个match不能一起用显然是不成立的。
明天有空我再去试试看多端口的限制吧,楼主的这么多端口的限制的需求也真是没遇到过呢。刚刚看了看man,说是multiport后面写range也只算range中的两个ports。
ryd994
2015-01-26 23:53:06 +08:00
@bellchu 我没说不能一起用……我是说他们的参数互相不干扰……你这样是限制所有端口上的总数………
GavinMa
2015-01-27 21:40:45 +08:00
@ryd994
@bellchu 感谢两位的积极帮助,需求是这样的:我免费分享了几台TW的SS服务器,每位注册用户都有自己的独立端口和密码,为了防止滥用,想对每个端口做连接数限制。
目前还没有解决。
使用的开源系统:
1、https://github.com/orvice/ss-panel
2、https://github.com/mengskysama/shadowsocks/tree/manyuser
ryd994
2015-01-28 00:23:40 +08:00
@GavinMa 这样的话就直接限制所有端口上每个IP的连接总数吧,效果一样的。
你要限制单个端口上的所有IP的连接数太麻烦了。
bellchu
2015-01-28 11:07:10 +08:00
@GavinMa 你确定你有1万个用户需要开1万个端口么,我只做过面向服务的连接数和流量限制,比如web的http(s),SSH的22. 就像楼上所说,你的需求用connlimit做源地址的限制比较合理,当然你可以写一万条防火墙脚本,这么长的脚本我就没法说保证系统的效率了,不过你也可以试一下.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/165094

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX