OffshoreVps
安全2026年9月27日阅读约 6 分钟作者:OffshoreVps 团队

加固 Web 服务器:UFW、fail2ban 与 Nginx 设置

为运行网站的 VPS 配置默认拒绝的防火墙、fail2ban jail、更安全的 Nginx 标头、速率限制和自动更新。

全新的 Web 服务器上线几分钟内就会被扫描。如果你做好了基础工作,其中大部分流量都是自动化且无害的。本指南在 15 分钟加固的基础上更进一步,涵盖防火墙、用 fail2ban 防暴力破解,以及更安全的 Nginx 设置。

VPS 上的终端窗口,显示用 UFW、fail2ban 和 Nginx 加固 Web 服务器所用的命令,以“sudo ufw default deny incoming”开头
本指南中你将在服务器上运行的那类命令。

步骤 1:用 UFW 配置默认拒绝的防火墙

只允许你需要的,阻止其余的。先添加 SSH,以免把自己锁在外面。

sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status verbose

如果你使用非标准的 SSH 端口,请允许该端口,而不是 OpenSSH。

步骤 2:用 fail2ban 应对反复失败

fail2ban 监视日志,并封禁不断登录失败的 IP 地址。

sudo apt install -y fail2ban
sudo tee /etc/fail2ban/jail.local > /dev/null <<'CONF'
[DEFAULT]
bantime  = 1h
findtime = 10m
maxretry = 5

[sshd]
enabled = true

[nginx-http-auth]
enabled = true

[nginx-botsearch]
enabled = true
CONF
sudo systemctl enable --now fail2ban
sudo fail2ban-client status sshd

同时使用 SSH 密钥并关闭密码登录。请参阅 SSH 密钥详解。

步骤 3:隐藏 Nginx 版本并添加安全标头

在 /etc/nginx/nginx.conf 中,位于 http 块内:

server_tokens off;

在你网站的 server 块中:

add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

只有当 HTTPS 对你的域名及你使用的所有子域名都正常工作时,才添加 HSTS 标头。

本指南的步骤依次为:1. 用 UFW 配置默认拒绝的防火墙;2. 用 fail2ban 应对反复失败;3. 隐藏 Nginx 版本并添加安全标头;4. 限制滥用请求;5. 保持更新;6. 需要关注什么
本指南的步骤,按顺序排列。

步骤 4:限制滥用请求

速率限制可减缓对登录页面的暴力破解尝试:

# in the http block
limit_req_zone $binary_remote_addr zone=login:10m rate=5r/m;

# in your server block
location = /wp-login.php {
    limit_req zone=login burst=5 nodelay;
    # ...your usual PHP handling
}

使用 sudo nginx -t && sudo systemctl reload nginx 测试并应用。

步骤 5:保持更新

sudo apt install -y unattended-upgrades
sudo dpkg-reconfigure --priority=low unattended-upgrades

自动安全更新无需你操作即可修补已知漏洞。

需要关注什么

  • 用 sudo fail2ban-client status sshd 检查封禁情况。
  • 偶尔查看 /var/log/nginx/error.log。
  • 如果你位于代理或 CDN 之后,请确保 fail2ban 读取的是真实的客户端 IP,否则你可能会封禁自己的代理。