广告

Linux防DoS攻击实战指南:从防火墙到限速的完整设置技巧

DoS攻击类型及防御目标

在Linux环境中,常见DoS攻击分为网络层和应用层两大类。综合防御需要明确目标:稳定可用性、可控资源使用、可观测性等。网络层攻击通常包括SYN洪泛、UDP洪泛、ICMP洪泛等,攻击目标是耗尽带宽、消耗连接状态表。应用层攻击则是针对应用逻辑、接口频次、缓存击穿等,容易绕过简单带宽限制,需要更高层次的请求速率控制。

在实际场景中,分层防御是关键:第一道是基于防火墙的访问控制与初步速率限制,第二道是内核和连接跟踪层的容量控制,第三道是应用层的请求速率与行为分析。分层防御可以显著降低异常流量对系统的冲击。

常见DoS攻击类型

本小节聚焦于对系统可以直接阻断或限制的攻击向量。SYN洪泛利用半打开连接迅速耗尽服务器的半连接队列,若队列被占满就会拒绝新连接。UDP洪泛通过大量无用UDP包占用带宽和主机资源。ICMP洪泛通过回显请求或错误消息造成网络设备与主机的处理压力,影响正常流量。

Linux防DoS攻击实战指南:从防火墙到限速的完整设置技巧

在应用层,HTTP/HTTPS洪泛通过伪造大量请求耗尽应用资源,或利用慢请求占用工作线程。Slowloris/Slow POST等慢速攻击更关注连接的持续时间与资源锁定。对策通常包含速率限制、连接并发上限、以及应用层的连接空闲超时。

在Linux系统中部署防火墙的基本原则

iptables与nftables的选择

Linux提供了两大防火墙框架:传统的iptables与现代的nftables。iptables兼容性强、生态完善,适合现有部署;nftables则统一了IPv4/IPv6、表、链的配置,语法更简洁,性能更好。选择要点包括现有脚本兼容性、内核版本、以及对高并发连接的需求。

在高并发场景下,nftables的分段链设计和更高效的状态跟踪会带来更清晰的规则组织和更低的CPU占用。若你打算逐步过渡,可以先在新主机或新服务上使用nftables,并把现有iptables规则逐步迁移。迁移策略应包含规则等效性、日志并发性及回滚计划。

默认策略与只允许的流量

防火墙的原则通常是“默认拒绝、显式放行”。这意味着将默认策略设置为DROP或REJECT,并仅允许运行所需的端口与协议。最小特权原则要求对管理端口、SSH、监控接口等进行严格限流与认证。必要的放行包括必要的入站HTTP/HTTPS、DNS、监控端口等。

为了提升抗攻击能力,需开启连接跟踪保护,对异常连接进行封锁与限速;对暴力扫描与错误风格的流量进行抑制。配套的日志记录有助于快速定位异常来源。日志驱动告警规则将成为持续防御的基础。

从防火墙到限速的完整设置流程

基于iptables的限速策略

在iptables中,可以使用限制连接速率并发连接数来抵御DoS。常见手段包括每IP连接速率限制同源地址的总连接数上限以及对异常端口的快速拒绝。下面展示一个典型示例:对HTTP(S)流量实施每秒100请求的速率限制,超过后丢弃。实现要点是正确应用在合适的链和匹配模块上。

# 示例:限制每个IP对80端口的并发连接数和速率
iptables -N DO_S_TOO_MEA
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 50 -j DO_S_TOO_MEA
iptables -A DO_S_TOO_MEA -m limit --limit 100/minute --limit-burst 200 -j LOG --log-prefix "IP_HTTP_CONN_LIMIT: "
iptables -A DO_S_TOO_MEA -j DROP

另外一种常见的策略是使用connlimit和hashlimit组合,对单源IP的连接速率进行更细粒度控制。核心思路是先判定流量是否超过阈值,再进行丢弃或记录。以下是一个简化示例:对TCP新建连接应用hashlimit,超过阈值即丢弃。关键参数包括hashlimit-name、hashlimit-above、hashlimit-burst及hashlimit-mode。

# 通过hashlimit对来自同一源IP的HTTP连接速率进行限制
iptables -A INPUT -p tcp --dport 80 -m hashlimit --hashlimit-name http_slim \--hashlimit-above 200/second --hashlimit-burst 400 \--hashlimit-mode srcip -j DROP

基于tc的带宽与连接限速

对于大流量攻击,单靠iptables可能不足以实现细粒度控制,此时可以结合tc(Traffic Control)进行队列管理与带宽限制。通过配置 policingtoken bucket模型,可对流入流量进行带宽抑制,防止峰值冲击核心网卡。实现思路是将入口接口绑定的队列类型设为pfifo或tbf,并按IP或端口进行分类。

# 使用tc对eth0入口带宽做线速限制(示例)
tc qdisc add dev eth0 root handle 1: htb default 12
tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit
tc class add dev eth0 parent 1:1 classid 1:12 htb rate 10mbit ceil 20mbit# 对单源IP进行速率限制(需要l2的hashing支撑)
tc qdisc add dev eth0 root handle 0: hashlimit

实际部署中,还可以结合u32过滤器ingress qdisc对特定流量进行更细粒度的策略管理。请注意,tc的组合和参数对系统资源有直接影响,应在测试环境中进行压力测试后再上线。

内核参数与连接跟踪的优化要点

sysctl参数配置

要提升整体的抗DoS能力,需要对内核参数进行调优。核心变量包括net.core.netdev_max_backlognet.core.somaxconnnet.ipv4.tcp_syncookies等。启用tcp_syncookies可以在半开连接时自动建立SYN cookie,降低SYN洪泛的影响。

# 常用系统参数调整(示例)
sysctl -w net.core.netdev_max_backlog=4096
sysctl -w net.core.somaxconn=4096
sysctl -w net.ipv4.tcp_syncookies=1
sysctl -w net.ipv4.tcp_fin_timeout=15
sysctl -w net.ipv4.tcp_max_syn_backlog=2048
sysctl -w net.netfilter.nf_conntrack_max=524288
# 保存到 /etc/sysctl.d/99-dos.conf
echo "net.core.netdev_max_backlog=4096" >> /etc/sysctl.d/99-dos.conf
echo "net.core.somaxconn=4096" >> /etc/sysctl.d/99-dos.conf
echo "net.ipv4.tcp_syncookies=1" >> /etc/sysctl.d/99-dos.conf
echo "net.ipv4.tcp_fin_timeout=15" >> /etc/sysctl.d/99-dos.conf
echo "net.ipv4.tcp_max_syn_backlog=2048" >> /etc/sysctl.d/99-dos.conf
echo "net.netfilter.nf_conntrack_max=524288" >> /etc/sysctl.d/99-dos.conf

连接跟踪表的容量管理

nf_conntrack表用于维护连接状态,容量不足会导致新连接被拒绝。定期监控并适当扩容是必要的。检查当前连接数最大容量,并为高峰期预留空间。

# 查看当前nf_conntrack状态与最大容量
cat /proc/sys/net/netfilter/nf_conntrack_max
cat /proc/net/nf_conntrack | wc -l
# 动态扩容示例(需要加载对应的内核参数并在系统配置中持久化)
sysctl -w net.netfilter.nf_conntrack_max=1048576

应用层防护与日志监控协调实战

日志分析与告警

DoS防御不仅在网络与系统参数上,还需要对日志进行持续分析。通过聚合防火墙日志、系统日志、应用日志,能够识别异常模式并触发告警。核心做法是设定规则阈值、监控时间窗以及快速可操作的处置流程。

# 使用journalctl查看防火墙相关日志(示例)
journalctl -u netfilter-persistent -f
# 或者读取iptables日志(若已开启LOG前缀)
journalctl -t IPTABLES -f

日志的结构化与聚合对于快速告警至关重要。ELK/OpenSearch等日志平台可以将不同来源的日志统一索引,结合阈值告警实现快速响应。

Fail2ban与守护进程的协同

Fail2ban等守护进程可以对异常来源进行持续阻断,减少重复攻击的影响。合理配置监控模式、时间窗和解除规则,可以在不干扰正常用户的前提下,持续提升鲁棒性。

# Fail2ban的简单配置片段(示例,需放入 jail.local)
[sshd]
enabled = true
port    = ssh
filter  = sshd
logpath = /var/log/auth.log
maxretry = 3
findtime = 600
bantime = 3600

广告

操作系统标签