1. 项目概述当DDoS来袭你的Linux防线够硬吗干运维和安全这行最怕半夜被电话叫醒一看监控大屏流量曲线像坐了火箭一样直冲云霄业务响应慢如蜗牛甚至直接挂掉——十有八九是碰上DDoS了。这种时候每一秒都是真金白银的损失根本来不及等云厂商的防护策略完全生效或者协调第三方清洗服务。作为第一道也是最后一道自主可控的防线服务器本地的防火墙配置就成了应急响应的“胜负手”。而在Linux世界里iptables依然是那个历经风雨、深入骨髓的经典工具。别看现在有nftables要接班但在无数生产环境、应急脚本里iptables的命令依然是最直接、最有效的“止血钳”。今天我就结合多年踩坑经验掰开揉碎了讲清楚在DDoS应急响应的黄金十分钟里如何用iptables快速构建防线、精准过滤、并尽可能减少对正常业务的影响。无论你是运维工程师、安全工程师还是需要管理自己服务器的开发者这套方法都能让你在攻击来临时不至于手忙脚乱。2. 核心思路从“全盘封锁”到“外科手术式”过滤面对海量的DDoS流量新手最容易犯的错误就是惊慌失措执行一个iptables -P INPUT DROP把所有人都挡在外面。这看似简单粗暴有效实则等同于在洪水来时把自己反锁在屋里连救援队也进不来业务彻底中断。正确的应急思路应该是一个渐进式、有层次的防御策略核心目标是在保证核心业务或管理通道最低限度可用的前提下最大限度地丢弃非法和攻击流量。2.1 策略分层建立三道防火墙防线我的策略通常分为三层像洋葱一样层层过滤“白名单”核心层首先必须确保“自己人”还能进来。这包括你的运维跳板机IP、监控系统IP、关键的内部服务IP等。这部分规则拥有最高优先级在任何阻断规则之前生效确保攻击中你还能登录服务器查看状态、调整策略。“特征过滤”战术层这是对抗DDoS的主战场。针对不同类型的攻击如SYN Flood、UDP Flood、ICMP Flood设置基于协议、端口、报文特征如--tcp-flags、连接数connlimit和频率limit的过滤规则。这一层的目标是快速识别并丢弃明显的攻击流量。“默认限制”防护层在前两层之后对剩余的、未被识别的流量施加严格的默认限制。例如限制每个IP对特定服务的新建连接速率或者对未知流量直接丢弃。这是最后的保险。2.2 状态检测是灵魂连接跟踪conntrack的妙用iptables的强大之处在于其连接跟踪机制。-m state --state模块能识别一个数据包是属于“新建”NEW、“已建立”ESTABLISHED还是“相关”RELATED的连接。在DDoS防御中这至关重要放行ESTABLISHED/RELATED首先所有已建立的合法连接及其相关数据包如FTP的数据连接必须无条件放行。这能保证正在进行的业务不受影响。规则通常放在最前面iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT。严控NEW然后我们所有防御规则的重点都落在对“新建”NEW连接的控制上。攻击流量绝大部分表现为海量的新建连接请求。2.3 顺序就是生命iptables规则链的顺序至关重要iptables的规则是按顺序逐条匹配的第一条匹配的规则生效后就不再继续。因此规则顺序决定了防火墙的行为逻辑。一个经典的DDoS应急规则顺序应该是放行本地回环接口lo的流量。放行所有已建立和相关连接。放行核心白名单IP。针对攻击特征设置丢弃规则如限制SYN包速率。对特定服务设置连接数限制。设置一个相对宽松但安全的默认策略如对未匹配流量记录日志后丢弃。3. 实战配置针对常见DDoS攻击的iptables规则集理论说再多不如直接上“武器库”。下面这套规则组合拳是我在多次应急中提炼出来的你可以根据实际情况调整参数后直接使用。请注意操作前务必确保你有其他方式如通过云控制台能访问服务器以防规则错误导致自己也被锁在外面。3.1 基础安全与状态放行在开始针对性防御前先搭建一个安全的基础框架。# 1. 设置默认策略为丢弃谨慎最好在已有其他通道时设置 iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT # 通常允许所有出站 # 2. 清空所有现有规则和计数器从头开始 iptables -F iptables -X iptables -Z # 3. 允许本地回环许多本地服务依赖它 iptables -A INPUT -i lo -j ACCEPT # 4. 黄金规则放行所有已建立和相关连接保证现有业务不中断 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT注意第一步设置INPUT DROP是高风险操作。更稳妥的做法是先不修改默认策略默认通常是ACCEPT而是精心编写规则最后一条规则设置为-j DROP。这样即使规则有问题默认策略还能让你有机会连接。这里为了演示完整策略先行设置。3.2 核心管理通道白名单这是你的“生命线”。假设你的运维IP是203.0.113.100和198.51.100.200。# 允许来自特定管理IP的SSH连接22端口 iptables -A INPUT -p tcp --dport 22 -s 203.0.113.100 -j ACCEPT iptables -A INPUT -p tcp --dport 22 -s 198.51.100.200 -j ACCEPT # 如果你使用其他管理端口或协议如通过80端口访问管理后台同样添加 # iptables -A INPUT -p tcp --dport 80 -s 203.0.113.100 -j ACCEPT实操心得白名单IP不要写死成单个IP最好是你办公网络的出口IP段。但应急时为了精确可以先写单个IP。同时强烈建议在启用严格白名单前先确保通过云控制台的VNC或串口功能能访问服务器这是最后的救命稻草。3.3 对抗SYN Flood攻击SYN Flood是最常见的DDoS攻击之一攻击者发送大量TCP SYN包而不完成三次握手耗尽服务器连接资源。# 1. 限制每秒每个IP地址只能发起3个新的TCP连接针对Web服务80443端口 # 这能有效减缓单个攻击IP的冲击 iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 3 --connlimit-mask 32 -j DROP iptables -A INPUT -p tcp --syn --dport 443 -m connlimit --connlimit-above 3 --connlimit-mask 32 -j DROP # 2. 使用limit模块限制SYN包的接收速率 # 前5个包每秒正常通过超过部分按每秒3个的速率限制--limit-burst 5 --limit 3/second iptables -A INPUT -p tcp --syn -m limit --limit 3/second --limit-burst 5 -j ACCEPT # 超过限制的SYN包记录日志并丢弃日志前缀为“SYN Flood: ” iptables -A INPUT -p tcp --syn -j LOG --log-prefix “SYN Flood: ” --log-level 4 iptables -A INPUT -p tcp --syn -j DROP参数解读--syn匹配TCP标志位中SYN为1ACK为0的包即连接发起包。-m connlimit连接数限制模块。--connlimit-above 3表示每个IP超过3个连接就触发。--connlimit-mask 32表示按单个IP32位掩码统计如果想按/24网段统计可以设为24。-m limit令牌桶限速模块。--limit-burst 5是桶的容量初始允许的包数量--limit 3/second是往桶里添加令牌的速率。这个规则意味着短时间内允许突发5个SYN包但长期平均速率被限制在每秒3个。这对于减缓洪水攻击非常有效且对正常用户的短时访问影响较小。3.4 对抗UDP Flood攻击UDP是无连接的攻击者可以轻易伪造源IP发送大量UDP包到DNS53、NTP123或游戏端口。# 1. 对于非必要的UDP服务直接关闭或严格限制。例如如果你不自建DNS可以限制外网对53端口的UDP访问。 # 仅允许来自可信DNS解析器的查询例如8.8.8.8 iptables -A INPUT -p udp --dport 53 -s 8.8.8.8 -j ACCEPT iptables -A INPUT -p udp --dport 53 -j DROP # 2. 对于必须开放的UDP服务如游戏语音服务端口 10000进行速率限制 iptables -A INPUT -p udp --dport 10000 -m limit --limit 100/second --limit-burst 200 -j ACCEPT iptables -A INPUT -p udp --dport 10000 -j DROP # 3. 针对常见的UDP反射放大攻击端口如NTP 123 DNS 53除非必要否则应在边界路由器或云安全组上直接封锁入站。3.5 对抗ICMP Flood攻击虽然ICMP Flood威力通常不如SYN/UDP Flood但也会消耗带宽和资源。# 完全禁用Ping响应回声请求 iptables -A INPUT -p icmp --icmp-type echo-request -j DROP # 或者限制Ping的速率既满足基本网络诊断需求又防止洪水 iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/second --limit-burst 5 -j ACCEPT iptables -A INPUT -p icmp --icmp-type echo-request -j DROP3.6 业务端口放行与全局限制在过滤了攻击流量后需要放行你的正常业务端口。# 放行Web服务 iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp --dport 443 -j ACCEPT # 放行数据库通常只允许内网这里示例限制IP段 iptables -A INPUT -p tcp --dport 3306 -s 10.0.0.0/24 -j ACCEPT # 在放行规则之后设置最终的默认丢弃规则并记录日志 iptables -A INPUT -j LOG --log-prefix “IPTables-Dropped: ” --log-level 4 iptables -A INPUT -j DROP3.7 保存与恢复规则配置完成后规则仅存在于内存中重启会丢失。务必保存。# 对于CentOS/RHEL 6及以前或使用传统sysvinit的系统 service iptables save # 规则会保存在 /etc/sysconfig/iptables # 对于使用systemd的系统如CentOS 7 Ubuntu 16.04需要安装iptables-persistent或使用iptables-save命令 apt-get install iptables-persistent # Debian/Ubuntu # 安装时会提示保存当前规则 # 或者手动保存和恢复 iptables-save /etc/iptables.rules # 恢复时 iptables-restore /etc/iptables.rules # 可以设置开机自动恢复在/etc/rc.local文件中添加恢复命令确保rc.local有执行权限 echo “iptables-restore /etc/iptables.rules” /etc/rc.local chmod x /etc/rc.local4. 高级技巧与自动化监控基础的规则只能应对常规攻击。面对复杂的、变化的DDoS需要更灵活的策略。4.1 使用IPset管理海量黑名单当攻击来自成千上万个IP时一条条-s规则会极大降低iptables性能。IPset是解决方案它创建一个IP地址集合iptables直接匹配整个集合。# 1. 创建一个名为“ddos-blacklist”的IP散列集合存储IPv4地址 ipset create ddos-blacklist hash:ip hashsize 4096 maxelem 1000000 # hashsize是初始哈希表大小maxelem是最大元素数根据情况调整。 # 2. 在iptables中引用这个集合进行丢弃 iptables -I INPUT -m set --match-set ddos-blacklist src -j DROP # 3. 动态添加攻击IP到集合中。你可以从日志分析中提取IP或用脚本监控实时添加。 ipset add ddos-blacklist 192.0.2.100 ipset add ddos-blacklist 192.0.2.0/24 # 支持网段 # 4. 保存ipset规则否则重启丢失 ipset save ddos-blacklist /etc/ipset.conf # 恢复 ipset restore /etc/ipset.conf实操心得结合日志分析工具如fail2ban或简单的Shell脚本可以实时分析/var/log/messages或/var/log/kern.log其中记录了iptables的DROP日志自动将短时间内触发多次丢弃规则的IP添加到ipset黑名单中实现动态防御。4.2 连接数监控与告警单纯的丢弃是滞后的。更好的方法是在攻击规模尚小时就发现并预警。# 使用netstat或ss命令监控当前连接数 netstat -ntu | awk ‘{print $5}’ | cut -d: -f1 | sort | uniq -c | sort -n # 这个命令会列出每个IP当前的连接数并按数量排序。排在前面的、连接数异常高的IP可能就是攻击源。 # 可以写一个cron脚本定期执行此命令如果某个IP的连接数超过阈值如500就自动将其加入ipset黑名单并发送告警。一个简单的监控脚本示例#!/bin/bash # 监控连接数并封禁 THRESHOLD1000 LOG_FILE“/var/log/iptables-monitor.log” BLACKLIST“ddos-blacklist” netstat -ntu | awk ‘{print $5}’ | cut -d: -f1 | sort | uniq -c | while read count ip do if [[ “$count” -gt “$THRESHOLD” ]] [[ “$ip” ! “Address” ]]; then # 检查是否已在黑名单 if ! ipset test $BLACKLIST $ip 2/dev/null; then ipset add $BLACKLIST $ip echo “$(date): 封禁IP $ip 连接数 $count” $LOG_FILE # 这里可以添加发送告警邮件的命令 fi fi done4.3 内核参数调优iptables背后是Linux内核的Netfilter框架。调整内核参数可以提升服务器抗DDoS能力。主要修改/etc/sysctl.conf文件。# 生效命令sysctl -p # 启用SYN Cookies在SYN队列满时提供防护 net.ipv4.tcp_syncookies 1 # 减少SYNACK重试次数加快回收半连接 net.ipv4.tcp_synack_retries 2 net.ipv4.tcp_syn_retries 2 # 增大TCP连接跟踪表的大小 net.netfilter.nf_conntrack_max 655360 net.netfilter.nf_conntrack_tcp_timeout_established 3600 # 调整本地端口范围 net.ipv4.ip_local_port_range 1024 65535 # 处理TIME_WAIT状态加快回收 net.ipv4.tcp_tw_reuse 1 net.ipv4.tcp_tw_recycle 0 # 注意在NAT环境下建议为0否则可能有问题 net.ipv4.tcp_fin_timeout 30 # 增大等待连接队列的大小 net.ipv4.tcp_max_syn_backlog 8192 net.core.somaxconn 65535重要提示内核参数调优需要根据服务器硬件、业务类型和网络环境进行测试切勿盲目复制。不当的配置可能导致性能下降或网络异常。5. 应急响应流程与事后复盘当监控告警响起确认是DDoS攻击后一个清晰的流程能帮你节省宝贵时间。5.1 黄金十分钟检查清单确认攻击通过流量监控图如云监控、Zabbix、Prometheus确认流量激增模式区分是真实业务高峰还是攻击。保障通道立即通过云控制台VNC/串口或白名单IP的SSH登录服务器。切勿在不确定的情况下修改正在使用的连接通道的防火墙规则。初步评估使用iftop、nethogs、ss -ntu等命令快速定位流量最大的协议、端口和源IP。启动预案根据攻击类型SYN/UDP/ICMP快速应用上文对应的iptables规则模板。建议提前准备好脚本应急时一键执行。观察效果应用规则后持续观察流量和业务恢复情况。如果效果不佳分析攻击特征调整规则如降低limit值添加更多IP到黑名单。寻求协同同时联系云服务商或IDC启用他们提供的DDoS高防或清洗服务。本地iptables云端清洗是组合拳。记录日志详细记录攻击开始时间、特征、采取的规则、生效时间、业务影响等用于事后复盘。5.2 常见问题与排查技巧问题规则不生效检查顺序用iptables -L -n -v --line-numbers查看规则列表和匹配计数。确认你的规则是否被前面的规则提前匹配了。检查链的默认策略确认INPUT链的默认策略iptables -L -n看链名后面的括号。如果是ACCEPT那么必须有一条最终的-j DROP规则。检查协议和端口确认攻击流量使用的协议和端口与你规则中写的是否一致。问题服务器CPU或连接跟踪表被占满查看连接数cat /proc/net/nf_conntrack | wc -l或conntrack -L | wc -l。优化规则将针对性的DROP规则尽量放在前面减少无效匹配。使用ipset管理大名单。调整内核参数如上文所述增大nf_conntrack_max。问题误封了正常用户使用日志在DROP规则前加-j LOG分析被丢弃的包的特征看是否来自正常用户。谨慎使用限速limit和connlimit模块比直接DROP更温和。可以先设置较宽松的阈值观察后再收紧。设置例外对于已知的CDN节点IP如Cloudflare、搜索引擎IP等设置白名单规则放在限速/丢弃规则之前。问题攻击停止后业务仍慢清理状态表大量攻击可能留下垃圾连接状态。可以尝试conntrack -F清空连接跟踪表注意这会断掉所有当前连接请在业务低峰期进行。检查残留规则攻击后记得清理临时添加的、过于严格的规则特别是全局性的限速规则。5.3 事后复盘与加固攻击平息后工作远未结束。日志分析深入分析攻击期间的防火墙日志、系统日志提取攻击源IP、攻击手法、持续时间、峰值流量等形成攻击报告。规则优化将应急时有效的规则进行整理、优化并固化为长期策略或脚本。预案更新根据此次攻击暴露的不足更新你的应急响应预案和脚本。架构审视考虑是否需要在架构层面提升防御能力如启用云服务商的DDoS基础防护、购买高防IP/高防包、部署Web应用防火墙WAF、将业务部署在负载均衡后端以隐藏真实服务器IP等。监控加强完善监控告警不仅监控流量还要监控服务器TCP连接数、半连接数、conntrack表使用率等指标做到更早预警。我个人在实际操作中的体会是iptables在DDoS应急中更像一把“手术刀”而非“盾牌”。它无法抵御超大规模流量型攻击那需要上游清洗但对于应用层攻击、低频慢速攻击以及为等待云端防护生效争取时间它无可替代。真正的安全在于“纵深防御”iptables是其中关键且完全由你掌控的一层。平时多练习把常用命令和脚本准备好攻击来临时才能沉着应对。最后别忘了定期测试你的防火墙规则和应急流程毕竟防火墙的第一要义是“可用”别让防御规则在关键时刻挡住了你自己。
Linux服务器DDoS应急:iptables分层防御与实战规则详解
1. 项目概述当DDoS来袭你的Linux防线够硬吗干运维和安全这行最怕半夜被电话叫醒一看监控大屏流量曲线像坐了火箭一样直冲云霄业务响应慢如蜗牛甚至直接挂掉——十有八九是碰上DDoS了。这种时候每一秒都是真金白银的损失根本来不及等云厂商的防护策略完全生效或者协调第三方清洗服务。作为第一道也是最后一道自主可控的防线服务器本地的防火墙配置就成了应急响应的“胜负手”。而在Linux世界里iptables依然是那个历经风雨、深入骨髓的经典工具。别看现在有nftables要接班但在无数生产环境、应急脚本里iptables的命令依然是最直接、最有效的“止血钳”。今天我就结合多年踩坑经验掰开揉碎了讲清楚在DDoS应急响应的黄金十分钟里如何用iptables快速构建防线、精准过滤、并尽可能减少对正常业务的影响。无论你是运维工程师、安全工程师还是需要管理自己服务器的开发者这套方法都能让你在攻击来临时不至于手忙脚乱。2. 核心思路从“全盘封锁”到“外科手术式”过滤面对海量的DDoS流量新手最容易犯的错误就是惊慌失措执行一个iptables -P INPUT DROP把所有人都挡在外面。这看似简单粗暴有效实则等同于在洪水来时把自己反锁在屋里连救援队也进不来业务彻底中断。正确的应急思路应该是一个渐进式、有层次的防御策略核心目标是在保证核心业务或管理通道最低限度可用的前提下最大限度地丢弃非法和攻击流量。2.1 策略分层建立三道防火墙防线我的策略通常分为三层像洋葱一样层层过滤“白名单”核心层首先必须确保“自己人”还能进来。这包括你的运维跳板机IP、监控系统IP、关键的内部服务IP等。这部分规则拥有最高优先级在任何阻断规则之前生效确保攻击中你还能登录服务器查看状态、调整策略。“特征过滤”战术层这是对抗DDoS的主战场。针对不同类型的攻击如SYN Flood、UDP Flood、ICMP Flood设置基于协议、端口、报文特征如--tcp-flags、连接数connlimit和频率limit的过滤规则。这一层的目标是快速识别并丢弃明显的攻击流量。“默认限制”防护层在前两层之后对剩余的、未被识别的流量施加严格的默认限制。例如限制每个IP对特定服务的新建连接速率或者对未知流量直接丢弃。这是最后的保险。2.2 状态检测是灵魂连接跟踪conntrack的妙用iptables的强大之处在于其连接跟踪机制。-m state --state模块能识别一个数据包是属于“新建”NEW、“已建立”ESTABLISHED还是“相关”RELATED的连接。在DDoS防御中这至关重要放行ESTABLISHED/RELATED首先所有已建立的合法连接及其相关数据包如FTP的数据连接必须无条件放行。这能保证正在进行的业务不受影响。规则通常放在最前面iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT。严控NEW然后我们所有防御规则的重点都落在对“新建”NEW连接的控制上。攻击流量绝大部分表现为海量的新建连接请求。2.3 顺序就是生命iptables规则链的顺序至关重要iptables的规则是按顺序逐条匹配的第一条匹配的规则生效后就不再继续。因此规则顺序决定了防火墙的行为逻辑。一个经典的DDoS应急规则顺序应该是放行本地回环接口lo的流量。放行所有已建立和相关连接。放行核心白名单IP。针对攻击特征设置丢弃规则如限制SYN包速率。对特定服务设置连接数限制。设置一个相对宽松但安全的默认策略如对未匹配流量记录日志后丢弃。3. 实战配置针对常见DDoS攻击的iptables规则集理论说再多不如直接上“武器库”。下面这套规则组合拳是我在多次应急中提炼出来的你可以根据实际情况调整参数后直接使用。请注意操作前务必确保你有其他方式如通过云控制台能访问服务器以防规则错误导致自己也被锁在外面。3.1 基础安全与状态放行在开始针对性防御前先搭建一个安全的基础框架。# 1. 设置默认策略为丢弃谨慎最好在已有其他通道时设置 iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT # 通常允许所有出站 # 2. 清空所有现有规则和计数器从头开始 iptables -F iptables -X iptables -Z # 3. 允许本地回环许多本地服务依赖它 iptables -A INPUT -i lo -j ACCEPT # 4. 黄金规则放行所有已建立和相关连接保证现有业务不中断 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT注意第一步设置INPUT DROP是高风险操作。更稳妥的做法是先不修改默认策略默认通常是ACCEPT而是精心编写规则最后一条规则设置为-j DROP。这样即使规则有问题默认策略还能让你有机会连接。这里为了演示完整策略先行设置。3.2 核心管理通道白名单这是你的“生命线”。假设你的运维IP是203.0.113.100和198.51.100.200。# 允许来自特定管理IP的SSH连接22端口 iptables -A INPUT -p tcp --dport 22 -s 203.0.113.100 -j ACCEPT iptables -A INPUT -p tcp --dport 22 -s 198.51.100.200 -j ACCEPT # 如果你使用其他管理端口或协议如通过80端口访问管理后台同样添加 # iptables -A INPUT -p tcp --dport 80 -s 203.0.113.100 -j ACCEPT实操心得白名单IP不要写死成单个IP最好是你办公网络的出口IP段。但应急时为了精确可以先写单个IP。同时强烈建议在启用严格白名单前先确保通过云控制台的VNC或串口功能能访问服务器这是最后的救命稻草。3.3 对抗SYN Flood攻击SYN Flood是最常见的DDoS攻击之一攻击者发送大量TCP SYN包而不完成三次握手耗尽服务器连接资源。# 1. 限制每秒每个IP地址只能发起3个新的TCP连接针对Web服务80443端口 # 这能有效减缓单个攻击IP的冲击 iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 3 --connlimit-mask 32 -j DROP iptables -A INPUT -p tcp --syn --dport 443 -m connlimit --connlimit-above 3 --connlimit-mask 32 -j DROP # 2. 使用limit模块限制SYN包的接收速率 # 前5个包每秒正常通过超过部分按每秒3个的速率限制--limit-burst 5 --limit 3/second iptables -A INPUT -p tcp --syn -m limit --limit 3/second --limit-burst 5 -j ACCEPT # 超过限制的SYN包记录日志并丢弃日志前缀为“SYN Flood: ” iptables -A INPUT -p tcp --syn -j LOG --log-prefix “SYN Flood: ” --log-level 4 iptables -A INPUT -p tcp --syn -j DROP参数解读--syn匹配TCP标志位中SYN为1ACK为0的包即连接发起包。-m connlimit连接数限制模块。--connlimit-above 3表示每个IP超过3个连接就触发。--connlimit-mask 32表示按单个IP32位掩码统计如果想按/24网段统计可以设为24。-m limit令牌桶限速模块。--limit-burst 5是桶的容量初始允许的包数量--limit 3/second是往桶里添加令牌的速率。这个规则意味着短时间内允许突发5个SYN包但长期平均速率被限制在每秒3个。这对于减缓洪水攻击非常有效且对正常用户的短时访问影响较小。3.4 对抗UDP Flood攻击UDP是无连接的攻击者可以轻易伪造源IP发送大量UDP包到DNS53、NTP123或游戏端口。# 1. 对于非必要的UDP服务直接关闭或严格限制。例如如果你不自建DNS可以限制外网对53端口的UDP访问。 # 仅允许来自可信DNS解析器的查询例如8.8.8.8 iptables -A INPUT -p udp --dport 53 -s 8.8.8.8 -j ACCEPT iptables -A INPUT -p udp --dport 53 -j DROP # 2. 对于必须开放的UDP服务如游戏语音服务端口 10000进行速率限制 iptables -A INPUT -p udp --dport 10000 -m limit --limit 100/second --limit-burst 200 -j ACCEPT iptables -A INPUT -p udp --dport 10000 -j DROP # 3. 针对常见的UDP反射放大攻击端口如NTP 123 DNS 53除非必要否则应在边界路由器或云安全组上直接封锁入站。3.5 对抗ICMP Flood攻击虽然ICMP Flood威力通常不如SYN/UDP Flood但也会消耗带宽和资源。# 完全禁用Ping响应回声请求 iptables -A INPUT -p icmp --icmp-type echo-request -j DROP # 或者限制Ping的速率既满足基本网络诊断需求又防止洪水 iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/second --limit-burst 5 -j ACCEPT iptables -A INPUT -p icmp --icmp-type echo-request -j DROP3.6 业务端口放行与全局限制在过滤了攻击流量后需要放行你的正常业务端口。# 放行Web服务 iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp --dport 443 -j ACCEPT # 放行数据库通常只允许内网这里示例限制IP段 iptables -A INPUT -p tcp --dport 3306 -s 10.0.0.0/24 -j ACCEPT # 在放行规则之后设置最终的默认丢弃规则并记录日志 iptables -A INPUT -j LOG --log-prefix “IPTables-Dropped: ” --log-level 4 iptables -A INPUT -j DROP3.7 保存与恢复规则配置完成后规则仅存在于内存中重启会丢失。务必保存。# 对于CentOS/RHEL 6及以前或使用传统sysvinit的系统 service iptables save # 规则会保存在 /etc/sysconfig/iptables # 对于使用systemd的系统如CentOS 7 Ubuntu 16.04需要安装iptables-persistent或使用iptables-save命令 apt-get install iptables-persistent # Debian/Ubuntu # 安装时会提示保存当前规则 # 或者手动保存和恢复 iptables-save /etc/iptables.rules # 恢复时 iptables-restore /etc/iptables.rules # 可以设置开机自动恢复在/etc/rc.local文件中添加恢复命令确保rc.local有执行权限 echo “iptables-restore /etc/iptables.rules” /etc/rc.local chmod x /etc/rc.local4. 高级技巧与自动化监控基础的规则只能应对常规攻击。面对复杂的、变化的DDoS需要更灵活的策略。4.1 使用IPset管理海量黑名单当攻击来自成千上万个IP时一条条-s规则会极大降低iptables性能。IPset是解决方案它创建一个IP地址集合iptables直接匹配整个集合。# 1. 创建一个名为“ddos-blacklist”的IP散列集合存储IPv4地址 ipset create ddos-blacklist hash:ip hashsize 4096 maxelem 1000000 # hashsize是初始哈希表大小maxelem是最大元素数根据情况调整。 # 2. 在iptables中引用这个集合进行丢弃 iptables -I INPUT -m set --match-set ddos-blacklist src -j DROP # 3. 动态添加攻击IP到集合中。你可以从日志分析中提取IP或用脚本监控实时添加。 ipset add ddos-blacklist 192.0.2.100 ipset add ddos-blacklist 192.0.2.0/24 # 支持网段 # 4. 保存ipset规则否则重启丢失 ipset save ddos-blacklist /etc/ipset.conf # 恢复 ipset restore /etc/ipset.conf实操心得结合日志分析工具如fail2ban或简单的Shell脚本可以实时分析/var/log/messages或/var/log/kern.log其中记录了iptables的DROP日志自动将短时间内触发多次丢弃规则的IP添加到ipset黑名单中实现动态防御。4.2 连接数监控与告警单纯的丢弃是滞后的。更好的方法是在攻击规模尚小时就发现并预警。# 使用netstat或ss命令监控当前连接数 netstat -ntu | awk ‘{print $5}’ | cut -d: -f1 | sort | uniq -c | sort -n # 这个命令会列出每个IP当前的连接数并按数量排序。排在前面的、连接数异常高的IP可能就是攻击源。 # 可以写一个cron脚本定期执行此命令如果某个IP的连接数超过阈值如500就自动将其加入ipset黑名单并发送告警。一个简单的监控脚本示例#!/bin/bash # 监控连接数并封禁 THRESHOLD1000 LOG_FILE“/var/log/iptables-monitor.log” BLACKLIST“ddos-blacklist” netstat -ntu | awk ‘{print $5}’ | cut -d: -f1 | sort | uniq -c | while read count ip do if [[ “$count” -gt “$THRESHOLD” ]] [[ “$ip” ! “Address” ]]; then # 检查是否已在黑名单 if ! ipset test $BLACKLIST $ip 2/dev/null; then ipset add $BLACKLIST $ip echo “$(date): 封禁IP $ip 连接数 $count” $LOG_FILE # 这里可以添加发送告警邮件的命令 fi fi done4.3 内核参数调优iptables背后是Linux内核的Netfilter框架。调整内核参数可以提升服务器抗DDoS能力。主要修改/etc/sysctl.conf文件。# 生效命令sysctl -p # 启用SYN Cookies在SYN队列满时提供防护 net.ipv4.tcp_syncookies 1 # 减少SYNACK重试次数加快回收半连接 net.ipv4.tcp_synack_retries 2 net.ipv4.tcp_syn_retries 2 # 增大TCP连接跟踪表的大小 net.netfilter.nf_conntrack_max 655360 net.netfilter.nf_conntrack_tcp_timeout_established 3600 # 调整本地端口范围 net.ipv4.ip_local_port_range 1024 65535 # 处理TIME_WAIT状态加快回收 net.ipv4.tcp_tw_reuse 1 net.ipv4.tcp_tw_recycle 0 # 注意在NAT环境下建议为0否则可能有问题 net.ipv4.tcp_fin_timeout 30 # 增大等待连接队列的大小 net.ipv4.tcp_max_syn_backlog 8192 net.core.somaxconn 65535重要提示内核参数调优需要根据服务器硬件、业务类型和网络环境进行测试切勿盲目复制。不当的配置可能导致性能下降或网络异常。5. 应急响应流程与事后复盘当监控告警响起确认是DDoS攻击后一个清晰的流程能帮你节省宝贵时间。5.1 黄金十分钟检查清单确认攻击通过流量监控图如云监控、Zabbix、Prometheus确认流量激增模式区分是真实业务高峰还是攻击。保障通道立即通过云控制台VNC/串口或白名单IP的SSH登录服务器。切勿在不确定的情况下修改正在使用的连接通道的防火墙规则。初步评估使用iftop、nethogs、ss -ntu等命令快速定位流量最大的协议、端口和源IP。启动预案根据攻击类型SYN/UDP/ICMP快速应用上文对应的iptables规则模板。建议提前准备好脚本应急时一键执行。观察效果应用规则后持续观察流量和业务恢复情况。如果效果不佳分析攻击特征调整规则如降低limit值添加更多IP到黑名单。寻求协同同时联系云服务商或IDC启用他们提供的DDoS高防或清洗服务。本地iptables云端清洗是组合拳。记录日志详细记录攻击开始时间、特征、采取的规则、生效时间、业务影响等用于事后复盘。5.2 常见问题与排查技巧问题规则不生效检查顺序用iptables -L -n -v --line-numbers查看规则列表和匹配计数。确认你的规则是否被前面的规则提前匹配了。检查链的默认策略确认INPUT链的默认策略iptables -L -n看链名后面的括号。如果是ACCEPT那么必须有一条最终的-j DROP规则。检查协议和端口确认攻击流量使用的协议和端口与你规则中写的是否一致。问题服务器CPU或连接跟踪表被占满查看连接数cat /proc/net/nf_conntrack | wc -l或conntrack -L | wc -l。优化规则将针对性的DROP规则尽量放在前面减少无效匹配。使用ipset管理大名单。调整内核参数如上文所述增大nf_conntrack_max。问题误封了正常用户使用日志在DROP规则前加-j LOG分析被丢弃的包的特征看是否来自正常用户。谨慎使用限速limit和connlimit模块比直接DROP更温和。可以先设置较宽松的阈值观察后再收紧。设置例外对于已知的CDN节点IP如Cloudflare、搜索引擎IP等设置白名单规则放在限速/丢弃规则之前。问题攻击停止后业务仍慢清理状态表大量攻击可能留下垃圾连接状态。可以尝试conntrack -F清空连接跟踪表注意这会断掉所有当前连接请在业务低峰期进行。检查残留规则攻击后记得清理临时添加的、过于严格的规则特别是全局性的限速规则。5.3 事后复盘与加固攻击平息后工作远未结束。日志分析深入分析攻击期间的防火墙日志、系统日志提取攻击源IP、攻击手法、持续时间、峰值流量等形成攻击报告。规则优化将应急时有效的规则进行整理、优化并固化为长期策略或脚本。预案更新根据此次攻击暴露的不足更新你的应急响应预案和脚本。架构审视考虑是否需要在架构层面提升防御能力如启用云服务商的DDoS基础防护、购买高防IP/高防包、部署Web应用防火墙WAF、将业务部署在负载均衡后端以隐藏真实服务器IP等。监控加强完善监控告警不仅监控流量还要监控服务器TCP连接数、半连接数、conntrack表使用率等指标做到更早预警。我个人在实际操作中的体会是iptables在DDoS应急中更像一把“手术刀”而非“盾牌”。它无法抵御超大规模流量型攻击那需要上游清洗但对于应用层攻击、低频慢速攻击以及为等待云端防护生效争取时间它无可替代。真正的安全在于“纵深防御”iptables是其中关键且完全由你掌控的一层。平时多练习把常用命令和脚本准备好攻击来临时才能沉着应对。最后别忘了定期测试你的防火墙规则和应急流程毕竟防火墙的第一要义是“可用”别让防御规则在关键时刻挡住了你自己。