最直接有效的防fork炸弹手段是用ulimit -u限制单个用户最大进程数,需软硬限制配齐、PAM模块pam_limits.so加载到位、配置写入/etc/security/limits.conf且重新登录生效。

最直接有效的办法是用 ulimit -u 限制单个用户最大进程数,核心在于软硬限制配齐、PAM 模块加载到位、配置位置正确——三者缺一不可。
临时限制:快速验证是否生效
在终端中运行:
-
ulimit -u 100—— 立即把当前会话的用户进程上限设为 100 - 再执行
seq 1 120 | xargs -P 120 sleep 0.1 &或简单测试:(){ :|:& };: - 一旦超限,会报
bash: fork: Resource temporarily unavailable
注意:该设置只对当前 shell 生效,登出或新开 SSH 就失效;root 用户默认不受影响,需用 sudo -u username ulimit -u 50 模拟目标用户环境。
永久限制:写入 limits.conf 并确保 soft + hard 都设
编辑 /etc/security/limits.conf,添加两行(不能只写一行):
alice soft nproc 200alice hard nproc 200
若要对组生效,可用 @developers soft nproc 300;慎用通配符 *,否则可能误限系统服务账户(如 syslog、dbus),导致 cron 或 systemd-user 异常。改完必须重新登录才生效,可用 su - alice 切换后执行 ulimit -u 确认数值。
PAM 是前提:没有它 limits.conf 形同虚设
检查是否已启用 pam_limits.so:
grep pam_limits.so /etc/pam.d/{sshd,login,su,system-auth}- 若缺失,在
/etc/pam.d/sshd(SSH 登录)或/etc/pam.d/system-auth(通用)末尾添加:session required pam_limits.so - 路径注意区分:CentOS/RHEL 用
/lib64/security/pam_limits.so,Debian/Ubuntu 用/lib/x86_64-linux-gnu/security/pam_limits.so
修改后无需重启 sshd,新连接即按新规则加载;旧连接仍沿用原限制。
容器环境不适用 ulimit,改用 cgroup 机制
Docker 或 Podman 容器中,ulimit 设置会被 cgroup 覆盖,不起作用。应使用:
- Docker:
--pids-limit 100 - Podman:
--pids-limit=100
容器内即使 root 用户,也无法突破宿主机设定的 pids cgroup 限额。











