温馨提示×

LNMP在Ubuntu上如何防止DDoS攻击

小樊
36
2026-01-04 20:15:52
栏目: 云计算

在 Ubuntu 的 LNMP 环境中,建议采用分层防御:边界防火墙、Nginx 限流限速、Fail2Ban 自动封禁、数据库与 PHP 资源限制、CDN/WAF 卸载与监控告警。以下给出可直接落地的配置与命令。

分层防护与优先级

  • 边界与访问控制:仅开放必要端口(如 22/80/443),使用 UFW 或云安全组做白名单与速率限制;对外服务尽量前置 CDN/WAF 吸收与清洗流量。
  • 应用层限流限速:在 Nginx 层对单 IP/单会话的请求速率、并发连接、请求体大小、超时进行控制,抑制 HTTP Flood/CC
  • 自动化封禁:用 Fail2Ban 监控 Nginx/SSH 日志,触发阈值自动封禁。
  • 数据与后端保护:限制 MySQL 最大连接与来源;PHP 限制内存、执行时间、上传与危险函数,减少被滥用风险。
  • 持续监控与响应:集中日志、设置告警阈值、定期更新补丁与证书。

快速落地步骤

  • 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 资源限制

    • MySQL(示例:仅本地监听、最大连接 100)
      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
      
    • PHP(示例:关闭暴露、限制资源、禁用危险函数)
      ; /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 设为 755www-data:www-data 属主。
  • CDN 与 WAF 卸载

    • 使用 Cloudflare/AkamaiCDN:开启 Under Attack ModeRate LimitingBot Fight Mode,并缓存静态资源,显著降低源站压力。
    • 启用 WAF(如 ModSecurity 或云 WAF):过滤 SQLi/XSS/Scanner 等常见攻击向量。

监控与应急响应

  • 日志与告警

    • 持续观察 /var/log/nginx/access.log、error.logfail2ban 日志,设置阈值告警(如 5xx 比例、单 IP 异常连接数)。
    • 使用 Prometheus + Grafana 监控 Nginx 请求速率、响应时延、连接数、PHP-FPM 队列等指标,配合 Alertmanager 触发告警。
  • 应急处置清单

    • 临时拉黑攻击源:在 Nginx 配置 deny <IP>;reload,或在 UFWufw deny from <IP>;必要时在 Fail2Banfail2ban-client set nginx-limit-req banip <IP>
    • 快速降级:临时关闭非核心功能、静态资源走 CDN、缩短 rate/burst 阈值,保障核心业务可用。
    • 取证与复盘:保存 Nginx/系统日志抓包,分析攻击特征并更新规则。

注意事项

  • 所有阈值(如 rate、burst、maxretry、bantime、max_connections)需结合真实业务压测与监控数据逐步调优,避免影响正常用户。
  • 修改 Nginx/SSH 配置前先备份并在维护窗口操作,变更后使用 nginx -t 校验并平滑重载。
  • 对外服务优先接入 CDN/WAF,源站只暴露必要端口与路径,减少攻击面。

0