V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
GavinMa
V2EX  ›  Linux

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

  •  
  •   GavinMa · 2015-01-24 19:31:35 +08:00 · 11520 次点击
    这是一个创建于 3621 天前的主题,其中的信息可能已经有所发展或是发生改变。
    求助:怎么限制一段端口范围每个端口连接数?
    比如端口范围为20000-30000,共1W个端口,每个端口的连接数为5,iptable 代码该怎么写呢?

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

    ubuntu系统,在此先感谢!
    28 条回复    2020-02-12 18:56:55 +08:00
    bellchu
        1
    bellchu  
       2015-01-24 20:40:25 +08:00 via iPhone   ❤️ 1
    Ip tables -a input -p top --dport xxx -m connlimit --connlimit-above 100 --connlimit-mask 0 -j reject


    手机打字 将就看吧
    bellchu
        2
    bellchu  
       2015-01-24 20:44:20 +08:00 via iPhone   ❤️ 1
    --dport 20000:30000 就是20000到30000
    GavinMa
        3
    GavinMa  
    OP
       2015-01-24 23:53:00 +08:00
    @bellchu 好的,我试试。感谢帮忙。
    ryd994
        4
    ryd994  
       2015-01-25 19:21:49 +08:00
    @bellchu 这个是某范围内所有端口连接的总数啊
    --connlimit-mask 0只是不管哪个IP来源,全都一起计算而已
    bellchu
        5
    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
        6
    ryd994  
       2015-01-26 01:31:31 +08:00 via Android   ❤️ 1
    @bellchu 这……真的行吗?multiport和connlimit是两个match,相互之间不影响的吧……
    @GavinMa 先问问你要实现的什么目的?为什么要这么做?是为了抗dos呢?还是应用需求?说实话如果强求每个端口而不是总数限制的话,我想不到好办法
    bellchu
        7
    bellchu  
       2015-01-26 09:11:23 +08:00 via iPhone
    @ryd994 两个-m为啥不行?
    ryd994
        8
    ryd994  
       2015-01-26 09:45:55 +08:00
    @bellchu m是match,只管自己这个模块里能不能满足要求。如果每个模块都满足,那么-j生效。
    m和m之间根本就是不同的程序,怎么会搭界?
    如果不相信的话为何不自己验证一下?
    bellchu
        9
    bellchu  
       2015-01-26 10:49:12 +08:00
    ryd994
        10
    ryd994  
       2015-01-26 11:15:19 +08:00
    @bellchu
    …………又没说你语法不对
    telnet 连连看啊
    bellchu
        11
    bellchu  
       2015-01-26 11:56:31 +08:00
    bellchu
        12
    bellchu  
       2015-01-26 12:08:09 +08:00
    发现个问题,connlimit不会减计数,断开之后还算连接着,保持被REJECT状态。除非iptables -F,不然就算连接清空了还是连不上被REJECT。楼主还是用hitcount hashlimit之类来做限制吧。
    ryd994
        13
    ryd994  
       2015-01-26 20:18:21 +08:00 via Android
    @bellchu connlimit肯定会减的,我的web服务器上就用着,要是不减还得了………
    而且问题不在于限制是不是两个连接,而是这个限制是总限制还是每端口。我测试的结果就是,如果
    ryd994
        14
    ryd994  
       2015-01-26 20:19:05 +08:00 via Android
    @bellchu 如果一个端口上有两个连接,第三个无论是哪个端口,都会被拒绝
    bellchu
        15
    bellchu  
       2015-01-26 22:21:35 +08:00
    @ryd994 mask改32呢
    bellchu
        16
    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
        17
    ryd994  
       2015-01-26 23:53:06 +08:00 via Android
    @bellchu 我没说不能一起用……我是说他们的参数互相不干扰……你这样是限制所有端口上的总数………
    GavinMa
        18
    GavinMa  
    OP
       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
        19
    ryd994  
       2015-01-28 00:23:40 +08:00 via Android   ❤️ 1
    @GavinMa 这样的话就直接限制所有端口上每个IP的连接总数吧,效果一样的。
    你要限制单个端口上的所有IP的连接数太麻烦了。
    bellchu
        20
    bellchu  
       2015-01-28 11:07:10 +08:00
    @GavinMa 你确定你有1万个用户需要开1万个端口么,我只做过面向服务的连接数和流量限制,比如web的http(s),SSH的22. 就像楼上所说,你的需求用connlimit做源地址的限制比较合理,当然你可以写一万条防火墙脚本,这么长的脚本我就没法说保证系统的效率了,不过你也可以试一下.
    GavinMa
        21
    GavinMa  
    OP
       2015-01-28 16:32:14 +08:00
    @bellchu 没有1万个用户,目前设计的思路是用户注册时让其在1万个端口范围内随机生成一个端口(安全机制)。
    @ryd994 抱歉,我是linux小白,做这个免费分享计划完全出于热心,还望提供帮助,具体规则帮忙写下可以吗?
    ryd994
        22
    ryd994  
       2015-01-28 21:36:33 +08:00   ❤️ 1
    iptables -A INPUT -p tcp --dport 20000:30000 -m connlimit --connlimit-above 10 -j REJECT
    这样基本就行了,不同用户给不同密码就行了。
    GavinMa
        23
    GavinMa  
    OP
       2015-01-29 02:43:06 +08:00
    @ryd994 没成功,导致SS无法正常连接使用了。
    ikzzdd
        24
    ikzzdd  
       2015-02-05 12:08:56 +08:00
    这个问题我也想知道方案,研究好多天了
    617450941
        25
    617450941  
       2015-10-20 22:49:30 +08:00
    iptables 怎么限制一个端口只能一个 ip 连接 求解
    Vogan
        26
    Vogan  
       2020-02-04 02:40:54 +08:00
    @ryd994 #22 这是错误的,限制的是 20000-30000 共 1w 个端口,一共只能 10 个连接数,而不是每个端口 10 个连接数!
    ryd994
        27
    ryd994  
       2020-02-12 18:55:09 +08:00 via Android
    @Vogan rtfm
    http://ipset.netfilter.org/iptables-extensions.man.html
    connlimit
    Allows you to restrict the number of parallel connections to a server per client IP address (or client address block).

    默认是每 IP,除非你用 connlimit-mask 0
    ryd994
        28
    ryd994  
       2020-02-12 18:56:55 +08:00 via Android
    @Vogan 你就不能看看我 19 楼说的什么?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3255 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 12:14 · PVG 20:14 · LAX 04:14 · JFK 07:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.