2026年5月19日

2026年5月19日

WordPressにCloudflareを設定する完全ガイド【WAF・DDoS対策・SSL】

はじめに

CloudflareはWordPressサイトに最も手軽に導入できるCDN・セキュリティサービスです。無料プランだけでもDDoS対策・WAF・SSL・CDNがすべて利用でき、多くのWordPressサイトで採用されています。

症状・原因

  • DDoS攻撃やBot攻撃でサーバーが過負荷になる
  • HTTPSに移行したいがSSL証明書の取得・更新が面倒
  • 海外からのアクセスが遅い
  • スパムBot・ハッカーによる管理画面へのブルートフォース攻撃

解決手順

ステップ1:Cloudflareの基本設定

# 1. cloudflare.comでアカウント作成
# 2. 「サイトを追加」でドメインを入力
# 3. DNSレコードを確認(Cloudflareが自動取得)
# 4. ネームサーバーをCloudflareに変更(ドメインレジストラで設定)
# ns1.cloudflare.com
# ns2.cloudflare.com

# 変更反映確認(最大48時間)
dig NS example.com
whois example.com | grep "Name Server"

# CloudflareのIPからのアクセスを確認
curl -I https://example.com | grep cf-ray

ステップ2:WordPressとの互換性設定

// functions.php: Cloudflare環境でのIPアドレス取得
add_action('init', function(): void {
    // Cloudflareからの実IPアドレスを復元
    $cloudflare_ips = [
        '103.21.244.0/22', '103.22.200.0/22', '103.31.4.0/22',
        '104.16.0.0/13',   '104.24.0.0/14',   '108.162.192.0/18',
        '131.0.72.0/22',   '141.101.64.0/18',  '162.158.0.0/15',
        '172.64.0.0/13',   '173.245.48.0/20',  '188.114.96.0/20',
        '190.93.240.0/20', '197.234.240.0/22', '198.41.128.0/17',
    ];

    if (isset($_SERVER['HTTP_CF_CONNECTING_IP'])) {
        $_SERVER['REMOTE_ADDR'] = sanitize_text_field($_SERVER['HTTP_CF_CONNECTING_IP']);
    }
}, 1);

// CloudflareのSSLモード「フレキシブル」使用時(非推奨)のリダイレクトループ防止
// ※ 本来は「Full(厳格)」を推奨
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO'])
    && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
    $_SERVER['HTTPS'] = 'on';
}

// 管理画面のURLをHTTPSに強制
add_filter('admin_url', function(string $url): string {
    return str_replace('http://', 'https://', $url);
});

ステップ3:Cloudflare WAFルールを設定する

// Cloudflare Workers: WordPressの管理画面を特定IPのみに制限
// Workers & Pages > Create Worker に以下を設定

addEventListener('fetch', event => {
    event.respondWith(handleRequest(event.request));
});

async function handleRequest(request) {
    const url = new URL(request.url);

    // wp-adminとwp-login.phpを特定IPのみに制限
    if (url.pathname.startsWith('/wp-admin') ||
        url.pathname === '/wp-login.php') {

        const clientIP = request.headers.get('CF-Connecting-IP');
        const allowedIPs = ['203.0.113.1', '198.51.100.0']; // 許可IPリスト

        if (!allowedIPs.includes(clientIP)) {
            return new Response('403 Forbidden', { status: 403 });
        }
    }

    return fetch(request);
}

ステップ4:Cloudflareのページルールとキャッシュ設定

// Cloudflare APIでキャッシュをパージ(PHP)
function cloudflare_purge_cache(array $urls = []): bool {
    $zone_id = defined('CF_ZONE_ID') ? CF_ZONE_ID : '';
    $api_key = defined('CF_API_TOKEN') ? CF_API_TOKEN : '';

    if (!$zone_id || !$api_key) return false;

    $body = $urls
        ? ['files' => $urls]
        : ['purge_everything' => true];

    $response = wp_remote_post(
        "https://api.cloudflare.com/client/v4/zones/{$zone_id}/purge_cache",
        [
            'headers' => [
                'Authorization' => "Bearer {$api_key}",
                'Content-Type'  => 'application/json',
            ],
            'body'    => wp_json_encode($body),
            'timeout' => 15,
        ]
    );

    if (is_wp_error($response)) return false;

    $result = json_decode(wp_remote_retrieve_body($response), true);
    return $result['success'] ?? false;
}

// 投稿公開時に自動パージ
add_action('publish_post', function(int $post_id): void {
    cloudflare_purge_cache([
        get_permalink($post_id),
        home_url('/'),
    ]);
});

ステップ5:Cloudflareのセキュリティ設定を最適化する

# Cloudflare ダッシュボードで設定(API経由)

# セキュリティレベル: Medium(推奨)
curl -X PATCH "https://api.cloudflare.com/client/v4/zones/{zone_id}/settings/security_level" \
  -H "Authorization: Bearer $CF_API_TOKEN" \
  -H "Content-Type: application/json" \
  --data '{"value":"medium"}'

# SSL/TLS: Full (strict) に設定
curl -X PATCH "https://api.cloudflare.com/client/v4/zones/{zone_id}/settings/ssl" \
  -H "Authorization: Bearer $CF_API_TOKEN" \
  -H "Content-Type: application/json" \
  --data '{"value":"strict"}'

# HSTS有効化
curl -X PATCH "https://api.cloudflare.com/client/v4/zones/{zone_id}/settings/security_header" \
  -H "Authorization: Bearer $CF_API_TOKEN" \
  -H "Content-Type: application/json" \
  --data '{"value":{"strict_transport_security":{"enabled":true,"max_age":31536000,"include_subdomains":true}}}'

注意事項

  • SSLモード: 「フレキシブル」は非推奨。「Full(厳格)」を使用し、オリジンサーバーにも有効なSSL証明書を設置してください
  • リダイレクトループ: CloudflareとWordPressの設定が競合するとリダイレクトループが発生します。HTTPSの強制設定を確認してください
  • 管理画面キャッシュ: /wp-admin/*/wp-login.phpはCloudflareのキャッシュから必ず除外してください
  • プラグイン競合: Cloudflare公式プラグインを使う場合は、他のセキュリティプラグインとの設定が重複しないよう注意してください

まとめ

Cloudflareの設定ステップは「ネームサーバー変更→WordPress互換性設定→WAFルール→キャッシュ設定→SSL強化」の5段階です。特に管理画面のIP制限とSSL設定は最優先で対応してください。関連記事:WordPressのWAF設定方法

お気軽にご相談ください

お見積りへ お問い合わせへ