Konfigurasi NAT vps dengan Cloudflared

· 4 min read

Beberapa hari yang lalu saya membeli NAT vps dari 8Labs.id, rencananya mau dipergunakan menghosting blog yang mempergunakan Wordpress, TheLounge, ZNC, dan juga aplikasi lainnya.

 

Installasi cloudflared

Berikut langkah instalasi cloudflared di Debian 11 :

curl -fsSL https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64 -o cloudflared 
chmod +x cloudflared 
sudo mv cloudflared /usr/local/bin/

 

Login ke tunnel Cloudflare :

cloudflared tunnel login

Nanti akan muncul link di terminal/shell untuk login ke Cloudflare, silakan select link tadi, lalu paste kan di browser, bebas mau memakai Chrome/Edge/Brave/lainnya.

Di browser akan muncul tampilan seperti diatas, namun kita hanya bisa memilih satu domain saja.


Silakan diklik domainnya, nanti akan muncul jendela konfirmasi.
Setelah selesai, kita akan mendapatkan file cert.pem di /root/.cloudflared/cert.pem

Tambahkan Tunnel

Tambahkan tunnel dengan nama-tunnel yang mudah diingat, misalnya saya membuat tunnel dengan id erawan

sudo cloudflared tunnel create nama-tunnel
Misal kita membuat tunnel untuk domain erawan, maka perintahnya seperti dibawah ini
 
sudo cloudflared tunnel create erawan
Tunnel credentials written to /root/.cloudflared/cxx-xxx-xxx-xxx-xxx.json. cloudflared chose this file based on where your origin certificate was found. Keep this file secret. To revoke these credentials, delete the tunnel.

Created tunnel erawan with id cxx-xxx-xxx-xxx-xxx

Nah, nanti tunnel dengan id cxx-xxx-xxx-xxx-xxx yang akan muncul sebagai CNAME di Cloudflare.
Kalau mau membuat tunnel dengan nama tunnel znc, tinggal diganti perintahnya menjadi cloudflared tunnel create znc.

 

Tambahkan routing dns

sudo -u cloudflared cloudflared tunnel route dns nama-tunnel CNAME
Misal nama tunnel saya adalah erawan, dan CNAME yang diperlukan adalah @ dan www, maka kita bisa menjalankan perintah berikut ini
 
sudo -u cloudflared cloudflared tunnel route dns erawan erawanarifnugroho.com
sudo -u cloudflared cloudflared tunnel route dns erawan www.erawanarifnugroho.com
 
Added CNAME erawanarifnugroho.com -> cxxx-xxx.cfargotunnel.com
Added CNAME www.erawanarifnugroho.com -> cxxx-xxx.cfargotunnel.com

Setelah melakukan perintah tadi, maka di /root/.cloudflared akan muncul file ini :

ls /root/.cloudflared
cxx-xxx-xxx-xxx-xxx.json
cert.pem

Copykan dua file tadi ke /etc/cloudflared/, atau buat direktorynya jika belum ada

mkdir -p /etc/cloudflared/
cp /root/.clouflared/* /etc/cloudflared/
ls /etc/cloudflared

Jalankan dulu secara manual untuk mengujinya

cloudflared tunnel run erawan

 

Buat file konfigurasi cloudflared

Supaya cloudflare bisa berjalan, dia perlu file konfigurasi dengan nama .yml, dengan contoh seperti ini

nano /etc/cloudflared/config.yml

tunnel: erawan
credentials-file: /etc/cloudflared/cxx-xxx-xxx-xxx-xxx.json 
ingress:
  - hostname: erawanarifnugroho.com
    service: http://127.0.0.1:80
    originRequest:
    noTLSVerify: true
    headers:
    X-Forwarded-Proto: https
  - hostname: www.erawanarifnugroho.com
    service: http://127.0.0.1:80
    originRequest:
    noTLSVerify: true
    headers:
    X-Forwarded-Proto: https
  - hostname: chat.erawanarifnugroho.com
    service: http://127.0.0.1:9000
  - hostname: video.erawanarifnugroho.com
    service: tcp://127.0.0.1:5900
  - service: http_status:404

Akan muncul pertanyaan, mengapa memakai http dan bukan https?
Dan juga mengapa memakai port 80 dan bukan 443?

Karena vps melayani semuanya secara normal melalui http, dan fungsi enkripsi atau terminasi SSL sudah dilakukan oleh Cloudflare melalui cloudflared.

Kalau sudah, masuk ke web Cloudflare, dan seting SSL di Cloudflare ke Full, bukan Flexible.

  • Dari Cloudflare, pilih domain, pilih menu SSL/TLS-Overview, klik Configure
  • Pilih Custom SSL/TLS, pilih Full, lalu Save.

Di contoh konfigurasi config.yml tadi, kita bisa menambahkan service ingress sebanyak apapun, tinggal menyesuaikan port aplikasi yang berjalan, dengan ketentuan service dengan port tcp selalu berada dibawah http.

 

Install cloudflared daemon

sudo cloudflared service install
sudo systemctl enable cloudflared
sudo systemctl restart cloudflared

Sekarang coba akses web atau aplikasi anda, seharusnya sudah bisa diakses.

 

Konfigurasi Caddy

Karena saya mempergunakan Caddy dan Wordpress, maka ada perlu beberapa perubahan (memerlukan waktu lama untuk mencari masalah dan melakukan perbaikan ini).

Problemnya muncul ketika membuka halaman wp-admin, yang selalu redirect terus menerus.

Berikut adalah contoh file /etc/caddy/Caddyfile, dengan memaksa agar domain wordpress berjalan melalui http.

{
    auto_https off # kita matikan automatic https
    email erawan@arsip.my.id

    log {
        output file /var/log/caddy/access.log
        level INFO
    }
}

# Caddy mendengarkan pada interface dan port yang disetel di Cloudflared
# Disini kita memakai http, supaya tidak automatis ke https
# Secara default caddy akan memproses ke https
http://erawanarifnugroho.com, http://www.erawanarifnugroho.com {
   log {
        output file /var/log/caddy/blog.log
        level INFO
    }
	
    # ROOT WordPress
    root * /home/erawanarifnugroho.com

    # PHP-FPM
    php_fastcgi unix//var/run/php/php8.4-fpm.sock

    # Rewrite Rules WordPress
    try_files {path} {path}/ /index.php?{query}
    file_server
    encode zstd

    header {
        # Hapus header server
        -Server
    }
}

 

Konfigurasi php-fpm

Berikut ini adalah contoh isi /etc/php/8.4/fpm/poold/www.conf

[www]
user = www-data
group = www-data

listen = /var/run/php/php8.4-fpm.sock
; sesuaikan listen portnya dengan setingan di Caddy

 

Konfigurasi wp-config.php

Berikut ini adalah contoh tambahan di file wp-config.php

<?php

// 1. Hardcode Domain (Wajib)
define('WP_HOME', 'https://erawanarifnugroho.com');
define('WP_SITEURL', 'https://erawanarifnugroho.com');

// 2. Paksa SSL untuk Area Admin dan Login (Wajib untuk wp-admin)
define('FORCE_SSL_ADMIN', true);
define('FORCE_SSL_LOGIN', true);

// 3. Override Server Variables (Wajib untuk Reverse Proxy)
if (
    (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') ||
    (isset($_SERVER['HTTP_CF_VISITOR']) && strpos($_SERVER['HTTP_CF_VISITOR'], 'https') !== false) ||
    (isset($_SERVER['HTTP_CF_CONNECTING_IP']))
) {
    $_SERVER['HTTPS'] = 'on';
    // PENTING: Menyetel SERVER_PORT ke 443 seringkali mengatasi loop terakhir
    $_SERVER['SERVER_PORT'] = 443; 
}

// 4. Set Remote IP
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $list = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
    $_SERVER['REMOTE_ADDR'] = $list[0];
}

/**
 * The base configuration for WordPress
 

Dengan memakai konfigurasi seperti diatas, Wordpress dapat diakses melalui https, halaman wp-admin dapat berjalan normal tanpa masalah redirect.