如何通过iptables设置策略来有效防御DDoS攻击,确保网站稳定不受影响?
- 内容介绍
- 文章标签
- 相关推荐
为什么 DDoS 攻击会让你抓狂?——常见痛点
- 网站在高峰期突然崩溃。访问量骤降,业务直接中断。
- 监控告警频繁触发,却找不到具体的攻击来源。
- 为了阻止攻击而盲目封禁 IP。导致正常使用者也被误封,投诉不断。
- 每次手动更新防火墙规则耗时长,且缺乏可视化的日志分析。
iptables 基础:你的第一道防线
iptables 是 Linux 内核自带的防火墙工具,能够基于 IP、端口、协议还有连接状态等多维度对流量进行精准过滤。通过合理配置规则,你可以在源头上拦截大部分恶意请求。从而降低 DDoS 攻击对业务的冲击。
主要概念速览
- 链INPUT、OUTPUT、FORWARD 等,用于决定数据包的处理方向。
- 表filter、nat、mangle等。
- 匹配模块limit、connlimit、recent、conntrack 等,用于实现速率限制、并发连接数控制等高级策略。
一步到位的 DDoS 防御策略
1️⃣ 限制 SYN 包速率 – 抑制 SYN 洪水
# 每秒最多接受 1 个 SYN 包,突发最多 3 个
iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT
# 超出限制直接丢弃
iptables -A INPUT -p tcp --syn -j DROP
2️⃣ 控制单 IP 并发连接数 – 防止资源耗尽
# 单 IP 同时最多建立 15 条新连接。超过则丢弃
iptables -A INPUT -i eth0 -p tcp --syn -m connlimit --connlimit-above 15 -j DROP
3️⃣ 使用 recent 模块追踪异常行为 – 动态封禁高频 IP
# 将每次访问记录到 recent 列表
iptables -A INPUT -p tcp --dport 80 -m recent --name badguy --set
# 如果同一 IP 在 60 秒内超过 20 次访问,则拒绝后续请求
iptables -A INPUT -p tcp --dport 80 -m recent --name badguy \
--update --seconds 60 --hitcount 20 -j DROP
4️⃣ 丢弃无效或可疑的数据包 – 减少噪声流量
# 丢弃非状态的 NEW 包
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
# 丢弃未完成三次握手的半开连接
iptables -A INPUT -p tcp!--syn -m conntrack --ctstate NEW -j DROP
5️⃣ 白名单 + 黑名单双层防护 – 确保合法流量不受影响
# 放行内部网段
iptables -A INPUT -s 192.168.0.0/16 -j ACCEPT
# 屏蔽已知恶意 IP 或 IP 段
iptables -A INPUT -s 203.0.113.45/32 -j DROP
iptables -A INPUT -m iprange --src-range 198.51.100.0-198.51.100.255 -j DROP
至于自动化脚本。一分钟内检测并封禁高频访问 IP
以下 Bash 脚本会每分钟读取 /var/log/httpd/access_log统计同一 IP 在 1 分钟内访问次数超过 100 次 的记录,并将其加入 iptables 黑名单。此脚本仅作示例,请根据实际日志方法和阈值自行调整。
'"$THRESHOLD"' {print $2}' |
while read ip;do
# 检查是否已经封禁过避免重复添加规则
iptables‑save | grep –q "$ip"
if;n
echo "Blocking $ip due to high request rate"
iptables ‑I INPUT ‑s $ip ‑j DROP
fi
done
sleep 60 # 每分钟执行一次检测循环
done
与 Fail2Ban 联动,实现更智能的动态封禁
能够实时监控日志并自动生成 iptables 封禁规则。下面给出最简配置示例:
# 安装 Fail2Ban
sudo apt‑get update && sudo apt‑get install fail2ban
# 创建自定义 jail.local
enabled = true
filter = http-get-dos
action = iptables
logpath = /var/log/httpd/access_log*
maxretry = 100 # 一分钟内超过100次请求即触发封禁
findtime = 60 # 时间窗口为60秒
# 开启服务并设置开机自启
sudo systemctl start fail2ban
sudo systemctl enable fail2ban
监控与日志分析——及时发现潜在威胁
- 实时流量监控:Sar、Netstat、iftop 等工具帮助你观察入口带宽占用情况。
- 日志聚合网站:E.g.。ELK Stack 或 Graylog,可将 httpd、nginx 与 iptables 日志统一展示,快速定位异常 IP。
- alert 警报:Kibana 设置阈值报警。一旦某 IP 突然出现异常请求,即刻触发邮件或 Slack 通知。
常用方法 & 常见坑点提醒
A. 防止误封正常使用者——规则顺序很关键
先放行可信任流量,再执行限制或丢弃操作。例如这方面,
# 放行本地回环和已建立连接
iptables ‑A INPUT ‑i lo ‑j ACCEPT
iptables ‑A INPUT ‑m conntrack ‑‑ctstate ESTABLISHED。RELATED ‑j ACCEPT
# 再放行必要端口
iptables ‑A INPUT ‑p tcp ‑‑dport 22 ‑j ACCEPT
iptables ‑A INPUT ‑p tcp ‑‑dport 80 ‑j ACCEPT
iptables ‑A INPUT ‑p tcp ‑‑dport 443 ‑j ACCEPT
# 最终才是速率限制或黑名单…
B. 测试再上线——避免“杀鸡用牛刀”
- 在测试环境先执行 -C 参数验证规则是否冲突。
- 使用 -L –v –n –x 查看命令计数,确认新规则生效且不会导致合法流量被大量丢弃。
C. 定期备份 & 恢复
# 导出当前规则集为备份文件
sudo iptables‑save> /etc/iptables/rules.v4.backup
# 如需恢复
sudo iptables‑restore
从完整防御示例来看。从零到实战的一套脚本合集
把“防御成本”转化为“业务可靠性”
DDoS 攻击看似不可阻挡,但通过 iptables+脚本+Fail2Ban+日志监控** 的组合,你可以在攻击初期即快速识别并自动封禁高危 IP,同时确保正常使用者的访问体验不受影响。记得定期审计规则、做好备份,并结合上层 CDN/WAF 做层叠防护。这样才能真正把网站的稳定性提高到公司级水平。
.
为什么 DDoS 攻击会让你抓狂?——常见痛点
- 网站在高峰期突然崩溃。访问量骤降,业务直接中断。
- 监控告警频繁触发,却找不到具体的攻击来源。
- 为了阻止攻击而盲目封禁 IP。导致正常使用者也被误封,投诉不断。
- 每次手动更新防火墙规则耗时长,且缺乏可视化的日志分析。
iptables 基础:你的第一道防线
iptables 是 Linux 内核自带的防火墙工具,能够基于 IP、端口、协议还有连接状态等多维度对流量进行精准过滤。通过合理配置规则,你可以在源头上拦截大部分恶意请求。从而降低 DDoS 攻击对业务的冲击。
主要概念速览
- 链INPUT、OUTPUT、FORWARD 等,用于决定数据包的处理方向。
- 表filter、nat、mangle等。
- 匹配模块limit、connlimit、recent、conntrack 等,用于实现速率限制、并发连接数控制等高级策略。
一步到位的 DDoS 防御策略
1️⃣ 限制 SYN 包速率 – 抑制 SYN 洪水
# 每秒最多接受 1 个 SYN 包,突发最多 3 个
iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT
# 超出限制直接丢弃
iptables -A INPUT -p tcp --syn -j DROP
2️⃣ 控制单 IP 并发连接数 – 防止资源耗尽
# 单 IP 同时最多建立 15 条新连接。超过则丢弃
iptables -A INPUT -i eth0 -p tcp --syn -m connlimit --connlimit-above 15 -j DROP
3️⃣ 使用 recent 模块追踪异常行为 – 动态封禁高频 IP
# 将每次访问记录到 recent 列表
iptables -A INPUT -p tcp --dport 80 -m recent --name badguy --set
# 如果同一 IP 在 60 秒内超过 20 次访问,则拒绝后续请求
iptables -A INPUT -p tcp --dport 80 -m recent --name badguy \
--update --seconds 60 --hitcount 20 -j DROP
4️⃣ 丢弃无效或可疑的数据包 – 减少噪声流量
# 丢弃非状态的 NEW 包
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
# 丢弃未完成三次握手的半开连接
iptables -A INPUT -p tcp!--syn -m conntrack --ctstate NEW -j DROP
5️⃣ 白名单 + 黑名单双层防护 – 确保合法流量不受影响
# 放行内部网段
iptables -A INPUT -s 192.168.0.0/16 -j ACCEPT
# 屏蔽已知恶意 IP 或 IP 段
iptables -A INPUT -s 203.0.113.45/32 -j DROP
iptables -A INPUT -m iprange --src-range 198.51.100.0-198.51.100.255 -j DROP
至于自动化脚本。一分钟内检测并封禁高频访问 IP
以下 Bash 脚本会每分钟读取 /var/log/httpd/access_log统计同一 IP 在 1 分钟内访问次数超过 100 次 的记录,并将其加入 iptables 黑名单。此脚本仅作示例,请根据实际日志方法和阈值自行调整。
'"$THRESHOLD"' {print $2}' |
while read ip;do
# 检查是否已经封禁过避免重复添加规则
iptables‑save | grep –q "$ip"
if;n
echo "Blocking $ip due to high request rate"
iptables ‑I INPUT ‑s $ip ‑j DROP
fi
done
sleep 60 # 每分钟执行一次检测循环
done
与 Fail2Ban 联动,实现更智能的动态封禁
能够实时监控日志并自动生成 iptables 封禁规则。下面给出最简配置示例:
# 安装 Fail2Ban
sudo apt‑get update && sudo apt‑get install fail2ban
# 创建自定义 jail.local
enabled = true
filter = http-get-dos
action = iptables
logpath = /var/log/httpd/access_log*
maxretry = 100 # 一分钟内超过100次请求即触发封禁
findtime = 60 # 时间窗口为60秒
# 开启服务并设置开机自启
sudo systemctl start fail2ban
sudo systemctl enable fail2ban
监控与日志分析——及时发现潜在威胁
- 实时流量监控:Sar、Netstat、iftop 等工具帮助你观察入口带宽占用情况。
- 日志聚合网站:E.g.。ELK Stack 或 Graylog,可将 httpd、nginx 与 iptables 日志统一展示,快速定位异常 IP。
- alert 警报:Kibana 设置阈值报警。一旦某 IP 突然出现异常请求,即刻触发邮件或 Slack 通知。
常用方法 & 常见坑点提醒
A. 防止误封正常使用者——规则顺序很关键
先放行可信任流量,再执行限制或丢弃操作。例如这方面,
# 放行本地回环和已建立连接
iptables ‑A INPUT ‑i lo ‑j ACCEPT
iptables ‑A INPUT ‑m conntrack ‑‑ctstate ESTABLISHED。RELATED ‑j ACCEPT
# 再放行必要端口
iptables ‑A INPUT ‑p tcp ‑‑dport 22 ‑j ACCEPT
iptables ‑A INPUT ‑p tcp ‑‑dport 80 ‑j ACCEPT
iptables ‑A INPUT ‑p tcp ‑‑dport 443 ‑j ACCEPT
# 最终才是速率限制或黑名单…
B. 测试再上线——避免“杀鸡用牛刀”
- 在测试环境先执行 -C 参数验证规则是否冲突。
- 使用 -L –v –n –x 查看命令计数,确认新规则生效且不会导致合法流量被大量丢弃。
C. 定期备份 & 恢复
# 导出当前规则集为备份文件
sudo iptables‑save> /etc/iptables/rules.v4.backup
# 如需恢复
sudo iptables‑restore
从完整防御示例来看。从零到实战的一套脚本合集
把“防御成本”转化为“业务可靠性”
DDoS 攻击看似不可阻挡,但通过 iptables+脚本+Fail2Ban+日志监控** 的组合,你可以在攻击初期即快速识别并自动封禁高危 IP,同时确保正常使用者的访问体验不受影响。记得定期审计规则、做好备份,并结合上层 CDN/WAF 做层叠防护。这样才能真正把网站的稳定性提高到公司级水平。
.

