iptables不解析HTTP内容,但可通过端口、协议、源IP、TCP标志位、连接状态等网络层特征精准防御CC和SYN Flood等攻击;需结合connlimit、limit、recent等模块按行为限流,并确保规则顺序合理、及时持久化。

iptables 本身不解析 HTTP 请求内容(比如 URL、User-Agent、Cookie 或 POST 数据),但它能精准识别并拦截基于网络层和传输层的请求特征——这些特征足够支撑对常见 HTTP 攻击(如 CC、SYN Flood、端口扫描)的有效防御。关键不是“拦什么内容”,而是“怎么从流量行为里抓出异常”。
盯住连接行为,而不是请求内容
HTTP/HTTPS 流量在传输层暴露的关键特征包括:端口(80/443)、协议(TCP)、源 IP、连接状态(NEW/ESTABLISHED)、TCP 标志位(如 --syn)、并发连接数、新建连接频率。iptables 正是靠这些可量化、可匹配的字段做决策。
- HTTPS 加密不影响端口和 IP 匹配,--dport 443 和 -s 203.0.113.66 依然有效
- 所有规则必须加 -p tcp,HTTP/HTTPS 都走 TCP,UDP 规则无效
- 入站 Web 流量一律操作 INPUT 链,别错用 OUTPUT 或 FORWARD
- 规则顺序决定成败:先放行白名单或已建立连接,再设限,最后 DROP,默认策略要兜底
按攻击类型选对应规则
不同攻击有不同“指纹”,匹配方式也不同:
-
单 IP 高频请求(CC 初级形态):用 connlimit 限制并发连接数
例:iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 15 --connlimit-mask 32 -j DROP
→ 同一 IP 最多保持 15 个活跃 HTTP 连接,超了就丢包 -
短连接洪水(每秒大量新请求):用 limit + --syn 控制新建连接速率
例:iptables -A INPUT -p tcp --dport 80 --syn -m limit --limit 12/s --limit-burst 24 -j ACCEPTiptables -A INPUT -p tcp --dport 80 --syn -j DROP
→ 允许每秒最多 12 个新连接(突发允许 24 个),其余 SYN 包直接丢弃 -
分散源 IP 的慢速 CC(绕过简单限速):用 recent 模块统计访问频次
例:iptables -A INPUT -p tcp --dport 80 -m state --state NEW -m recent --set --name httpreqiptables -A INPUT -p tcp --dport 80 -m state --state NEW -m recent --update --seconds 60 --hitcount 30 --name httpreq -j DROP
→ 同一 IP 60 秒内发起 30 次新连接,第 31 次起全拒 -
已知恶意 IP 或网段:直接封源地址
例:iptables -I INPUT -s 198.51.100.0/24 -j DROP
-I 插入开头,确保立即生效,比 -A 更优先
验证规则是否真起作用
光看 iptables -L -n -v 不够,得确认三点:
-
计数器动没动:执行
curl -I http://本机IP后,检查对应规则的 pkts 列是否增加 -
包到底到没到服务器:用
tcpdump -i any port 80抓包,看 SYN 是否抵达本机(若没抓到,问题可能在云平台安全组或负载均衡层) - 规则位置对不对:DROP 类规则不能放在白名单 ACCEPT 前面,否则合法流量被提前截断
别漏掉收尾动作
临时规则重启就失效,必须持久化:
- CentOS/RHEL:
service iptables save或iptables-save > /etc/sysconfig/iptables - Debian/Ubuntu:
iptables-save > /etc/iptables/rules.v4 - 建议搭配 fail2ban:它能自动解析 Nginx/Apache 日志,把高频 404、503、爬虫 User-Agent 等行为转成 iptables DROP 规则,实现动态拉黑
- 避免自锁:改 SSH(22 端口)规则前,务必先加一条允许当前 IP 的 ACCEPT 规则


















