最直接有效的方式是通过 ulimit -u 设置用户最大进程数并配合 /etc/security/limits.conf 持久化限制;root 默认不受限,普通用户超限后 fork() 报错“resource temporarily unavailable”,从而阻断 fork 炸弹。

最直接有效的方式是通过 ulimit -u 设置用户最大进程数,并配合 /etc/security/limits.conf 实现持久化限制。root 用户默认不受此限,普通用户一旦超出设定值,执行 fork() 就会报错 bash: fork: Resource temporarily unavailable,从而阻断 fork 炸弹扩散。
临时限制:用 ulimit -u 快速验证
适用于测试或紧急干预,仅对当前 shell 会话生效:
- 运行
ulimit -u 200,即限制当前用户最多运行 200 个进程(含子进程) - 再执行 fork 炸弹
:(){ :|:& };:,几秒内就会因无法 fork 新进程而自动停止 - 注意:该设置不继承到新登录会话,重启终端即失效
永久限制:配置 /etc/security/limits.conf
这是生产环境必须做的加固步骤,需确保 PAM 模块已启用:
- 先确认
/etc/pam.d/login或/etc/pam.d/sshd中存在这行:session required pam_limits.so - 编辑
/etc/security/limits.conf,添加类似以下规则:alice hard nproc 300@developers hard nproc 500* hard nproc 200(对所有普通用户设兜底限制) -
hard表示硬限制,用户无法自行提升;nproc是关键字段,专控进程总数
区分 soft 和 hard 限制的实用逻辑
soft 限制可由用户临时调高(但不能超过 hard 值),适合开发调试;hard 限制由管理员设定,不可绕过:
- 例如写入:
bob soft nproc 100和bob hard nproc 300 - bob 登录后可运行
ulimit -u 250,但无法设成 350 - fork 炸弹触发时,系统以 hard 为准强制拦截,与 soft 无关
验证是否生效及常见误区
限制不是设完就自动覆盖所有场景,需主动检查:
- 新用户登录后运行
ulimit -u查看实际值,非 root 用户应显示你设定的数字 - root 不受
limits.conf中*或组规则影响,如需限制 root,必须显式写root hard nproc 1000 - systemd 服务可能绕过 limits.conf,若运行在用户 session 外(如 system slice),需额外配置
DefaultLimitNPROC在/etc/systemd/system.conf中











