cgroups是docker用于防止ddos攻击耗尽资源的安全机制,通过限制cpu、内存、磁盘io和进程数等资源配额,确保单个容器无法挤占宿主机及其他容器资源。
在docker中配置容器资源限制,是应对ddos攻击时保障系统稳定性的关键防线。ddos攻击常表现为突发大量请求,导致cpu、内存或磁盘io被单个容器耗尽,进而拖垮宿主机或其他容器。docker本身不提供网络层的抗ddos能力,但通过cgroups(control groups)对容器施加硬性资源配额,能有效遏制“资源挤兑”,防止雪崩。
CPU使用率限制:防止单容器吃满CPU
DDoS下高频请求可能触发应用线程激增,持续抢占CPU。需设置明确的CPU上限,避免影响系统调度和关键进程。
- 用 --cpus=0.5 限制最多使用半个逻辑CPU核心(等价于
--cpu-quota=50000 --cpu-period=100000) - 对高优先级服务(如API网关),可配合 --cpu-shares=512(默认1024)降低其在资源争抢中的权重,让基础服务更易获得调度机会
- 避免仅用
--cpu-period单独设置,必须与--cpu-quota配合生效
内存限额与OOM保护:阻止内存耗尽崩溃
内存无限制是DDoS中最危险的情况——容器可能不断申请内存直至触发Linux OOM Killer,误杀宿主机关键进程(如sshd、dockerd)。
- 强制指定 --memory=512m --memory-swap=512m(禁用swap可避免IO恶化)
- 添加 --oom-kill-disable=false(默认开启),确保容器超限时被精准终止,而非让整个系统卡死
- 搭配 --memory-reservation=256m 设置软限制,让内核在内存紧张时优先回收该容器的缓存,提升响应弹性
磁盘IO与进程数限制:抑制反射型/连接耗尽类攻击
部分DDoS变种(如慢速HTTP POST、大量小文件写入)会打满磁盘带宽或创建海量进程,需针对性设防。
- 用 --device-read-bps /dev/sda:10mb --device-write-bps /dev/sda:5mb 限速块设备IO
- 通过 --pids-limit=100 严格控制容器内最大进程/线程数,防止fork炸弹类攻击
- 对Web服务容器,建议额外挂载 tmpfs 临时目录(
--tmpfs /tmp:rw,size=10m,mode=1777),避免/tmp被写满影响全局
运行时加固配合资源限制
光靠资源配额不够,需结合权限与隔离增强实效:
- 启动时加 --read-only 挂载根文件系统,阻断攻击者写入恶意脚本
- 用 --cap-drop=ALL --cap-add=NET_BIND_SERVICE 最小化能力集,禁止容器执行mount、raw socket等高危操作
- 启用 --security-opt no-new-privileges:true 防止进程提权后突破限制
- 若部署在Kubernetes中,应将上述参数转为
resources.limits和securityContext,并配合PodSecurityPolicy或PodSecurity Admission管控











