在配置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存取得到適當限制。