在 Ubuntu 的 LNMP 环境中,建议采用分层防御:边界防火墙、Nginx 限流限速、Fail2Ban 自动封禁、数据库与 PHP 资源限制、CDN/WAF 卸载与监控告警。以下给出可直接落地的配置与命令。
UFW 防火墙最小化放行
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
如需更细粒度,可改用 iptables/nftables 或云厂商安全组。
Nginx 限流限速与连接控制
http {
# 共享内存区:按IP记录请求速率与并发连接
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=5r/s;
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
server {
listen 80;
server_name _;
return 301 https://$host$request_uri; # 全站 HTTPS
}
server {
listen 443 ssl http2;
server_name _;
# 安全与合规
server_tokens off;
client_max_body_size 2M;
client_body_timeout 10s;
keepalive_timeout 15;
# 限流:每秒 5 个请求,突发 5 个且不延迟处理
limit_req zone=req_limit burst=5 nodelay;
# 并发连接:每个 IP 最多 10 个连接
limit_conn conn_limit 10;
# 可选:对管理路径加 IP 白名单
location /admin/ {
allow 203.0.113.0/24;
deny all;
}
# 静态资源缓存(减轻后端压力)
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
# 反向代理到 PHP-FPM(示例)
location ~ \.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/run/php/php8.1-fpm.sock; # 版本按实际调整
}
}
}
# 重载 Nginx
sudo nginx -t && sudo systemctl reload nginx
说明:rate 与 burst 需结合业务压测微调,避免误伤正常用户。
Fail2Ban 自动封禁恶意来源
sudo apt-get update
sudo apt-get install -y fail2ban
sudo systemctl enable --now fail2ban
# 创建本地配置
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo tee /etc/fail2ban/jail.local <<'EOF'
[DEFAULT]
ignoreip = 127.0.0.1/8 ::1
bantime = 600
findtime = 600
maxretry = 3
backend = systemd
[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s
[nginx-http-auth]
enabled = true
port = http,https
logpath = /var/log/nginx/error.log
[nginx-limit-req]
enabled = true
port = http,https
logpath = /var/log/nginx/error.log
maxretry = 5
EOF
sudo systemctl restart fail2ban
可按需增加 [nginx-badbots] 等过滤器或自定义规则。
MySQL 与 PHP 资源限制
sudo mysql -e "SET GLOBAL max_connections = 100;"
# 编辑 /etc/mysql/mysql.conf.d/mysqld.cnf
# bind-address = 127.0.0.1
# skip-name-resolve
# sudo systemctl restart mysql
; /etc/php/8.1/fpm/php.ini
expose_php = Off
memory_limit = 128M
max_execution_time = 30
max_input_time = 60
post_max_size = 8M
upload_max_filesize = 2M
display_errors = Off
log_errors = On
error_log = /var/log/php_errors.log
session.cookie_httponly = 1
session.cookie_secure = 1
session.use_strict_mode = 1
disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source
目录权限建议:/var/www/html 设为 755,www-data:www-data 属主。CDN 与 WAF 卸载
日志与告警
应急处置清单
deny <IP>; 并 reload,或在 UFW 中 ufw deny from <IP>;必要时在 Fail2Ban 中 fail2ban-client set nginx-limit-req banip <IP>。nginx -t 校验并平滑重载。