Nginx 加固实战:我的博客被扫了之后,我补上的 6 道防线

Nginx 加固实战:我的博客被扫了之后,我补上的 6 道防线

博客上线没几天,我去看了一眼访问日志,整个人都不好了:每天都有几百次请求在扫根本不存在的路径,/wp-login.php、/admin、/phpmyadmin,轮着来。我的站是 Hugo 生成的静态站,压根没有这些后台,但扫描器不管,它就是挨家挨户敲门,看看哪家没锁。 那之后我把 Nginx 加固认真做了一遍。先说结论:静态站本身就很难被攻破——没有数据库、没有登录入口,攻击面天生就小。加固的目标不是把服务器做成堡垒,而是让扫描器觉得“这家不好惹”,去敲别人家的门。六道防线,花一下午,够用了。 第一道:别把底牌亮出来 Nginx 默认会在出错页面和响应头里报自己的版本号,比如 Server: nginx/1.24.0。这等于告诉扫描器:“我用的就是这个版本,去查它的已知漏洞吧。”关掉它,一行配置: server_tokens off; 放在 http 块里全局生效。改完重启,用 curl -I 看一眼响应头,版本号没了,心里就踏实了一半。顺带把不必要的错误页面也收一收,别让 404 页面泄露目录结构。 第二道:限流,让暴力请求先累趴下 扫描器最爱干的事就是短时间内发几千个请求。Nginx 的 limit_req 就是给这种行为设个红绿灯: limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s; server { location / { limit_req zone=one burst=20 nodelay; # …… } } 意思是同一个 IP 每秒最多 10 个请求,突发允许 20 个。正常读者根本碰不到这个上限——人一秒点不了一次以上的链接;扫描器一撞上限就收到 503,爱扫就慢慢扫去。登录、管理后台这类敏感路径,可以再单独设一个更严的 zone,比如每分钟 5 次。 第三道:安全头,花五分钟加上 安全头是浏览器帮你挡子弹的配置,几行就能加上: add_header X-Frame-Options "SAMEORIGIN" always; add_header X-Content-Type-Options "nosniff" always; add_header Referrer-Policy "strict-origin-when-cross-origin" always; add_header Content-Security-Policy "default-src 'self'; img-src 'self' data: https:; style-src 'self' 'unsafe-inline';" always; X-Frame-Options 防别人把你的站嵌进 iframe 里钓鱼;nosniff 防浏览器猜错文件类型;CSP 是大头,管的是“你的页面只许加载哪些来源的资源”。静态站的 CSP 很好写——资源基本都在自己域名上。加完用浏览器的开发者工具看一眼,没报错就说明没配错。别照抄别人的长 CSP 再回来修半天,静态站从宽松的开始,够用就行。 第四道:fail2ban,自动拉黑屡教不改的 Nginx 限流是“慢下来”,fail2ban 是“直接关门”。它读 Nginx 的错误日志,发现同一个 IP 短时间内大量 404、403 或者反复撞同一个不存在的路径,就用防火墙封它一段时间。配法是现成的: ...

November 6, 2026 · 2 min · 245 words