限制文件句柄使用是防范连接耗尽型dos攻击的基础手段,需分层设限:查清用户软/硬限、进程实际用量及系统全局上限;systemd服务须在单元文件中配置limitnofile;按角色在limits.conf分级设限;协同调整fs.file-max等内核参数实现纵深防御。

限制文件句柄使用是防范连接耗尽型拒绝服务(DoS)的基础手段。Linux中每个网络连接、打开的文件、管道都占用一个文件描述符(fd),当进程或系统级句柄被恶意或异常耗尽,新连接就无法建立,服务即陷入“Too Many Open Files”状态——这正是常见DoS攻击的落地路径。关键不是堵死所有可能,而是通过分层设限,让攻击者无法轻易拖垮整个系统。
看清当前限制与真实占用
不查清现状就调参,容易误伤服务。先确认三类数值:
-
用户级软/硬限制:运行
ulimit -n(软限)和ulimit -Hn(硬限),普通用户只能调低或等同于硬限; -
进程实际使用量:用
lsof -p $PID | wc -l或直接读/proc/$PID/fd/目录项数,比单纯看限制更有意义; -
系统全局上限:执行
cat /proc/sys/fs/file-max,它决定整个内核能分配多少句柄,过高易被滥用,过低会卡住正常并发。
对单个服务做精准句柄封顶
systemd服务不能靠登录用户的limits.conf生效,必须在服务单元中显式约束:
- 编辑服务配置:
sudo systemctl edit nginx.service; - 加入段落:
[Service]<br>LimitNOFILE=2048
(该值同时设软硬限); - 重载并重启:
sudo systemctl daemon-reload && sudo systemctl restart nginx; - 验证是否写入:
systemctl show nginx.service | grep NOFILE,或检查进程 limits:cat /proc/$(pidof nginx)/limits | grep "Max open files"。
按角色分级设置用户级句柄上限
避免某个运维账号启动一堆高连接进程拖垮全局资源:
- 编辑
/etc/security/limits.conf,为不同角色设不同策略; - 例如限制应用用户:
www-data soft nofile 4096<br>www-data hard nofile 8192
; - 限制交互式管理员账号(防误操作):
admin soft nofile 2048<br>admin hard nofile 4096
; - 确保 PAM 模块已启用:
pam_limits.so应出现在/etc/pam.d/common-session中。
协同调整系统级参数形成纵深防御
只限单个进程不够,攻击者可起多个进程协同打满全局句柄:
- 降低内核全局上限(防滥用):
写入fs.file-max = 131072到/etc/sysctl.conf,再运行sysctl -p; - 加速句柄回收:缩短 TCP 连接释放时间,如设
net.ipv4.tcp_fin_timeout = 30; - 配合其他 Limit 指令:在 systemd service 中同时加
TasksMax=128和MemoryMax=512M,防止 fork 炸弹或内存耗尽连带拖垮句柄池。











