系统服务自动重启策略不能防范DoS攻击,仅作为故障恢复兜底措施;应配置Restart=on-abnormal、RestartPreventExitStatus排除128/137/143等DoS相关退出码,配合StartLimitIntervalSec=120、StartLimitBurst=2、RestartSec=30防止重启风暴,并结合MemoryLimit、LimitNOFILE、Type=notify等资源隔离与存活检测机制。

系统服务自动重启策略本身不能防范拒绝服务攻击(DoS),但它可作为**故障恢复机制**,缓解 DoS 导致的服务僵死、进程崩溃或资源耗尽后的不可用状态。关键在于:重启不是防御手段,而是保障可用性的兜底措施;真正的防护需前置——如限流、连接限制、资源隔离和入侵检测。配置重启策略时,必须避免因 DoS 触发高频崩溃-重启循环,否则反而加剧系统负载甚至引发雪崩。
针对 DoS 场景优化 Restart 行为
默认的 Restart=always 在遭受 DoS 时极易导致每秒多次重启,迅速耗尽 CPU、内存与日志空间。应改用更精准的触发条件:
- Restart=on-abnormal:仅在被信号终止(如 SIGKILL、SIGSEGV)或超时时重启,排除正常退出(如主动 graceful shutdown),避免把 DoS 引发的 OOM kill 误当作可重试故障
- 搭配 RestartPreventExitStatus=128 137 143:显式排除常见 DoS 相关退出码(128+9=SIGKILL,137=OOM killer,143=SIGTERM)——这些是系统强制干预结果,重启无意义,应人工介入排查
- 禁用 Restart=on-failure:因其包含非零退出码,而 DoS 下服务可能返回 1(配置加载失败)、111(连接被拒)等,易误触发
设置启动频率熔断,防止重启风暴
DoS 可能导致服务反复崩溃,若不限制重启节奏,systemd 会在 10 秒内尝试 5 次(默认限频),造成系统卡顿。需主动收紧窗口:
- StartLimitIntervalSec=120:延长统计周期至 2 分钟,给运维留出响应时间
-
StartLimitBurst=2:2 分钟内最多重启 2 次,超限即标记为
failed并停止尝试,避免恶性循环 - RestartSec=30:每次重启前强制等待 30 秒,让系统冷却、日志落盘、监控告警生效
强化资源隔离与进程存活判断
DoS 常表现为内存暴涨、CPU 占满或文件描述符耗尽。单纯重启不解决根源,需结合 systemd 的资源控制能力:
-
MemoryLimit=256M + MemoryMax=256M:硬限制内存使用,OOM 时由内核直接 kill 进程,配合
RestartPreventExitStatus=137阻止重启 - LimitNOFILE=1024:限制打开文件数,防连接洪泛耗尽句柄
-
Type=notify + WatchdogSec=60:要求服务定期调用
sd_notify("WATCHDOG=1"),超时未上报即视为僵死并重启——这对抵御慢速 DoS(如 Slowloris)更有效
添加启动后健康校验,避免无效重启
重启后若服务仍处于异常状态(如端口未监听、依赖数据库连不上),立即重启只会重复失败。应在启动完成后做轻量探测:
- ExecStartPost=/bin/sh -c 'for i in $(seq 1 10); do nc -z localhost 80 && exit 0; sleep 1; done; exit 1':循环检查端口连通性,10 秒内失败则标记启动失败,触发限频逻辑
- 配合 Restart=on-abnormal 和 StartLimitBurst=2,确保两次探测失败后就停服,不盲目重试











