iptables的hashlimit模块无法直接限制api路径,需结合string模块匹配http请求行中的路径字符串,并按srcip独立限流,但仅适用于http明文流量,https或代理场景下应改用nginx等应用层限流。

可以用 iptables 的 hashlimit 模块对特定 API 路径做请求频率限制,但要注意:iptables 本身不解析 HTTP 请求体或 URI 路径,它只能基于 IP、端口、协议等网络层信息做匹配。要真正按 API 路径(比如 /api/v1/login)限流,必须结合其他机制——最常用且可靠的方式是利用内核的 string 模块匹配 HTTP 请求行中的路径字符串,并配合 hashlimit 实现“每个源 IP 对该路径的请求速率控制”。
前提:确认内核和 iptables 支持 string + hashlimit
执行以下命令检查模块是否可用:
iptables -m string --help > /dev/null && echo "string ok" || echo "missing string" iptables -m hashlimit --help > /dev/null && echo "hashlimit ok" || echo "missing hashlimit"
若提示 command not found 或 no such help,需重新编译内核模块或升级 iptables(建议使用 iptables-nft 或较新版本,如 1.8.7+)。
匹配特定 API 路径(如 /api/v1/login)
HTTP 请求的第一行通常是 POST /api/v1/login HTTP/1.1,我们用 string 模块在 TCP 负载中搜索该路径。注意:
- 只匹配
ESTABLISHED,RELATED连接中的请求(避免重复匹配握手包); - 限定目标端口为 80 或 443(HTTPS 流量明文路径不可见,此法仅适用于 HTTP 或 TLS 终止在本机的场景);
- 使用
algo bm(Boyer-Moore 算法)提升匹配效率; -
to:表示从客户端发来的数据(即请求方向)。
示例规则(每秒最多 3 次请求,超过则 DROP):
iptables -I INPUT -p tcp --dport 80 -m state --state ESTABLISHED,RELATED \ -m string --algo bm --from 0 --to 512 --string "GET /api/v1/login" -j HASHLIMIT \ --hashlimit-above 3/sec \ --hashlimit-burst 5 \ --hashlimit-mode srcip \ --hashlimit-name login_get \ --hashlimit-htable-expire 60000 \ --hashlimit-htable-max 50000 \ --hashlimit-htable-size 65536 \ -j DROP
同理可添加 POST 版本:--string "POST /api/v1/login"。若想统一匹配,可用更宽泛的 --string "/api/v1/login",但需警惕误匹配(如日志或响应体含该字符串)。
关键参数说明与调优建议
hashlimit 相关参数含义:
-
--hashlimit-above 3/sec:单个源 IP 每秒超 3 次即触发限流; -
--hashlimit-burst 5:允许短时突发 5 次(防偶发抖动); -
--hashlimit-mode srcip:按源 IP 哈希计数(也可加dstport区分端口); -
--hashlimit-name login_get:规则唯一标识名,用于共享哈希表; -
--hashlimit-htable-expire 60000:条目空闲 60 秒后自动清理(毫秒); -
--hashlimit-htable-size 65536:哈希表大小,影响内存占用与性能,按预估并发 IP 数设置。
⚠️ 注意:若服务在反向代理(如 Nginx)后,真实客户端 IP 可能被隐藏,此时 srcip 是代理 IP。应配合 X-Forwarded-For 处理——但这无法在 netfilter 层完成,需改由应用层或代理层限流(如 Nginx 的 limit_req)。
替代方案与注意事项
纯 iptables 对路径级限流有本质局限:
- HTTPS 流量中 URL 路径加密,
string模块无法匹配; - TCP 分片或 TLS 分帧可能导致路径字符串跨包,
string模块可能漏匹配; - 高并发下哈希表内存占用明显,需监控
/proc/net/ip_tables_names和系统负载; - 更推荐在 Web 服务器层(Nginx、Apache)或 API 网关(Kong、Traefik)中实现路径级限流,语义清晰、配置灵活、支持动态策略。
iptables + hashlimit + string 更适合作为轻量级兜底防护(例如防简单暴力扫描),而非主流量控手段。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










