在配置Nginx与Cloudflare代理服务时,实施适当的访问控制需要解决两个关键方面:管理主机头验证和限制对Cloudflare边缘服务器的访问。本指南为这两个挑战提供全面的解决方案,同时为您的服务器租用基础设施维持最佳安全性。

理解双重安全挑战

在Cloudflare后端的Nginx安全实施涉及两个不同的组件:过滤没有正确主机头的请求(通常来自机器人和扫描器),以及确保只有Cloudflare边缘服务器可以访问您的源服务器。这两个元素对于维护强大的安全性都至关重要。

主机头验证配置

实施通配符服务器块有助于防止通过不正确的主机头进行未经授权的访问尝试:


# Default server block to catch invalid hosts
server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name _;
    return 444;
}

server {
    listen 443 ssl default_server;
    listen [::]:443 ssl default_server;
    server_name _;
    ssl_reject_handshake on;
    return 444;
}

Cloudflare IP自动化管理

使用shell脚本创建自动化系统来维护最新的Cloudflare IP范围:


#!/bin/bash
# File: update_cloudflare_ips.sh

echo "# Cloudflare IP ranges - generated on $(date)" | tee /etc/nginx/cloudflare.inc > /etc/nginx/real_ip.inc

# Fetch and format IPv4 ranges
curl -s https://www.cloudflare.com/ips-v4/ | \
    tee >(sed 's/$/ 0;/' >> /etc/nginx/cloudflare.inc) | \
    sed 's/^/set_real_ip_from /; s/$/;/' >> /etc/nginx/real_ip.inc

# Add spacing
echo >> /etc/nginx/cloudflare.inc
echo >> /etc/nginx/real_ip.inc

# Fetch and format IPv6 ranges
curl -s https://www.cloudflare.com/ips-v6/ | \
    tee >(sed 's/$/ 0;/' >> /etc/nginx/cloudflare.inc) | \
    sed 's/^/set_real_ip_from /; s/$/;/' >> /etc/nginx/real_ip.inc

实施IP限制

配置Nginx仅允许来自Cloudflare边缘服务器的访问,使用geo模块:


# Define allowed IPs using geo module
geo $denied {
    default 1;
    include /etc/nginx/cloudflare.inc;
}

server {
    server_name example.com;
    listen 443 ssl http2;
    
    # Deny non-Cloudflare access
    if ($denied) {
        return 444;
    }
    
    # SSL configuration
    ssl_certificate /etc/ssl/certs/example.com.crt;
    ssl_certificate_key /etc/ssl/private/example.com.key;
}

真实IP配置

正确处理访问者IP地址:


server {
    server_name example.com;
    listen 443 ssl http2;
    
    # Include real IP configuration
    include /etc/nginx/real_ip.inc;
    real_ip_header CF-Connecting-IP;
    
    # Use realip_remote_addr for geo matching
    geo $realip_remote_addr $denied {
        default 1;
        include /etc/nginx/cloudflare.inc;
    }
}

高级安全头部配置

通过适当的HTTP头部增强安全性:


server {
    # Security headers
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-XSS-Protection "1; mode=block" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header Referrer-Policy "no-referrer-when-downgrade" always;
    add_header Content-Security-Policy "default-src 'self' http: https: data: blob: 'unsafe-inline'" always;
}

维护和监控

实施定期维护程序以保持配置安全:

  • 每日安排自动IP范围更新
  • 监控访问日志以防未经授权的尝试
  • 定期验证SSL证书有效性
  • 检查和更新安全头部

日志配置

设置全面的日志记录以跟踪访问尝试和安全事件:


server {
    # Access and error logs
    access_log /var/log/nginx/example.com.access.log combined buffer=512k flush=1m;
    error_log /var/log/nginx/example.com.error.log warn;
    
    # Custom logging format for security monitoring
    log_format security '$remote_addr - $remote_user [$time_local] "$request" '
                       '$status $body_bytes_sent "$http_referer" '
                       '"$http_user_agent" "$http_x_forwarded_for"';
}

常见问题故障排除

解决常见配置挑战:

  • 验证Cloudflare IP范围是否最新
  • 检查SSL证书链完整性
  • 确认正确的真实IP头部处理
  • 验证主机头配置

性能优化


server {
    # Buffer size optimizations
    client_body_buffer_size 10K;
    client_header_buffer_size 1k;
    client_max_body_size 8m;
    large_client_header_buffers 4 4k;
    
    # Connection timeouts
    client_body_timeout 12;
    client_header_timeout 12;
    keepalive_timeout 15;
    send_timeout 10;
}

结论

使用Nginx和Cloudflare实施适当的访问控制需要仔细关注主机验证和IP限制机制。通过遵循这些配置指南并维护自动更新,您可以建立一个强大的安全框架,既利用Cloudflare的代理保护,又确保直接IP访问得到适当限制。