2026年11月12日

2026年11月12日

Cara Memasang Cloudflare di WordPress: Nameserver, SSL, IP Asli, WAF

Artikel ini adalah edisi lokal dari artikel asli berbahasa Jepang. Baca artikel asli berbahasa Jepang

Memasang Cloudflare di WordPress dilakukan berurutan: (1) tambahkan situs ke Cloudflare dan ganti nameserver domain, (2) ubah mode enkripsi SSL/TLS menjadi Full (strict), (3) pulihkan IP asli pengunjung di sisi server, (4) lindungi halaman login dengan aturan khusus (custom rules) WAF. Paket gratis pun sudah mencakup CDN, SSL, perlindungan DDoS, dan custom rules (hingga 5 aturan).

Artikel ini menjelaskan setiap pengaturan beserta hal yang perlu diperiksa setelah beralih. Nama dan letak menu di layar Cloudflare bisa berubah, sehingga di sini penjelasannya mengikuti dokumentasi resmi (developers.cloudflare.com) per November 2026.

Hal yang perlu diputuskan sebelum mulai

  • Pengelolaan DNS dipindahkan ke Cloudflare. Registrar tempat domain terdaftar tidak berubah, tetapi DNS record kini diedit di layar Cloudflare.
  • Atur DNS record untuk email (seperti MX) agar tidak diproksikan. Yang melewati Cloudflare hanya lalu lintas web (HTTP/HTTPS).
  • Pastikan origin (server tempat WordPress berada) memiliki sertifikat SSL yang valid. Jika HTTPS sudah berjalan dengan Let's Encrypt atau sejenisnya, biarkan apa adanya.
  • Jika DNSSEC aktif di sisi registrar, nonaktifkan sebelum mengganti nameserver. Jika DS record lama masih tersisa, resolusi nama akan gagal.

Langkah 1: Tambahkan situs dan ganti nameserver

  1. Buat akun Cloudflare, lalu tambahkan domain di dasbor. Anda bisa memilih paket Free.
  2. Cloudflare membaca DNS record yang ada dan menampilkannya dalam daftar, jadi periksa apakah ada yang terlewat. Karena ada record yang tidak terbaca, bandingkan dengan layar pengelolaan DNS saat ini dan tambahkan sendiri yang kurang.
  3. Aktifkan status proxy (awan oranye) untuk record A (atau AAAA, CNAME) situs web. Nonaktifkan (DNS only, awan abu-abu) untuk MX dan record A untuk server email.
  4. Cloudflare menampilkan dua nama nameserver. Namanya berbentuk 〇〇.ns.cloudflare.com dan ditetapkan per akun. Gunakan dua nama yang muncul di layar Anda sendiri, bukan nama yang tertulis di artikel lain.
  5. Di layar pengelolaan registrar domain, ubah nameserver menjadi kedua nama tersebut.

Periksa apakah sudah berganti dengan perintah berikut. Penerapannya bisa memakan waktu beberapa jam.

# Apakah nameserver sudah menjadi dua milik Cloudflare
dig NS example.com +short

# Apakah lalu lintas melewati Cloudflare (server: cloudflare dan cf-ray dikembalikan)
curl -sI https://example.com | grep -iE '^(server|cf-ray):'

Jika status domain di layar Cloudflare menjadi aktif (Active), peralihan selesai.

Langkah 2: Ubah SSL/TLS menjadi Full (strict)

SSL/TLS Cloudflare memiliki mode yang menentukan cara mengenkripsi koneksi antara pengunjung dan Cloudflare, serta antara Cloudflare dan origin.

Mode Antara Cloudflare dan origin Penanganan di WordPress
Off Tidak dienkripsi Jangan dipakai
Flexible HTTP (tidak dienkripsi) Jangan dipakai. Menyebabkan redirect berulang tanpa akhir dan mixed content
Full HTTPS (sertifikat tidak diverifikasi) Solusi sementara sampai sertifikat tersedia
Full (strict) HTTPS (sertifikat diverifikasi) Pilih yang ini

Mode diubah di halaman ringkasan (Overview) SSL/TLS pada dasbor Cloudflare. Pengaturan bawaan "Automatic SSL/TLS" memilih mode yang aman secara otomatis sejauh didukung origin. Jika Anda memilih Full (strict) sendiri, situs tidak akan berjalan dengan mode yang tidak diinginkan. Sertifikat origin bisa berasal dari otoritas sertifikat publik (seperti Let's Encrypt) atau sertifikat Origin CA yang diterbitkan Cloudflare.

Alasan menghindari Flexible adalah sebagai berikut. Pada Flexible, permintaan sampai ke origin lewat HTTP, sehingga WordPress atau server menjawab "karena datang lewat HTTP, alihkan ke HTTPS", lalu Cloudflare kembali mengambil ke origin lewat HTTP, dan siklus ini berulang (browser menampilkan ERR_TOO_MANY_REDIRECTS). Dengan Full (strict), permintaan sampai ke origin lewat HTTPS juga, sehingga di sisi WordPress tidak perlu kode tambahan yang membaca X-Forwarded-Proto lalu menulis ulang $_SERVER['HTTPS'].

Sekaligus, pastikan "Alamat WordPress (URL)" dan "Alamat Situs (URL)" di "Pengaturan" (Settings) → "Umum" (General) di WordPress sudah berawalan https://. Jika gambar dan sebagainya masih tertinggal dengan http://, lihat cara memperbaiki mixed content.

Langkah 3: Pulihkan IP asli pengunjung

Jika melewati Cloudflare, sumber koneksi (REMOTE_ADDR) yang sampai ke server menjadi alamat IP Cloudflare. Dalam kondisi ini, log akses, IP komentar, dan plugin pembatas percobaan login akan memperlakukan semua pengunjung sebagai IP Cloudflare. Cloudflare meneruskan IP pengunjung lewat header CF-Connecting-IP, jadi atur agar header itu dipercaya hanya ketika sumber koneksi adalah Cloudflare.

Jika REMOTE_ADDR ditulis ulang dengan nilai header tanpa memeriksa sumber koneksi, orang yang mengakses origin langsung tanpa melewati Cloudflare bisa mengaku memiliki IP apa pun lewat header. Karena alasan ini, jangan pakai kode dari artikel lama yang hanya "menetapkan HTTP_CF_CONNECTING_IP ke REMOTE_ADDR jika ada".

Daftar alamat IP Cloudflare dipublikasikan di https://www.cloudflare.com/ips/. Daftar ini bisa berubah, jadi tinjau secara berkala.

Jika memakai Nginx

Gunakan ngx_http_realip_module. Di blok http atau blok server, tuliskan semua rentang Cloudflare.

# Rentang IP Cloudflare (per November 2026. Periksa yang terbaru di cloudflare.com/ips)
set_real_ip_from 173.245.48.0/20;
set_real_ip_from 103.21.244.0/22;
set_real_ip_from 103.22.200.0/22;
set_real_ip_from 103.31.4.0/22;
set_real_ip_from 141.101.64.0/18;
set_real_ip_from 108.162.192.0/18;
set_real_ip_from 190.93.240.0/20;
set_real_ip_from 188.114.96.0/20;
set_real_ip_from 197.234.240.0/22;
set_real_ip_from 198.41.128.0/17;
set_real_ip_from 162.158.0.0/15;
set_real_ip_from 104.16.0.0/13;
set_real_ip_from 104.24.0.0/14;
set_real_ip_from 172.64.0.0/13;
set_real_ip_from 131.0.72.0/22;
set_real_ip_from 2400:cb00::/32;
set_real_ip_from 2606:4700::/32;
set_real_ip_from 2803:f800::/32;
set_real_ip_from 2405:b500::/32;
set_real_ip_from 2405:8100::/32;
set_real_ip_from 2a06:98c0::/29;
set_real_ip_from 2c0f:f248::/32;

real_ip_header CF-Connecting-IP;
sudo nginx -t && sudo systemctl reload nginx

Jika memakai Apache (Debian / Ubuntu)

Gunakan mod_remoteip. Buat /etc/apache2/conf-available/remoteip.conf, lalu daftarkan rentang Cloudflare di RemoteIPTrustedProxy.

RemoteIPHeader CF-Connecting-IP
RemoteIPTrustedProxy 173.245.48.0/20 103.21.244.0/22 103.22.200.0/22 103.31.4.0/22
RemoteIPTrustedProxy 141.101.64.0/18 108.162.192.0/18 190.93.240.0/20 188.114.96.0/20
RemoteIPTrustedProxy 197.234.240.0/22 198.41.128.0/17 162.158.0.0/15 104.16.0.0/13
RemoteIPTrustedProxy 104.24.0.0/14 172.64.0.0/13 131.0.72.0/22
RemoteIPTrustedProxy 2400:cb00::/32 2606:4700::/32 2803:f800::/32 2405:b500::/32
RemoteIPTrustedProxy 2405:8100::/32 2a06:98c0::/29 2c0f:f248::/32
sudo a2enmod remoteip
sudo a2enconf remoteip
sudo apache2ctl configtest
sudo systemctl restart apache2

Agar IP asli muncul di log akses, ubah %h menjadi %a pada LogFormat (combined) di /etc/apache2/apache2.conf.

Jika konfigurasi server tidak bisa diubah (wp-config.php)

Jika Anda tidak bisa mengubah konfigurasi web server, misalnya di shared hosting, lakukan pengecekan yang sama di wp-config.php. Letakkan sebelum baris require_once ABSPATH . 'wp-settings.php';. Nilai CF-Connecting-IP (yang valid sebagai alamat IP) hanya dipakai jika sumber koneksi termasuk dalam rentang Cloudflare.

<?php
// Hanya jika lewat Cloudflare, gunakan CF-Connecting-IP sebagai IP pengunjung
$cf_ranges = [
    '173.245.48.0/20', '103.21.244.0/22', '103.22.200.0/22', '103.31.4.0/22',
    '141.101.64.0/18', '108.162.192.0/18', '190.93.240.0/20', '188.114.96.0/20',
    '197.234.240.0/22', '198.41.128.0/17', '162.158.0.0/15', '104.16.0.0/13',
    '104.24.0.0/14', '172.64.0.0/13', '131.0.72.0/22',
    '2400:cb00::/32', '2606:4700::/32', '2803:f800::/32', '2405:b500::/32',
    '2405:8100::/32', '2a06:98c0::/29', '2c0f:f248::/32',
];

function cf_ip_in_range(string $ip, string $cidr): bool
{
    [$net, $bits] = explode('/', $cidr);
    $ip_bin  = inet_pton($ip);
    $net_bin = inet_pton($net);
    if ($ip_bin === false || $net_bin === false || strlen($ip_bin) !== strlen($net_bin)) {
        return false;
    }
    $bits  = (int) $bits;
    $bytes = intdiv($bits, 8);
    if ($bytes > 0 && substr($ip_bin, 0, $bytes) !== substr($net_bin, 0, $bytes)) {
        return false;
    }
    $rest = $bits % 8;
    if ($rest === 0) {
        return true;
    }
    $mask = (0xFF << (8 - $rest)) & 0xFF;
    return (ord($ip_bin[$bytes]) & $mask) === (ord($net_bin[$bytes]) & $mask);
}

if (!empty($_SERVER['HTTP_CF_CONNECTING_IP']) && !empty($_SERVER['REMOTE_ADDR'])) {
    foreach ($cf_ranges as $range) {
        if (cf_ip_in_range($_SERVER['REMOTE_ADDR'], $range)) {
            $visitor = filter_var($_SERVER['HTTP_CF_CONNECTING_IP'], FILTER_VALIDATE_IP);
            if ($visitor !== false) {
                $_SERVER['REMOTE_ADDR'] = $visitor;
            }
            break;
        }
    }
}

wp-config.php sejak awal sudah memiliki <?php, jadi jangan menyalin <?php di baris pertama; tempelkan mulai baris kedua. Buat cadangan wp-config.php sebelum menempel.

Langkah 4: Lindungi halaman login dengan custom rules WAF

Custom rules WAF Cloudflare bisa dibuat hingga 5 aturan di paket gratis, dan Anda dapat memilih tindakan selain Log (seperti Block dan Managed Challenge). Untuk membuatnya, di halaman Security rules pada dasbor pilih "Create rule" lalu "Custom rules", tentukan kondisi (Field, Operator, Value) dan tindakan, kemudian "Deploy".

Contoh 1: Buka halaman login dan admin hanya untuk IP Anda sendiri

Ini contoh jika Anda memiliki IP tetap di rumah atau kantor. Jika ditulis sebagai ekspresi, bentuknya seperti berikut (ganti 203.0.113.10 dan 198.51.100.0/24 dengan IP Anda).

(http.request.uri.path eq "/wp-login.php" or starts_with(http.request.uri.path, "/wp-admin/"))
and http.request.uri.path ne "/wp-admin/admin-ajax.php"
and not ip.src in {203.0.113.10 198.51.100.0/24}

Tindakannya adalah Block. /wp-admin/admin-ajax.php dikeluarkan dari kondisi karena terkadang dipanggil tanpa login oleh fungsi halaman publik seperti formulir kontak dan infinite scroll.

Contoh 2: Jika tidak punya IP tetap, batasi dengan negara dan Managed Challenge

(http.request.uri.path eq "/wp-login.php" or http.request.uri.path eq "/xmlrpc.php")
and not ip.src.country in {"JP"}

Untuk penentuan negara, gunakan ip.src.country (kode 2 huruf ISO 3166-1). ip.geoip.country pada artikel lama sudah tidak direkomendasikan. Untuk tindakan, mulailah dengan Managed Challenge, periksa di security events apakah ada akses sah yang ikut tertahan, lalu ubah ke Block jika perlu. Dokumentasi Cloudflare juga menganjurkan cara ini. xmlrpc.php dipakai saat memposting dari Jetpack atau aplikasi ponsel, jadi pastikan dulu apakah Anda memakainya sebelum memasukkannya ke kondisi.

Pembatasan per negara hanyalah alat bantu yang bisa dihindari dengan VPN dan sebagainya. Kombinasikan dengan autentikasi dua faktor dan pembatasan jumlah percobaan login. Cara menentukan negara di sisi Nginx dijelaskan di Cara membatasi akses per negara dengan GeoIP2 di Nginx.

Langkah 5: Perilaku cache bawaan dan purge saat publikasi

Secara bawaan Cloudflare tidak menyimpan cache HTML. Yang di-cache adalah file statis yang ditentukan oleh ekstensinya, seperti gambar, CSS, JavaScript, dan font. Respons yang memuat header Set-Cookie juga tidak di-cache. Karena itu, jika tidak ada pengaturan apa pun, layar admin dan halaman login tidak akan di-cache oleh Cloudflare.

Jika Anda ingin meng-cache HTML juga, perluas cakupannya dengan Cache Rules, tetapi saat itu /wp-admin/, /wp-login.php, pratinjau, dan tampilan untuk pengguna yang sedang login harus dikeluarkan dari cakupan. Kesalahan dalam mengecualikan bisa membuat layar khusus admin tampil untuk orang lain, jadi jika tidak yakin, lebih aman membiarkannya sesuai pengaturan bawaan.

Jika tampilan tidak berubah setelah Anda mengganti CSS atau gambar, lakukan purge (hapus) dari pengaturan cache di dasbor. Jika ingin purge otomatis setiap kali pos dipublikasikan atau diperbarui, panggil API Cloudflare. Pertama, buat API token di Cloudflare yang hanya memiliki izin "Cache Purge", lalu tulis bersama Zone ID (ditampilkan di halaman ringkasan domain) sebagai konstanta di wp-config.php.

define( 'CF_ZONE_ID', 'ID_Zona' );
define( 'CF_API_TOKEN', 'API_Token' );

Letakkan kode berikut di functions.php child theme atau di plugin kecil buatan sendiri (bisa juga dengan Code Snippets).

<?php
// Saat pos dipublikasikan atau diperbarui, hapus cache artikel dan beranda dari Cloudflare
function cf_purge_urls(array $urls): bool
{
    if (!defined('CF_ZONE_ID') || !defined('CF_API_TOKEN')) {
        return false;
    }

    $response = wp_remote_post(
        'https://api.cloudflare.com/client/v4/zones/' . CF_ZONE_ID . '/purge_cache',
        [
            'headers' => [
                'Authorization' => 'Bearer ' . CF_API_TOKEN,
                'Content-Type'  => 'application/json',
            ],
            'body'    => wp_json_encode(['files' => array_values($urls)]),
            'timeout' => 15,
        ]
    );

    if (is_wp_error($response)) {
        error_log('Cloudflare purge failed: ' . $response->get_error_message());
        return false;
    }

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

add_action('publish_post', function (int $post_id): void {
    if (wp_is_post_revision($post_id) || wp_is_post_autosave($post_id)) {
        return;
    }
    cf_purge_urls([get_permalink($post_id), home_url('/')]);
});

publish_post berjalan saat pos dipublikasikan dan saat pos yang sudah dipublikasikan diperbarui. API purge_cache memiliki files untuk menentukan URL, dan juga purge_everything untuk menghapus semuanya, tetapi purge menyeluruh membuat semua file statis harus diambil ulang, sehingga jangan dipakai setiap kali artikel dipublikasikan.

Yang perlu diperiksa setelah beralih

  • Hasil curl -sI memuat server: cloudflare dan cf-ray, dan di browser tampil ikon gembok
  • Anda bisa login ke layar admin, menyimpan pos, dan mengunggah media
  • Komentar baru dan log akses mencatat IP pengunjung, bukan IP Cloudflare
  • Email dari formulir kontak sampai (record MX tidak diproksikan)
  • Jika Anda membuat custom rules WAF, buka wp-login.php dari koneksi yang tidak diizinkan (misalnya jaringan seluler ponsel) dan pastikan muncul pemblokiran atau challenge

Masalah yang sering terjadi

Muncul ERR_TOO_MANY_REDIRECTS

Periksa apakah mode SSL/TLS masih Flexible. Masalah teratasi dengan memasang sertifikat di origin dan mengubahnya ke Full (strict).

Tidak bisa masuk ke layar admin

Mungkin IP atau negara Anda tidak termasuk dalam kondisi custom rules WAF. Nonaktifkan aturan sementara dari dasbor Cloudflare, periksa di security events aturan mana yang menahan akses Anda, lalu perbaiki ekspresinya.

Semua akses terlihat berasal dari IP yang sama

Pemulihan IP asli pada Langkah 3 belum berhasil. Periksa rentang set_real_ip_from dan real_ip_header jika memakai Nginx, atau apakah remoteip aktif jika memakai Apache.

Ringkasan

  • Ganti nameserver ke dua nameserver yang ditetapkan untuk akun Anda, dan jangan proksikan record email seperti MX
  • SSL/TLS gunakan Full (strict). Flexible menyebabkan redirect berulang dan mixed content
  • IP asli dipulihkan dengan mempercayai CF-Connecting-IP hanya ketika sumber koneksi berada dalam rentang Cloudflare
  • Batasi halaman login dengan IP atau negara lewat custom rules WAF, dan awalnya amati dulu dengan Managed Challenge
  • HTML tidak di-cache secara bawaan. Purge saat publikasi dilakukan dengan API token yang hanya memiliki izin "Cache Purge"

Artikel terkait

Referensi: Restoring original visitor IPs (Cloudflare), Encryption modes (Cloudflare), Custom rules (Cloudflare WAF), Default cache behavior (Cloudflare)

Ada pertanyaan tentang WordPress? Penerbit situs ini berada di Jepang dan membalas dalam bahasa Jepang. Kontak (bahasa Jepang)

お気軽にご相談ください

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