服务器运维小白必学:Linux下Nginx+Fail2Ban配置实战,让新手站长的博客网站防暴力破解并实现一键HTTPS证书续期
在服务器运维领域,新手站长最怕两件事:SSH被暴力破解导致服务器沦陷,以及HTTPS证书到期后手动续期折腾半天。本文针对这些痛点,带来一套实用方案:在Linux系统下通过Nginx+Fail2Ban组合配置,既能实时监控日志并自动封禁攻击IP,又能轻松实现HTTPS证书一键自动续期。整个流程基于Ubuntu/Debian系统,适合博客、个人网站等场景,跟着操作即可让网站安全升级。
一、准备工作(5分钟搞定)
确保以下条件已满足,否则后续步骤会卡住:
- 一台干净的Linux服务器(推荐Ubuntu 20.04或22.04 LTS,root权限)。
- Nginx已安装并正常运行(若未安装,执行:sudo apt update && sudo apt install nginx -y)。
- 域名已通过DNS解析到服务器公网IP(A记录指向正确)。
- 防火墙已开放80、443端口(ufw allow 80 && ufw allow 443)。
- 备份现有配置:cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak(养成好习惯,避免改错后无法恢复)。
这些准备工作完成后,就可以进入核心配置了。二、安装并配置Fail2Ban,彻底防住暴力破解
Fail2Ban通过扫描日志文件,自动检测多次失败登录尝试(如SSH爆破),并将恶意IP加入防火墙黑名单。新手最常用的就是保护SSH服务。
步骤1:安装Fail2Ban
在终端执行以下命令:
sudo apt update sudo apt install fail2ban -y安装完成后,检查状态:
sudo systemctl status fail2ban看到active (running)就成功了。
步骤2:创建本地配置文件(避免升级覆盖)
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local用nano编辑(或vim):
sudo nano /etc/fail2ban/jail.local找到[sshd]段落,修改为:
[sshd] enabled = true port = ssh filter = sshd logpath = /var/log/auth.log maxretry = 5 bantime = 1d findtime = 10m- maxretry=5:失败5次就封禁。
- bantime=1d:封禁1天(可改成7d更严格)。
- findtime=10m:在10分钟内统计失败次数。
保存退出(Ctrl+O → Enter → Ctrl+X)。步骤3:重启并启用Fail2Ban
sudo systemctl restart fail2ban sudo systemctl enable fail2ban查看防护状态:
sudo fail2ban-client status sshd如果有IP被ban,可手动解封:
sudo fail2ban-client set sshd unbanip 恶意IP这样,99%的SSH暴力破解攻击就被挡住了。Fail2Ban还能监控Nginx日志,后续结合Nginx限流更强。
三、Nginx安全加固 + 一键HTTPS证书续期(核心实战)
单纯的HTTP网站容易被抓包,HTTPS是必须的。我们用acme.sh(轻量级、无依赖)实现Let’s Encrypt免费证书申请,并设置自动续期,完全一键。
步骤1:安装acme.sh
执行一键安装脚本(替换成你的邮箱):
curl https://get.acme.sh | sh -s email=你的邮箱@example.com安装后,source环境变量:
source ~/.bashrc步骤2:用Nginx模式申请证书(最简单)
确保Nginx正在监听80端口(HTTP),然后运行:
acme.sh --issue --nginx -d 你的域名.com -d www.你的域名.com - --nginx:自动使用Nginx临时配置申请,无需手动改80端口。
- 支持多域名(-d重复添加)。
过程会自动验证DNS或HTTP,成功后证书存放在~/.acme.sh/你的域名.com/目录。步骤3:自动安装证书到Nginx并设置reload
执行:
acme.sh --install-cert -d 你的域名.com \ --key-file /etc/nginx/ssl/你的域名.com.key \ --fullchain-file /etc/nginx/ssl/你的域名.com.fullchain.pem \ --reloadcmd "systemctl reload nginx"(先创建目录:mkdir -p /etc/nginx/ssl)
步骤4:修改Nginx配置文件启用HTTPS
编辑站点配置文件(通常是/etc/nginx/sites-available/default):
sudo nano /etc/nginx/sites-available/default替换为以下完整配置(已包含HTTP强制跳转HTTPS + 基础安全):
server { listen 80; server_name 你的域名.com www.你的域名.com; return 301 https://$server_name$request_uri; # 自动跳转HTTPS } server { listen 443 ssl http2; server_name 你的域名.com www.你的域名.com; ssl_certificate /etc/nginx/ssl/你的域名.com.fullchain.pem; ssl_certificate_key /etc/nginx/ssl/你的域名.com.key; # 基础安全设置 ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; # 结合Fail2Ban的限流(防爬虫/爆破) limit_req_zone $binary_remote_addr zone=login:10m rate=1r/s; location / { limit_req zone=login burst=5 nodelay; root /var/www/html; # 你的博客目录 index index.html; } location ~ /\.ht { deny all; } }测试配置是否正确:
sudo nginx -t重载Nginx:
sudo systemctl reload nginx访问https://你的域名.com,看到绿色小锁即成功。
步骤5:实现真正的一键自动续期
acme.sh安装时已自动添加crontab,每天检查证书(到期前30天自动续期),无需手动干预。验证命令:
acme.sh --renew -d 你的域名.com --force以后每次续期只需这一条命令测试即可,真正解放双手。
四、测试验证 + 常见避坑指南
- Fail2Ban测试:故意用错误密码SSH登录几次,执行sudo fail2ban-client status sshd,看IP是否被ban。
- HTTPS测试:用浏览器或curl -I https://你的域名.com,确认200 OK且证书有效。
- 常见问题解决:
- 证书申请失败:检查80端口是否被占用,或域名解析延迟。
- Fail2Ban不生效:确认日志路径正确(auth.log),重启服务。
- Nginx 502错误:权限问题,执行chown -R www-data:www-data /var/www/html。
- 服务器重启后失效:确保两个服务都设为开机自启(systemctl enable)。
- 进阶建议:定期更新系统(apt upgrade),开启UFW防火墙,只允许必要端口;若博客用WordPress,可再加Fail2Ban的wordpress-filter进一步防护登录接口。
通过这套Nginx+Fail2Ban+acme.sh组合,新手站长就能把服务器安全提升一个档次。暴力破解基本绝迹,HTTPS证书续期再也不用操心。建议先在测试服务器练手,再上线生产环境。实际操作中遇到问题,欢迎在评论区留言讨论,一起让博客运维更轻松。
