Memperkuat pertahanan mail server: memastikan Postfix bukan open relay lewat smtpd_relay_restrictions, menguji dengan swaks dari luar, membatasi firewall hanya pada port yang dibutuhkan, memasang fail2ban untuk brute force, serta menegakkan helo dan identitas klien.

Setelah fitur lengkap terpasang, saatnya mengunci benteng. Dua ancaman yang paling sering menimpa mail server yang kurang dijaga: menjadi open relay (dimanfaatkan spammer sebagai pengirim) dan brute force (serangan berulang pada login). Episode ini menutup keduanya.
Kita akan memastikan kebijakan relay Postfix benar, mengujinya dari luar, membatasi firewall hanya pada port yang dibutuhkan, memasang fail2ban, dan menegakkan aturan identitas klien. Di akhir episode, server kalian tahan terhadap uji open relay standar.
Open relay adalah mail server yang bersedia meneruskan email dari siapa pun ke siapa pun tanpa autentikasi. Bagi spammer, itu adalah mimpi: mereka bisa mengirim massal tanpa jejak. Bagi pemilik server, itu adalah bencana — IP masuk blacklist, reputasi hancur, dan email sah ikut tertolak.
Postfix secara default menolak relay untuk domain yang tidak dikenal, tapi kebijakan itu bisa salah dikonfigurasi — misalnya dengan mynetworks yang terlalu lebar. Itulah mengapa smtpd_relay_restrictions ada sebagai garis pertahanan eksplisit.
Sejak Postfix 2.10, kebijakan relay dipisah dari kebijakan penerima lewat smtpd_relay_restrictions. Aturan bakunya:
sudo postconf -e 'smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, defer_unauth_destination'
sudo postfix reloadMaknanya sederhana:
permit_mynetworks — jaringan tepercaya boleh relay.permit_sasl_authenticated — klien terautentikasi (via submission) boleh relay.defer_unauth_destination — sisanya ditolak sementara (4xx), kecuali tujuan adalah domain yang kita layani.Cek nilai aktifnya:
postconf smtpd_relay_restrictions smtpd_recipient_restrictionsKedua parameter harus tampil seperti yang diharapkan — perbedaan di antara keduanya sering menjadi sumber open relay yang tidak disengaja.
Kebijakan tidak berarti sampai diuji dari luar server. swaks bisa mensimulasikan percobaan relay:
swaks --server mail.example.com --from attacker@evil.com \
--to victim@other-domain.comJika server kalian sehat, output menampilkan penolakan seperti 554 5.7.1 Relay access denied. Uji juga dua skenario sah:
--to admin@example.com harus diterima (domain kita).--auth-user admin@example.com --tls harus diterima.Danger
Ulangi pengujian dari IP publik, bukan dari dalam mynetworks. Uji dari localhost akan selalu lulus karena 127.0.0.0/8 ada di mynetworks — bukan bukti server aman. Jalankan dari mesin lain atau via --ehlo dengan alamat berbeda.
Untuk audit massal, tools online seperti MXToolbox menyediakan uji open relay otomatis. Jalankan setelah setiap perubahan kebijakan relay.
Prinsipnya: buka sekecil mungkin, tutup sisanya. Mail server publik butuh empat port keluar masuk: 25, 587, 465, 993 (plus 143/110/995 jika dibutuhkan, dan 443 untuk webmail).
Dengan ufw:
sudo ufw allow 25/tcp
sudo ufw allow 587/tcp
sudo ufw allow 465/tcp
sudo ufw allow 993/tcp
sudo ufw default deny incoming
sudo ufw enableCatatan penting: port 25 hanya dari internet (untuk MTA lain), sedangkan IMAP boleh dibatasi ke jaringan internal jika webmail sudah memadai. Verifikasi aturan:
sudo ufw status verboseJika kalian memakai nftables atau firewalld, prinsipnya sama — hanya sintaks yang berbeda. Yang penting: tidak ada port filter (10024/10025), database, atau SSH yang terbuka ke publik tanpa alasan.
Login SMTP dan IMAP adalah sasaran brute force. fail2ban memantau log dan memblokir IP yang gagal berulang kali. Buat jail untuk Postfix dan Dovecot di /etc/fail2ban/jail.local:
[postfix-sasl]
enabled = true
port = smtp,submission,smtps
logpath = /var/log/mail.log
[dovecot]
enabled = true
port = imap,imaps,pop3,pop3s
logpath = /var/log/mail.logRestart dan periksa status:
sudo systemctl restart fail2ban
sudo fail2ban-client statusfail2ban-client status postfix-sasl menampilkan jumlah IP yang sedang diblokir. Sesuaikan maxretry dan bantime sesuai kebijakan — misalnya 5 percobaan dalam 10 menit menghasilkan ban 1 jam.
Beberapa parameter smtpd_* memperketat siapa yang bisa bercakap dengan server:
sudo postconf -e 'smtpd_helo_required = yes'
sudo postconf -e 'smtpd_helo_restrictions = permit_mynetworks, reject_invalid_helo_hostname, reject_non_fqdn_helo_hostname, reject_unknown_helo_hostname'
sudo postconf -e 'smtpd_sender_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unknown_sender_domain'
sudo postfix reloadsmtpd_helo_required — setiap klien wajib mengirim helo.reject_invalid_helo_hostname — helo harus hostname yang valid.reject_unknown_sender_domain — domain pengirim harus me-resolve.Kombinasi ini menolak banyak bot spam yang malas meniru protokol. Tambahkan smtpd_data_restrictions untuk menolak baris yang tidak sesuai spesifikasi.
Hardening bukan satu kali jalan. Bentuk ritual berkala:
fail2ban-client status untuk melihat tren serangan.journalctl -u postfix -u dovecot --since "24 hours ago" | grep -iE "reject|error" untuk melihat pola penolakan.sudo apt update && sudo apt upgrade -y.Tip
Simpan postconf -n dan doveconf -n sebagai "baseline" setelah semua hardening. Saat terjadi masalah di kemudian hari, kalian bisa membandingkan konfigurasi aktif dengan baseline ini dengan cepat.
Episode 16 selesai. Inti yang harus dibawa pulang:
smtpd_relay_restrictions membatasi relay hanya untuk mynetworks dan klien terautentikasi.smtpd_helo_* dan reject_unknown_sender_domain menolak bot yang malas.Benteng sudah terkunci. Di episode 17 kita membangun identitas: DKIM Signing (OpenDKIM), SPF Alignment & DMARC — menandatangani setiap email keluar dan menegakkan kebijakan autentikasi hingga reject. Sampai jumpa di episode 17!