Konfigurasi Postfix dan Dovecot Multi Domain pada VPS
Berikut adalah referensi konfigurasi Postfix dan Dovecot yang digunakan untuk mengirim dan menerima email pada lebih dari satu domain di satu server (VPS).
Catatan: langkah-langkah yang dijelaskan di sini diadaptasi dari artikel di DigitalOcean dan beberapa sumber daring lainnya. Semuanya dicek berfungsi di server uji yang saya tangani.
Postfix Mail Transfer Agent
Syarat & Persiapan
Versi Postfix adalah 3.4.13 (cek dengan cara postconf mail_version
). Sistem operasi yang digunakan adalah Ubuntu 20.04 LTS. Gunakan akun root untuk melakukan konfigurasi.
Domain utama yang digunakan adalah domain1.com (bukan nama domain sebenarnya). Domain kedua adalah domain2.com. Hostname di server saya adalah "domain1.com" (cek dengan cat /etc/hostname
). DNS record juga harus sesuai, contoh:
Tipe | Nama | Mail Server | TTL | Prioritas |
---|---|---|---|---|
MX | domain1.com | domain1.com | Auto | 1 |
Untuk DNS milik "domain2.com" juga sama ya.., sesuaikan domain1... menjadi domain2... seperti contoh di atas pada domain yang satunya lagi. (Di sini saya tidak menggunakan A / CNAME semacam "mail.domain1.com"; saya langsung menggunakan bare domain). Pastikan DNS sudah propagasi sebelum melanjutkan, mungkin butuh waktu 5 menit hingga 24 jam.
Sertifikat SSL juga harus ada; bisa di-generate menggunakan certbot (certbot certonly --standalone
) milik Let's Encrypt (baca selengkapnya di sini).
sudo certbot certonly --standalone
Perlu dicatat, untuk menjalankan certbot dengan cara di atas, semua software web server di server harus dimatikan dulu agar certbot bisa bind ke port 80. Ada dua file yang dibutuhkan: sertifikat fullchain dan kunci privat, format PEM. Biasanya bisa ditemukan di "/etc/letsencrypt/live/nama-domain.com" jika sukses di-generate dengan certbot.
Instalasi & Konfigurasi
Sebagai root, jalankan perintah untuk menghapus exim (karena tidak dibutuhkan dengan adanya Postfix), lalu menginstal postfix dan menghentikannya:
apt remove exim4 && apt install postfix && postfix stop
Jika sudah, silakan cd
ke direktori /etc/postfix
. Ada 2 file yang harus disesuaikan: master.cf dan main.cf. Dalam kasus saya, Postfix tidak akan dijalankan dengan metode chroot. Dimulai dengan file yang pertama:
cd /etc/postfix
nano master.cf
master.cf:
Cari baris yang dimulai dengan smtp
, lalu ubah menjadi:
smtp inet n - n - - smtpd
lalu cari baris yang dimulai dengan submission
, lalu ubah menjadi:
submission inet n - - - - smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_wrappermode=no
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
-o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject
-o milter_macro_daemon_name=ORIGINATING
-o smtpd_sasl_type=dovecot
-o smtpd_sasl_path=private/auth
Selesai. Tekan CTRL + X lalu Y. Lalu lanjut dengan file kedua:
cd /etc/postfix
nano main.cf
main.cf:
myhostname = domain1.com
myorigin = domain1.com
mydomain = domain1.com
mydestination = domain1.com, localhost, localhost.localdomain
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
home_mailbox = Maildir/
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
virtual_alias_domains = hash:/etc/postfix/virtual_domains
virtual_alias_maps = hash:/etc/postfix/virtual_maps
# Biarkan dua baris di bawah sebagai komentar, untuk referensi saja:
# smtpd_tls_cert_file=/etc/letsencrypt/live/domain1.com/fullchain.pem
# smtpd_tls_key_file=/etc/letsencrypt/live/domain1.com/privkey.pem
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_tls_security_level=may
smtpd_tls_protocols = !SSLv2, !SSLv3
smtp_tls_security_level=may
local_recipient_maps = proxy:unix:passwd.byname $alias_maps
inet_protocols = ipv4
compatibility_level=2
# Karena multi-domain, tentukan sertifikat SSL utama
# Perlu diingat, sistem multi-domain ini menggunakan SNI
# yang belum tentu didukung oleh semua email client
smtpd_tls_chain_files =
/etc/letsencrypt/live/domain1.com/privkey.pem,
/etc/letsencrypt/live/domain1.com/fullchain.pem
# Tentukan lokasi map untuk SNI
tls_server_sni_maps = hash:/etc/postfix/vmail_ssl
# kofigurasi Milter untuk DKIM
# Jangan lupa comment semua baris di bawah ini jika belum ada DKIM!
milter_default_action = accept
milter_protocol = 6
smtpd_milters = inet:localhost:8892
non_smtpd_milters = inet:localhost:8892
Selesai. Seperti terlihat di atas, masih ada beberapa file yang harus ditambah/diubah:
/etc/aliases:
nano /etc/aliases
Ini opsional. Misalnya kita ingin me-redirect email yang ditujukan kepada root ke user lain, misalnya ke "myuser", maka:
# See man 5 aliases for format
mailer-daemon: postmaster
postmaster: root
nobody: root
hostmaster: root
usenet: root
news: root
webmaster: root
www: root
ftp: root
abuse: root
root: myuser
/etc/postfix/virtual_domains:
nano /etc/postfix/virtual_domains
Isikan dengan domain kedua dan seterusnya, jika ada. Perhatikan, format baris harus dua kolom, namun kolom kedua tidak diperlukan, sehingga diganti komentar saja.
domain2.com #domain2
/etc/postfix/virtual_maps:
nano /etc/postfix/virtual_maps
Dalam contoh ini, jika server menerima email yang ditujukan ke "user1@domain1.com", user sistem yang menerima adalah user1 dan user2. Adapun user1, user2, dan user3 adalah user Linux sungguhan, di-generate menggunakan adduser
.
Oiya, semua user yang bisa menerima/mengirim emai harus masuk grup "mail" (gunakan chmod -aG mail nama_user
).
Jangan lupa sesuaikan isi file ini dengan pengguna sistem sesungguhnya!
user1@domain1.com user1, user2
user1@domain2.com user3
Kemudian file yang terakhir,
/etc/postfix/vmail_ssl:
nano /etc/postfix/vmail_ssl
# Compile file ini dengan perintah postmap -F hash:/etc/postfix/vmail_ssl setelah dibuat atau diubah
# Satu host setiap baris
domain1.com /etc/letsencrypt/live/domain1.com/privkey.pem /etc/letsencrypt/live/domain1.com/fullchain.pem
domain2.com /etc/letsencrypt/live/domain2.com/privkey.pem /etc/letsencrypt/live/domain2.com/fullchain.pem
Sesuai petunjuk di file di atas, jalankan perintah postmap untuk vmail_ssl:
postmap -F hash:/etc/postfix/vmail_ssl
Lalu compile juga file sisanya:
newaliases
postmap /etc/postfix/virtual_domains
postmap /etc/postfix/virtual_maps
OK. Kita telah mengkonfigurasi Postfix sebagai Mail Transfer Agent, sekarang tinggal mengatur Dovecot sehingga email client semacam Thunderbird atau Google Mail bisa terhubung ke server via POP3 atau IMAP.
Dovecot
Instalasi
apt install dovecot-core dovecot-imapd
lalu buat backup untuk file "dovecot.conf" dan buka menggunakan nano
:
cp /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.bak.conf
nano /etc/dovecot/dovecot.conf
Hapus isi file tersebut dan ganti dengan berikut:
disable_plaintext_auth = no
mail_privileged_group = mail
# Gunakan maildir, bukan mbox
#mail_location = mbox:~/mail:INBOX=/var/mail/%u
mail_location=maildir:~/Maildir:LAYOUT=fs
userdb {
driver = passwd
}
passdb {
args = %s
driver = pam
}
# protokol yang akan kita sediakan adalah imap dan POP3, sesuaikan dengan kebutuhan
protocols = imap pop3
pop3_uidl_format = %08Xu%08Xv
pop3_client_workarounds = outlook-no-nuls oe-ns-eoh
# Namespace untuk Maildir
namespace {
inbox = yes
prefix = INBOX/
separator = /
subscriptions = yes
}
service auth {
unix_listener /var/spool/postfix/private/auth {
group = postfix
mode = 0660
user = postfix
}
}
auth_mechanisms = plain login
ssl=required
# Sertifikat default harus sama dengan di /etc/postfix/main.cf
ssl_cert = </etc/letsencrypt/live/domain1.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/domain1.com/privkey.pem
# domain2.com
local_name domain2.com {
ssl_cert = </etc/letsencrypt/live/domain2.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/domain2.com/privkey.pem
}
# domain1.com
local_name domain1.com {
ssl_cert = </etc/letsencrypt/live/domain1.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/domain1.com/privkey.pem
}
Selesai.
Nantinya akan ada direktori "Maildir" di home directory setiap user dalam grup "mail".
DNS Record tambahan
DMARC
Lanjutkan dengan membuat DNS record baru bertipe TXT untuk DMARC:
Tipe | Nama | TTL | Konten |
---|---|---|---|
TXT | _dmarc | auto | v=DMARC1; p=none; rua=mailto:alamat_email@gmail.com |
Domain-based Message Authentication Reporting and Conformance merupakan sistem yang memungkinkan para penerima email yang menerima email dari sebuah domain untuk melaporkan dan menangani email yang tidak dapat terverifikasi keamanannya.
Jangan lupa ubah alamat_email@gmail.com
dengan alamat email yang aktif, entah itu Google atau terserah.
SPF
Lanjutkan dengan membuat DNS record baru bertipe TXT untuk SPF:
Tipe | Nama | TTL | Konten |
---|---|---|---|
TXT | domain1.com | auto | v=spf1 ip4:XXX.XXX.XXX.XXX include:domain1.com include:domain2.com ~all |
Lakukan juga di setiap domain dengan menyesuaikan "domain1.com". Ubah XXX.XXX.XXX.XXX
dengan alamat IP versi 4 server yang sesungguhnya.
Adapun Sender Policy Framework (SPF) mengatur alamat IP dan hostname yang boleh mengirim email atas nama sebuah domain, misalnya domain kita.
OpenDKIM
DomainKeys Identified Mail (DKIM) menambahkan kunci publik pada DNS, sehingga penerima email bisa memverifikasi email yang dikirim dari sebuah domain. Untuk ini, bisa menggunakan OpenDKIM.
Instal OpenDKIM di server:
apt install opendkim opendkim-tools
lalu tulis konfigurasinya:
nano /etc/opendkim.conf
WARNING: panjang wkwk
# This is a basic configuration that can easily be adapted to suit a standard
# installation. For more advanced options, see opendkim.conf(5) and/or
# /usr/share/doc/opendkim/examples/opendkim.conf.sample.
# Log to syslog
Syslog yes
# Required to use local socket with MTAs that access the socket as a non-
# privileged user (e.g. Postfix)
UMask 007
# Sign for example.com with key in /etc/dkimkeys/dkim.key using
# selector '2007' (e.g. 2007._domainkey.example.com)
#Domain example.com
#KeyFile /etc/dkimkeys/dkim.key
#Selector 2007
# Commonly-used options; the commented-out versions show the defaults.
Canonicalization relaxed/simple
Mode sv
SubDomains yes
# Socket smtp://localhost
#
# ## Socket socketspec
# ##
# ## Names the socket where this filter should listen for milter connections
# ## from the MTA. Required. Should be in one of these forms:
# ##
# ## inet:port@address to listen on a specific interface
# ## inet:port to listen on all interfaces
# ## local:/path/to/socket to listen on a UNIX domain socket
#
Socket inet:8892@localhost
#Socket local:/run/opendkim/opendkim.sock
## PidFile filename
### default (none)
###
### Name of the file where the filter should write its pid before beginning
### normal operations.
#
PidFile /run/opendkim/opendkim.pid
# Always oversign From (sign using actual From and a null From to prevent
# malicious signatures header fields (From and/or others) between the signer
# and the verifier. From is oversigned by default in the Debian pacakge
# because it is often the identity key used by reputation systems and thus
# somewhat security sensitive.
OversignHeaders From
## ResolverConfiguration filename
## default (none)
##
## Specifies a configuration file to be passed to the Unbound library that
## performs DNS queries applying the DNSSEC protocol. See the Unbound
## documentation at http://unbound.net for the expected content of this file.
## The results of using this and the TrustAnchorFile setting at the same
## time are undefined.
## In Debian, /etc/unbound/unbound.conf is shipped as part of the Suggested
## unbound package
# ResolverConfiguration /etc/unbound/unbound.conf
## TrustAnchorFile filename
## default (none)
##
## Specifies a file from which trust anchor data should be read when doing
## DNS queries and applying the DNSSEC protocol. See the Unbound documentation
## at http://unbound.net for the expected format of this file.
TrustAnchorFile /usr/share/dns/root.key
## Userid userid
### default (none)
###
### Change to user "userid" before starting normal operation? May include
### a group ID as well, separated from the userid by a colon.
#
UserID opendkim
KeyTable /etc/opendkim/KeyTable
SigningTable /etc/opendkim/SigningTable
ExternalIgnoreList /etc/opendkim/TrustedHosts
InternalHosts /etc/opendkim/TrustedHosts
Perhatikan port yang akan digunakan adalah port 8892. Tidak perlu open port via firewall. Lalu di bagian akhir file di atas, terlihat bahwa kita masih harus membuat 4 file lagi.
/etc/opendkim/TrustedHosts:
mkdir /etc/opendkim
nano /etc/opendkim/TrustedHosts
Isi dengan alamat IP dan semua domain yang dimiliki (termasuk localhost), misalnya:
127.0.0.1
localhost
192.99.34.121
domain1.com
domain2.com
Lalu untuk file-file berikutnya, masuk bab tersendiri di bawah ini.
Membuat key untuk DKIM
Ulangi semua langkah di bawah untuk semua domain yang kita miliki dan sesuaikan isinya. Misalnya untuk "domain1.com":
mkdir -p /etc/opendkim/keys/domain1.com
cd /etc/opendkim/keys/domain1.com
Buat kunci untuk domain tersebut dan atur agar file kunci ini dimiliki oleh user dan grup bernama opendkim
dengan perintah chown
:
opendkim-genkey -r -d domain1.com
chown opendkim:opendkim default.private
Tambahkan kunci tadi di file KeyTable:
nano /etc/opendkim/KeyTable
isi dengan:
default._domainkey.domain1.com domain1.com:default:/etc/opendkim/keys/domain1.com/default.private
lalu untuk file terakhir, SigningTable:
nano /etc/opendkim/SigningTable
isi dengan:
otherdomain.com default._domainkey.otherdomain.com
Terakhir, untuk file TrustedHosts:
nano /etc/opendkim/TrustedHosts
isi dengan berikut (sesuaikan dan ganti XXX... dengan alamat IP server - perhatikan ada dua entry untuk localhost juga di dalam file ini):
127.0.0.1
localhost
XXX.XXX.XXX.XXX
domain1.com
domain2.com
Nah, jika sudah, tampilkan kunci untuk domain1 dan tulis itu di TXT record di manajemen DNS.
cat /etc/opendkim/keys/domain1.com/default.txt
Copy semua teks pada output, lalu buat TXT record baru:
Tipe | Nama | TTL | Konten |
---|---|---|---|
TXT | default._domainkey | auto | v=DKIM1; h=sha256; k=rsa; s=email; p=bla_bla_bla |
Jangan sampai salah, konten TXT ini ada 5 parameter: v
, h
, k
, s
, dan p
. Untuk p, jangan salah copy ya. Nilai p ini hanya satu baris panjang, tanpa spasi. Apabila menggunakan cat
, cek dan koreksi dulu nilai p agar tidak ada line break. Contoh nilai p:
MIIBIjANBgkqhkiG9g0BAQEFAAOCAQ8AMIIBCgKCAQEAvADWwSsH3FCJeg8ye2jHy5kvj3PLjclEv89VMmxxuE4ca6kadBadwlwfnIHSKlhYv53B1On5w5OtK1XAc1n/hFpGqJBwF9x7mppwDLpixAZsVXfRlmrdr2RV7UHYANRSr6nB4
Ganti bla_bla_bla
dengan teks seperti di atas.
Ulangi semua langkah di atas untuk semua domain yang kita miliki dan sesuaikan isinya.
Jangan lupa, tadi di file "/etc/postfix/main.cf" cek juga baris-baris berikut:
milter_default_action = accept
milter_protocol = 6
smtpd_milters = inet:localhost:8892
non_smtpd_milters = inet:localhost:8892
Berikut adalah contoh semua DNS record yang dibuat di artikel ini:
Pengujian
Jalankan perintah berikut sebagai root:
postfix start
service dovecot restart
service opendkim restart
Coba koneksikan Dovecot dengan mail client seperti Google Mail di smartphone.
Untuk incoming settings:
- username: nama user tanpa @domain1.com
- password: kata sandi user
- server: domain1.com
- port: 993
- security type: SSL/TLS
Untuk outgoing settings:
- Require signin: Yes
- username
- password
- SMTP server: domain1.com
- port: 587
- security type: STARTTLS (jika error, coba TLS)
Lalu coba kirim email ke layanan luar, misal Gmail. Coba juga sebaliknya, terima email dari luar.
Tools online untuk debug SMTP: GMass.
Tools online untuk cek SPF dan DKIM: mail tester.
Tools online untuk cek apakah email akan dianggap Spam: mail tester, kirim email dari server ke alamat yang disediakan, lalu cek skornya. Misal punya saya:
Apabila ada error, cek dulu "/var/log/syslog", "/var/log/mail.err", dan "/var/log/mail.log".