Konfigurasi Postfix dan Dovecot Multi Domain pada VPS

1288

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:

final dns rec

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:

mail score

Apabila ada error, cek dulu "/var/log/syslog", "/var/log/mail.err", dan "/var/log/mail.log".