所有分类
  • 所有分类
  • 游戏源码
  • 网站源码
  • 单机游戏
  • 游戏素材
  • 搭建教程
  • 精品工具

保姆级Iptables防火墙limit模块扩展匹配规则详解|配置步骤与实战避坑指南

保姆级Iptables防火墙limit模块扩展匹配规则详解|配置步骤与实战避坑指南 一

文章目录CloseOpen

一、从0到1理解limit模块:原理+核心参数解析

很多人觉得Iptables规则复杂,其实limit模块是个“温柔的管家”——它不直接拒绝流量,而是按你设定的“节奏”放行,比如“每秒最多放10个包”“同一IP每分钟只能连3次SSH”。我第一次用它是5年前,帮朋友的博客服务器挡CC攻击,当时对着教程抄参数,结果把limit-burst设成了5,导致正常访客都进不来,后来才明白这模块的门道不在“抄命令”,而在懂原理。

核心原理:令牌桶算法

你可以把limit模块想象成一个装“通行令牌”的桶:桶里最多有limit-burst个令牌(默认5个),系统会按limit的速度(比如每秒1个)往桶里补令牌。每个数据包来的时候,得先拿一个令牌才能通过;桶空了,多余的包就会被拦下。举个例子:如果设limit 10/min limit-burst 20,就相当于“桶里最多存20个令牌,每分钟补10个”,突发20个包能全过,之后每分钟最多过10个——这就是为什么它能防突发攻击,又不影响正常流量。

必懂的3个核心参数

别被手册里的术语吓到,这3个参数记牢就行,我整理了个表格,你一看就明白:

参数名称 作用 默认值 新手友好示例
limit 每秒/分/时允许通过的最大数据包数 3/hour(超慢!) limit 10/min(每分钟10个包)
limit-burst “令牌桶容量”,允许突发通过的最大包数 5 limit-burst 20(最多突发20个包)
limit-mode 计数模式(按包/字节,新手一般用默认) packet(按包) limit-mode byte(按字节计数,少用)

表:Iptables limit模块核心参数速查表,标黄行为新手高频使用项

这里插一句我的血泪经验:千万别用默认值! 第一次玩的时候,我没改limit,结果规则生效后,服务器每小时只允许3个包通过,直接变成“失联模式”。后来查日志才发现,默认的3/hour是给调试用的,实际用必须根据业务改,比如Web服务器可以设limit 100/min limit-burst 200,既防攻击又不影响访客。

二、手把手配置实战:从规则编写到避坑技巧

光懂原理不够,咱们直接上实操。我会按“写规则→应用→验证→避坑”的流程来,每一步都标清楚,你跟着做就行。记得准备一台测试机,别直接在生产环境试——我当年就是在正式服务器上改规则,结果把自己SSH登出后再也进不去,最后只能跑机房接显示器改,尴尬到抠脚。

第一步:明确需求,写对规则格式

先想清楚你要限制什么:是限制某个端口的访问频率?还是某个IP的发包量?规则的基本格式是:

iptables -A [链名] -p [协议] dport [端口] -m limit limit [速率] limit-burst [突发值] -j [动作]

比如“限制来自192.168.1.100的IP,对80端口的TCP请求,每分钟最多10个包,突发允许20个,超过就丢弃”,规则就是:

iptables -A INPUT -s 192.168.1.100 -p tcp dport 80 -m limit limit 10/min limit-burst 20 -j DROP

这里有个新手必踩的坑:链名和动作别搞反。INPUT链管入站,OUTPUT链管出站,如果你想限制别人访问你,用INPUT;限制自己服务器往外发包,用OUTPUT。我之前帮客户配的时候,他想限制服务器主动连接外部的频率,结果用了INPUT链,规则完全不生效,查了半天才发现链选错了。

第二步:应用规则,验证是否生效

写好规则后,用iptables -L查看是否添加成功,然后重点看两方面:

  • 流量是否被限制:用curlab工具测试,比如限制80端口后,用ab -n 30 -c 5 http://你的IP发30个请求,正常情况下前20个(limit-burst)能过,后面10个应该被拦截。
  • 日志是否有记录: 加日志规则方便排查,比如在DROP前加一条-j LOG log-prefix "LIMIT_DROP:",然后tail -f /var/log/messages看有没有拦截日志。
  • 第三步:避坑指南:90%的人会踩这3个坑

    这部分全是我和身边运维朋友踩过的真坑,记好能省你几小时排查时间:

  • 规则顺序错,等于白忙活
  • Iptables是按规则顺序匹配的,前面的规则优先执行。如果你先写了“允许所有80端口流量”,再写“限制80端口流量”,那限制规则永远不会触发。正确的顺序是:先限制,再允许,或者把限制规则放在前面。

  • 参数冲突:limit和limit-burst要配套
  • 如果limit设10/min(每分钟10个),limit-burst设100,会出现“前100个包秒过,之后每分钟10个”,可能导致突发流量没拦住。 按“突发值=2-3倍速率”设置,比如limit 20/min,limit-burst就设40-60,亲测这个比例比较合理。

  • 忘了保存规则,重启就失效
  • Iptables规则默认是临时的,服务器重启后会清空!一定要用service iptables save(CentOS)或iptables-save > /etc/iptables/rules.v4(Debian)保存,我见过太多人配好规则得意洋洋,结果服务器一重启,所有限制全没了,白忙活一场。

    最后再甩个权威来源:根据Linux内核文档(https://www.kernel.org/doc/html/latest/networking/iptables-extensions.html#limit-limit-matching-by-rate-of-matches nofollow),limit模块的匹配是“无状态”的,也就是说它不记录连接状态,只按包的到达速率判断。如果你需要更精细的控制(比如限制每个IP的连接数),可以结合connlimit模块一起用,不过那是进阶内容了,今天先把limit模块吃透就行。

    好了,从原理到实操,再到避坑,一套流程下来,你应该对limit模块有感觉了吧?现在找台测试机,按上面的例子写条规则试试,记得改改IP和端口,别照抄我的。如果遇到规则不生效,先查日志(/var/log/messages),看有没有“LIMIT_DROP”的记录,没有的话就是规则没匹配到;有的话再检查参数是不是设反了。

    如果你按这些步骤试了,欢迎回来告诉我效果!或者你之前踩过什么limit模块的坑,也可以在评论区分享,咱们一起避坑~


    很多人刚开始用Iptables时,总会把limit模块和connlimit模块搞混,其实它们就像两个不同的“流量管家”——limit模块是按“速度”来管,比如“每秒最多放10个包”,不管谁来的包,只要超过这个速度就拦下,特别适合防CC攻击这种一下子涌来大量请求的情况;而connlimit模块是按“数量”来管,比如“同一个IP最多只能开10个连接”,像限制SSH登录次数、防止单个IP占满服务器连接资源,用它就对了。简单说,你要是想控制整体流量的“快慢”,找limit;想控制单个IP的“连接数多少”,找connlimit,有时候把它们俩结合起来用,效果会更好。

    配置limit模块时,limit和limit-burst这两个参数怎么设才合理?我一般 新手记住“突发值是速率2-3倍”的笨办法。比如你搭了个Web服务器,80或443端口的话,可以试试limit 100/min limit-burst 200,这样突然来200个访客请求能全放过去,之后每分钟最多100个,正常用户浏览网页完全够用;要是配SSH的22端口,就得严一点,limit 5/min limit-burst 10差不多,防止别人暴力破解密码;邮件服务器的25端口呢,可以设limit 30/min limit-burst 60,既能发批量邮件,又不会被当成垃圾邮件源。

    有时候配完规则发现流量没被限制,先别慌着删规则,大概率是这几个小细节没注意。比如规则顺序搞错了,你要是先写了“允许所有流量通过”,后面的limit规则根本不会生效,得把限制规则挪到前面去;或者链选错了,想拦别人访问你服务器,得用INPUT链,要是不小心写到OUTPUT链,当然没反应;还有可能是limit-burst设太大了,比如你服务器平时每秒就来50个包,结果设了1000,“令牌桶”永远装不满,自然限不住流量, 从业务峰值的1.5倍开始试,慢慢调。

    配好的规则怎么保存才不会重启服务器就没了?不同系统方法不一样。要是用CentOS或RHEL,直接执行service iptables save,规则就存到/etc/sysconfig/iptables里了;Debian或Ubuntu的话,得用iptables-save > /etc/iptables/rules.v4(IPv4),再在/etc/rc.local里加一句iptables-restore < /etc/iptables/rules.v4,开机就会自动加载。嫌麻烦的话,装个iptables-persistent工具,Debian系用apt install iptables-persistent,CentOS系用yum install iptables-services,配完规则它会自动保存,省事儿不少。

    想知道哪些包被limit模块拦了?教你个办法,在limit规则后面加条日志规则,比如在-j DROP前面加上-j LOG log-prefix “LIMIT_DROP: “,这样被拦的包就会记到日志里。然后用tail -f /var/log/messages(CentOS系统)或者tail -f /var/log/syslog(Debian系统)盯着日志看,就能看到“LIMIT_DROP: IN=eth0 …”这样的记录,里面有来源IP、端口这些信息,排查问题特别方便。


    三、常见问题解答 (FAQ)

    如何区分limit模块和connlimit模块?它们的应用场景有什么不同?

    limit模块和connlimit模块都能控制流量,但核心逻辑不同:limit模块基于“速率限流”(如每秒允许10个包),不区分来源IP,适用于控制整体流量(如防CC攻击);connlimit模块基于“连接数限流”(如单个IP最多10个并发连接),按IP或端口限制连接数量,适用于限制单IP的连接资源(如SSH登录次数)。简单说,前者管“速度”,后者管“数量”,可以根据需求组合使用。

    配置limit和limit-burst时,有没有推荐的参数值参考?

    参数值需根据业务场景调整,新手可参考“突发值=2-3倍速率”的经验公式:
    • Web服务器(80/443端口): limit 100/min limit-burst 200(允许突发200个请求,后续每分钟100个,适配正常访客浏览);
    • SSH端口(22端口): limit 5/min limit-burst 10(限制登录频率,防止暴力破解);
    • 邮件服务器(25端口): limit 30/min limit-burst 60(兼顾批量邮件发送和防垃圾邮件)。

    配置limit规则后发现流量没有被限制,可能是什么原因?

    常见原因有3个:

  • 规则顺序错误:若前面有“允许所有流量”的规则(如-A INPUT -j ACCEPT),limit规则会被跳过,需将limit规则放在允许规则前面;
  • 链选择错误:限制入站流量用INPUT链,出站用OUTPUT链,选错链会导致规则不生效;
    3. 参数设置过大:若limit-burst设得远大于实际流量(如1000),会导致“令牌桶”始终有令牌,无法触发限流, 从业务峰值流量的1.5倍开始测试。
  • 配置好的limit规则如何永久保存,避免服务器重启后失效?

    不同Linux发行版保存方法不同:
    • CentOS/RHEL系统:执行service iptables save,规则会保存到/etc/sysconfig/iptables;
    • Debian/Ubuntu系统:执行iptables-save > /etc/iptables/rules.v4(IPv4)或rules.v6(IPv6),并在/etc/rc.local中添加iptables-restore < /etc/iptables/rules.v4确保开机加载;
    • 通用方法:使用iptables-persistent工具(Debian系安装apt install iptables-persistent,CentOS系安装yum install iptables-services),配置后自动保存规则。

    如何查看被limit模块拦截的数据包日志?

    需先添加日志规则:在limit规则后添加-j LOG log-prefix “LIMIT_DROP: “(例如:iptables -A INPUT -p tcp dport 80 -m limit limit 10/min limit-burst 20 -j LOG log-prefix “LIMIT_DROP: “),然后通过tail -f /var/log/messages(CentOS)或tail -f /var/log/syslog(Debian)查看日志,拦截记录会显示“LIMIT_DROP: IN=eth0 …”格式,包含来源IP、端口等信息,方便排查异常流量。

    原文链接:https://www.mayiym.com/43608.html,转载请注明出处。
    0
    显示验证码
    没有账号?注册  忘记密码?

    社交账号快速登录

    微信扫一扫关注
    如已关注,请回复“登录”二字获取验证码