iptables的hashlimit模块可基于源IP对特定端口新建连接速率精准限流,如SSH端口每分钟最多5次、突发10次,需配合--state NEW、--hashlimit-mode srcip及DROP规则实现节奏控制,避免误断已建连接。
要对特定业务端口做访问限流,关键不是封禁,而是控制单位时间内的连接或请求节奏。iptables 本身不处理应用层逻辑,但通过 hashlimit 模块可基于连接新建速率(如每分钟多少个新 TCP 连接)实现精准、按源区分的限流,适合保护 SSH、API 端口等核心服务。
先确认你要保护的服务端口,例如:
限流需绑定协议 + 目标端口,并决定按什么维度独立计数——最常用的是 srcip(每个 IP 单独限流),避免误伤正常用户;若同一 IP 访问多个端口需互不影响,可用 srcip,dstport。
限制单个 IP 对 22 端口的新建连接不超过每分钟 5 次,允许短时突发 10 次:
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m hashlimit --hashlimit-above 5/min --hashlimit-burst 10 --hashlimit-mode srcip --hashlimit-name ssh_limit --hashlimit-htable-expire 300000 -j DROP
注意:--state NEW 必须加上,否则会把 ACK、FIN 等包也纳入统计,导致已建立连接被误断。
限流规则不能 standalone 使用,必须嵌入完整防护链中:
iptables -P INPUT DROP
-s 203.0.113.45,双重防护根据业务场景微调参数:
--hashlimit-above 20/min),并设较短过期时间(--hashlimit-htable-expire 60000)--hashlimit-mode dstport 单独限端口——它会对所有源 IP 共享一个桶,容易误伤iptables -L INPUT -n -v 查看匹配计数,验证是否触发