L
Linux • Literally Web ID

Benteng Pertahanan Edge-to-Origin: Konfigurasi Cloudflare WAF, Fail2ban Nginx Rate Limiting, dan Mail Server Postfix/DKIM untuk Web Security

⏱️ 15 menit baca • 📅 12 Oct 2026 • 👁️ 3 views
Benteng Pertahanan Edge-to-Origin: Konfigurasi Cloudflare WAF, Fail2ban Nginx Rate Limiting, dan Mail Server Postfix/DKIM untuk Web Security

Benteng Pertahanan Edge-to-Origin: Konfigurasi Cloudflare WAF, Fail2ban Nginx Rate Limiting, dan Mail Server Postfix/DKIM untuk Web Security

1. Konteks Industri & Analisis Akar Masalah

Dalam lanskap infrastruktur web modern, ancaman terhadap server aplikasi tidak lagi datang dari serangan tunggal yang sederhana, melainkan dari orkestrasi botnet terdistribusi, serangan Distributed Denial of Service (DDoS) Layer 7 yang menargetkan titik lemah sumber daya backend, serta eksploitasi celah injeksi kode pada aplikasi web. Arsitektur server tunggal (standalone Virtual Private Server) yang langsung mengekspos port 80 dan 443 ke publik tanpa lapisan pertahanan tepi (edge protection) adalah bentuk kelalaian operasional yang fatal.

Bottleneck keamanan klasik pada sistem produksi meliputi:

  • Kelelahan Sumber Daya (Resource Exhaustion): Nginx atau Apache kehabisan alokasi worker processes dan memori RAM akibat terjangan HTTP Flood atau credential stuffing pada endpoint login.
  • Spam & Spoofing Email: Mail server lokal yang mengirimkan notifikasi transaksi atau pendaftaran pengguna sering kali masuk ke folder spam atau ditolak oleh penyedia email besar (Google, Microsoft) karena ketiadaan tanda tangan kriptografis yang valid (SPF, DKIM, DMARC).
  • Keterbatasan Visibilitas Log: Analisis serangan secara reaktif alih-alih proaktif, menyebabkan server sering kali tumbang sebelum tindakan mitigasi manual diambil.

Perbandingan kondisi Sebelum dan Sesudah penerapan arsitektur Defense-in-Depth (Edge-to-Origin):

Metrik / Aspek Sebelum (Tanpa Edge & Rate Limiting) Sesudah (Dengan Cloudflare, Nginx, & Fail2ban)
Beban CPU & RAM Server Fluktuatif tinggi, rentan OOM Killer saat traffic melonjak. Stabil, karena 85%+ request statis dan serangan mentah ditelan oleh Edge CDN.
Tingkat Keberhasilan Phishing/Spam Tinggi (Email sering masuk Junk/Spam). Rendah/Nihil (Reputasi domain terjaga dengan otentikasi penuh).
Waktu Tanggap Serangan Manual dan reaktif (Server down baru ditangani). Otomatis (IP penyerang diblokir secara dinamis oleh Fail2ban & WAF).

2. Konsep Inti & Deep Dive Arsitektur

Sistem pertahanan berlapis (Defense-in-Depth) beroperasi dengan prinsip menyaring ancaman sejauh mungkin dari server origin (pusat data utama). Diagram di bawah mengilustrasikan alur perjalanan paket data dari klien internet hingga mencapai infrastruktur backend.

+---------------------------------------------------------------------------------+
|                              INTERNET TRAFFIC                                   |
+---------------------------------------------------------------------------------+
                                         |
                                         v
+---------------------------------------------------------------------------------+
|                           CLOUDFLARE EDGE NETWORK                               |
|  - Global Anycast DNS                                                           |
|  - DDoS Mitigation Layer 7                                                      |
|  - WAF Managed Rules & Rate Limiting                                            |
+---------------------------------------------------------------------------------+
                                         |
                          (Encrypted Tunnel / HTTPS)
                                         v
+---------------------------------------------------------------------------------+
|                             LINUX VPS (ORIGIN)                                  |
|  +---------------------------------------------------------------------------+  |
|  | UFW Firewall (Membuka port 80, 443, 22 - Hanya dari IP Cloudflare & SSH)    |  |
|  +---------------------------------------------------------------------------+  |
|  | Nginx Web Server (Modul limit_req untuk Rate Limiting per-IP)             |  |
|  +---------------------------------------------------------------------------+  |
|  | Fail2ban (Memantau error log Nginx & SSH, mengeksekusi rule iptables/nftables)|  |
|  +---------------------------------------------------------------------------+  |
|  | Postfix Mail Server (Relay SMTP eksternal + Penandatanganan DKIM/SPF/DMARC) |  |
|  +---------------------------------------------------------------------------+  |
+---------------------------------------------------------------------------------+

Alur Eksekusi Keamanan:

  1. Edge Filtering: Klien mengirimkan request HTTP/HTTPS. Cloudflare memeriksa reputasi IP, menjalankan aturan Web Application Firewall (WAF), dan mengevaluasi aturan Rate Limiting di tingkat edge.
  2. Origin Protection: Hanya request yang lolos yang diteruskan ke server origin. UFW di server origin dikonfigurasi secara ketat hanya menerima koneksi dari rentang IP resmi Cloudflare untuk port HTTP/HTTPS.
  3. Local Rate Limiting & Jail: Di dalam Nginx, modul limit_req membatasi jumlah request per detik per alamat IP. Jika klien melanggar ambang batas berulang kali, Nginx mencatatnya ke error log. Fail2ban membaca log ini secara real-time dan langsung melakukan drop pada tingkat kernel menggunakan iptables/nftables.
  4. Outbound Mail Authenticity: Ketika aplikasi perlu mengirim email, Postfix lokal bertindak sebagai agen pengirim yang merelay pesan melalui SMTP eksternal yang aman, dilengkapi dengan catatan DNS TXT (SPF, DKIM, DMARC) untuk membuktikan legitimasi domain.

3. Perbandingan Komparatif / Analisis Pendekatan

Memilih mekanisme proteksi memerlukan pemahaman mendalam tentang trade-off sumber daya komputasi.

Pendekatan / Teknologi Kelebihan Utama Kekurangan / Risiko Trade-off Sumber Daya
Cloudflare WAF (Edge) Menghemat bandwidth origin, menyerap serangan jutaan RPS. Bergantung pada pihak ketiga, potensi false positive pada aturan ketat. Meminimalkan CPU/RAM Origin, Latency jaringan sangat rendah.
Nginx limit_req (Origin) Kontrol presisi tinggi pada level aplikasi, bekerja offline. Hanya melindungi jika request sudah mencapai server origin. Mengonsumsi sedikit memori RAM untuk mencatat shared memory zone.
Fail2ban (Host-based) Efektif memblokir penyerang berulang dalam jangka panjang. Reaktif terhadap log, konsumsi I/O disk untuk pembacaan log file. Konsumsi CPU minimal, membebani kernel saat daftar blokir sangat besar.

[!IMPORTANT] Jangan pernah mengandalkan hanya satu lapisan keamanan. Kombinasi Cloudflare untuk mitigasi skala besar dan Fail2ban/Nginx untuk pertahanan lokal adalah standar emas industri.


4. Prasyarat Sistem & Persiapan Lingkungan

Sebelum memulai konfigurasi, pastikan spesifikasi lingkungan berikut terpenuhi:

  • Sistem Operasi: Ubuntu 22.04 LTS atau Debian 12 (Fresh Install dengan akses root/sudo).
  • Domain: Terdaftar dan nameserver diarahkan ke Cloudflare.
  • Paket Dasar: nginx, ufw, fail2ban, postfix, opendkim, opendkim-tools.

Lakukan pembaruan sistem dan instalasi paket dasar melalui terminal:

sudo apt update && sudo apt upgrade -y
sudo apt install -y nginx ufw fail2ban postfix opendkim opendkim-tools certbot python3-certbot-nginx

Verifikasi bahwa Nginx dan Fail2ban berjalan dengan normal:

sudo systemctl status nginx
sudo systemctl status fail2ban

5. Panduan Implementasi Langkah demi Langkah

Langkah 1: Konfigurasi UFW Firewall (Origin Hardening)

UFW harus dikonfigurasi agar hanya mengizinkan lalu lintas web dari Cloudflare dan akses SSH dari jaringan aman (atau port kustom).

# Reset UFW ke pengaturan default
sudo ufw --force reset
sudo ufw default deny incoming
sudo ufw default allow outgoing

# Izinkan SSH (ganti 22 dengan port SSH Anda jika diubah)
sudo ufw allow 22/tcp

# Unduh dan tambahkan IP Cloudflare secara otomatis (IPv4 & IPv6)
for ip in $(curl -s https://www.cloudflare.com/ips-v4); do sudo ufw allow from $ip to any port 80 proto tcp; done
for ip in $(curl -s https://www.cloudflare.com/ips-v4); do sudo ufw allow from $ip to any port 443 proto tcp;
done

for ip in $(curl -s https://www.cloudflare.com/ips-v6); do sudo ufw allow from $ip to any port 80 proto tcp; done
for ip in $(curl -s https://www.cloudflare.com/ips-v6); do sudo ufw allow from $ip to any port 443 proto tcp;
done

# Aktifkan UFW
sudo ufw enable
sudo ufw status verbose

Langkah 2: Konfigurasi Nginx Rate Limiting (limit_req)

Buat file konfigurasi zona rate limiting di dalam direktori conf.d/ Nginx.

File: /etc/nginx/conf.d/rate_limit.conf

# Mendefinisikan zona memori bersama seluas 10MB untuk melacak status IP
# rate=10r/s berarti setiap IP diizinkan melakukan 10 request per detik
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;

# Zona khusus untuk halaman sensitif seperti login (1 request per 2 detik)
limit_req_zone $binary_remote_addr zone=login:10m rate=30r/m;

Terapkan zona tersebut pada blok server virtual host Nginx:

File: /etc/nginx/sites-available/default

server {
    listen 80;
    server_name contohdomain.com www.contohdomain.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name contohdomain.com www.contohdomain.com;

    root /var/www/html;
    index index.php index.html index.htm;

    ssl_certificate /etc/letsencrypt/live/contohdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/contohdomain.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    # Tangani real IP dari Cloudflare
    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 2406:b400::/32;
    set_real_ip_from 2407:7080::/32;
    real_ip_header CF-Connecting-IP;

    location / {
        # Terapkan rate limit zona 'one', burst=20 mengizinkan lonjakan 20 request tanpa error
        limit_req zone=one burst=20 nodelay;
        try_files $uri $uri/ =404;
    }

    location /wp-login.php {
        # Rate limit ketat untuk halaman login
        limit_req zone=login burst=5 nodelay;
        try_files $uri =404;
        fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
    }
}

Langkah 3: Konfigurasi Fail2ban Custom Jails

Buat konfigurasi kustom untuk mendeteksi serangan HTTP brute-force dan pelanggaran rate limit Nginx.

File: /etc/fail2ban/jail.local

[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 5
banaction = ufw

[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s
backend = systemd

[nginx-http-auth]
enabled = true
port = http,https
logpath = /var/log/nginx/error.log
backend = auto

[nginx-limit-req]
enabled = true
port = http,https
logpath = /var/log/nginx/error.log
maxretry = 10
findtime = 60
bantime = 600

[nginx-botsearch]
enabled = true
port = http,https
logpath = /var/log/nginx/error.log
maxretry = 2

Pastikan filter untuk nginx-limit-req tersedia di /etc/fail2ban/filter.d/nginx-limit-req.conf:

[Definition]
failregex =limiting requests, excess:.* by zone.*client: <HOST>
igNOREREGEX =

Aktifkan dan mulai ulang layanan Fail2ban:

sudo systemctl enable fail2ban
sudo systemctl restart fail2ban
sudo fail2ban-client status

Langkah 4: Konfigurasi Postfix Mail Server dan OpenDKIM

Agar email yang dikirim dari server (misalnya reset password atau notifikasi sistem) tidak masuk spam, kita mengonfigurasi Postfix dan OpenDKIM.

File: /etc/postfix/main.cf

smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no
append_dot_mydomain = no
readme_directory = no

# Konfigurasi TLS
smtpd_tls_cert_file=/etc/letsencrypt/live/contohdomain.com/fullchain.pem
smtpd_tls_key_file=/etc/letsencrypt/live/contohdomain.com/privkey.pem
smtpd_tls_security_level=may
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

myhostname = mail.contohdomain.com
aliase_maps = hash:/etc/aliases
aliase_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = $myhostname, contohdomain.com, localhost.localdomain, localhost
relayhost = 
mynetsites = 127.0.0.0/8 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = loopback-only
inet_protocols = all

# Integrasi OpenDKIM Milter
smilter_default_action = accept
smilter_protocol = 2
smtpd_milters = inet:127.0.0.1:8891
non_smtpd_milters = inet:127.0.0.1:8891

Konfigurasi OpenDKIM (/etc/opendkim.conf):

AutoRestart             Yes
AutoRestartRate         10/1h
UMask                   002
Syslog                  Yes
SyslogSuccess           Yes
LogWhy                  Yes

Canonicalization        relaxed/simple
Mode                    sv
SubDomains              No

Namesabets              localhost
KeyTable                /etc/opendkim/KeyTable
SigningTable            /etc/opendkim/SigningTable
ExternalIgnoreList      /etc/opendkim/TrustedHosts
InternalHosts           /etc/opendkim/TrustedHosts
Socket                  inet:8891@127.0.0.1

Generate kunci DKIM:

sudo mkdir -p /etc/opendkim/keys/contohdomain.com
sudo opendkim-genkey -s mail -d contohdomain.com -D /etc/opendkim/keys/contohdomain.com/
sudo chown -R opendkim:opendkim /etc/opendkim
sudo chmod 700 /etc/opendkim/keys/contohdomain.com
sudo chmod 600 /etc/opendkim/keys/contohdomain.com/mail.private

Isi file pendukung OpenDKIM:

  • /etc/opendkim/TrustedHosts:
127.0.0.1
localhost
contohdomain.com
  • /etc/opendkim/SigningTable:
*@contohdomain.com mail._domainkey.contohdomain.com
  • /etc/opendkim/KeyTable:
mail._domainkey.contohdomain.com contohdomain.com:mail:/etc/opendkim/keys/contohdomain.com/mail.private

Mulai ulang layanan postfix dan opendkim:

sudo systemctl restart opendkim
sudo systemctl restart postfix

Konfigurasikan DNS Record berikut di panel Cloudflare:

  • A Record: mail -> IP VPS Origin (Proxy dimatikan / DNS Only / Grey Cloud)
  • MX Record: @ -> mail.contohdomain.com (Priority 10)
  • TXT Record (SPF): @ -> v=spf1 mx ip4:IP_VPS_ANDA ~all
  • TXT Record (DKIM): mail._domainkey -> (Ambil isi dari /etc/opendkim/keys/contohdomain.com/mail.txt)
  • TXT Record (DMARC): _dmarc -> v=DMARC1; p=reject; rua=mailto:admin@contohdomain.com; sp=reject; pct=100

6. Bedah Kode & Penjelasan Detail Baris Kunci

  • set_real_ip_from dan real_ip_header CF-Connecting-IP;: Baris ini krusial di Nginx saat menggunakan Cloudflare. Tanpanya, semua request yang masuk ke log Nginx akan mencatat IP server Cloudflare alih-alih IP asli pengunjung. Dengan konfigurasi ini, Fail2ban dapat mendeteksi IP asli penyerang secara akurat.
  • limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;: Menggunakan variabel biner alamat IP ($binary_remote_addr) jauh lebih hemat memori dibandingkan $remote_addr (format string teks). Alokasi memori 10MB sanggup melacak sekitar 160.000 alamat IP aktif secara bersamaan.
  • p=reject pada DMARC record: Memberikan instruksi tegas kepada server penerima email (seperti Gmail) untuk menolak secara permanen (reject) email yang gagal verifikasi SPF atau DKIM yang mengatasnamakan domain Anda, mencegah pemalsuan identitas domain secara mutlak.

7. Skenario Produksi & Studi Kasus Dunia Nyata

Studi Kasus: Sebuah platform e-commerce mengalami lonjakan trafik palsu sebanyak 50.000 request per detik pada halaman keranjang belanja yang memicu kelambatan sistem.

Solusi Penerapan:

  1. Mengaktifkan Cloudflare Under Attack Mode untuk memfilter bot otomatis menggunakan JavaScript challenge.
  2. Menerapkan aturan WAF di Cloudflare untuk memblokir User-Agent kosong dan request yang berasal dari negara yang tidak relevan dengan target pasar.
  3. Di sisi server origin, modul Nginx limit_req membatasi lonjakan request pada script checkout (/cart/checkout.php) dengan parameter burst=2 nodelay, memastikan user asli tetap dapat melakukan transaksi sementara bot langsung diganjar HTTP error 503 dan diblokir oleh Fail2ban.

8. Common Pitfalls, Anti-Patterns & Solusi

  • Anti-Pattern 1: Mengaktifkan Proxy (Orange Cloud) pada Record MX atau Mail Server. Dampak: Cloudflare tidak mem-proxy trafik port SMTP (25, 465, 587). Jika DNS record mail atau MX di-proxy melalui Cloudflare, koneksi SMTP akan terputus total. Solusi: Pastikan record DNS untuk mail server selalu diset ke DNS Only (Grey Cloud).
  • Anti-Pattern 2: Lupa Menambahkan IP Cloudflare pada set_real_ip_from. Dampak: Fail2ban akan memblokir alamat IP Cloudflare alih-alih IP penyerang, yang berakibat seluruh situs web Anda tidak dapat diakses oleh siapa pun. Solusi: Selalu sinkronkan daftar IP Cloudflare terbaru secara berkala.

9. Benchmark, Metrik Kinerja & Tuning Performa

Lakukan pengujian beban (load testing) menggunakan wrk untuk memverifikasi ketahanan Nginx terhadap rate limiting.

# Melakukan simulasi 400 koneksi paralel selama 30 detik ke endpoint utama
wrk -t12 -c400 -d30s https://contohdomain.com/

Hasil Analisis Metrik:

  • Pastikan tingkat error (Non-2xx or 3xx responses) meningkat secara proporsional sesuai dengan aturan burst rate limiting yang ditetapkan, menandakan bahwa perlindungan berjalan tanpa membuat Nginx mengalami kernel panic atau kehabisan memori.
  • Periksa penggunaan memori bersama Nginx dengan perintah sudo nginx -T untuk memastikan tidak ada alokasi zona yang mengalami exhaustion.

10. Checklist Penerapan Produksi & Kesimpulan

  • UFW aktif dan hanya membuka port 80/443 dari IP Cloudflare.
  • Modul real_ip Nginx dikonfigurasi dengan benar menggunakan header CF-Connecting-IP.
  • Zona rate limiting Nginx (limit_req) terpasang pada rute publik dan halaman login.
  • Fail2ban dikonfigurasi dengan jail Nginx dan UFW banaction.
  • Postfix dan OpenDKIM aktif; catatan SPF, DKIM, dan DMARC terverifikasi sempurna di DNS.
  • Pengujian pengiriman email berhasil melewati uji SpamAssassin tanpa masuk ke folder spam.

Dengan menerapkan arsitektur Edge-to-Origin secara komprehensif ini, infrastruktur web Anda kini memiliki benteng pertahanan berlapis yang tangguh terhadap ancaman siber modern, stabil di bawah lonjakan trafik ekstrem, serta memiliki integritas komunikasi email yang tepercaya.

🏷️ Tags: #Nginx #High Concurrency #Performance #Sysadmin #Web Server