Kalau kamu mengelola Zimbra OSE self-hosted, ada satu masalah klasik yang sering luput diperhatikan sampai suatu hari kamu butuh setup fail2ban: audit.log mencatat IP server Zimbra sendiri sebagai IP login, bukan IP publik user yang sebenarnya. Akibatnya, rule fail2ban yang kamu buat jadi percuma — bukannya memblokir penyerang, dia malah berpotensi memblokir seluruh trafik webmail sekaligus (karena semua "IP" yang tercatat sama saja).
Tulisan ini mendokumentasikan penyebab masalahnya, cara memperbaikinya, sampai pertimbangan kalau di depan server Zimbra kamu ada firewall/router (studi kasus: Mikrotik) yang melakukan port forwarding.
Lingkungan referensi: Zimbra OSE 10.1.17 di Ubuntu 24.04, instalasi single-server (all-in-one).
1. Kenapa Ini Bisa Terjadi?
Zimbra single-server itu sebenarnya bukan satu proses monolitik — ada dua komponen HTTP yang bekerja sama:
zimbra-proxy— nginx bawaan Zimbra, menerima koneksi HTTPS dari internet di port 80/443.zimbra-mailbox(mailboxd, berbasis Jetty) — mesin sesungguhnya yang memproses login & mail, biasanya dilocalhost:8080/8443.
Jadi walaupun cuma "satu server", secara internal traffic tetap melewati proxy dulu sebelum sampai ke mailboxd. Masalahnya: mailboxd hanya melihat koneksi datang dari nginx (127.0.0.1), kecuali dia diberi tahu secara eksplisit untuk membaca IP asli dari header X-Forwarded-For yang dikirim nginx.
Di sinilah dua attribute config Zimbra berperan:
zimbra_http_originating_ip_header— header mana yang harus dibaca mailboxd untuk cari IP asli (default:X-Forwarded-For).zimbraMailTrustedIP— daftar IP yang boleh dipercaya untuk mengisi header tersebut. Kalau daftar ini kosong (default-nya memang kosong!), mailboxd akan mengabaikan header X-Forwarded-For sama sekali dan mencatat IP koneksi TCP langsung — yaitu IP si proxy (127.0.0.1 / IP server itu sendiri).
Itulah sumber masalahnya: bukan bug, tapi memang default Zimbra belum "mempercayai" siapa pun untuk mengoper informasi IP asli.
2. Solusi: Set zimbraMailTrustedIP
Cek dulu kondisi sekarang:
su - zimbra -c "zmlocalconfig zimbra_http_originating_ip_header"
su - zimbra -c "zmprov gcf zimbraMailTrustedIP"
Kalau zimbraMailTrustedIP kosong, itu memang biang masalahnya. Karena proxy dan mailbox ada di server yang sama, tambahkan dua-duanya: loopback dan IP asli NIC server (nginx kadang connect lewat salah satu dari keduanya, tergantung binding):
su - zimbra -c "zmprov mcf +zimbraMailTrustedIP 127.0.0.1"
su - zimbra -c "zmprov mcf +zimbraMailTrustedIP <IP-internal-server-zimbra>"
Restart mailboxd supaya perubahan kebaca:
su - zimbra -c "zmmailboxdctl restart"
Verifikasi dengan login ulang lalu tail log:
tail -f /opt/zimbra/log/audit.log
Field oip= (originating IP) di baris log sekarang seharusnya sudah menampilkan IP publik user yang sebenarnya.