Mail sunucusu kurulumlarında en sık yapılan hatalardan biri, Postfix ile Dovecot arasındaki iletişimi doğru şekilde yapılandırmamaktır. Postfix mailleri alır, sıraya koyar ve iletir; ancak yerel kullanıcılara mailleri teslim etme konusunda Dovecot’un LMTP servisi devreye girmezse, klasik mailbox_command veya procmail gibi eski yöntemlere mahkum kalırsınız. Bu yazıda Dovecot LMTP’nin ne olduğunu, neden tercih edilmesi gerektiğini ve Postfix ile nasıl sağlıklı bir entegrasyon kurulacağını adım adım ele alacağız.
LMTP Nedir ve Neden Önemlidir?
LMTP, yani Local Mail Transfer Protocol, RFC 2033 ile tanımlanmış bir protokoldür. SMTP’ye çok benzer ama temel farkı, son teslimat için tasarlanmış olmasıdır. Dovecot bu protokolü kendi bünyesinde implemente etmiş durumdadır ve Postfix’ten gelen mailleri alarak doğrudan Dovecot’un mail depolama sistemine (Maildir, mbox vb.) yazmaktadır.
Neden LMTP tercih edilmeli diye sorarsanız, birkaç somut sebep var:
- Hata yönetimi üstündür: LMTP, her alıcı için ayrı yanıt kodu döndürür. Yani 10 alıcılı bir mesajda 2 tanesi başarısız olursa, diğer 8 tanesi yine de teslim edilir.
- Dovecot eklentileri devreye girer: Sieve filtreleri, quota kontrolleri, antivirus entegrasyonları LMTP üzerinden otomatik çalışır.
- Performans avantajı: Procmail veya deliver gibi harici komutları her mail için fork etmek yerine, kalıcı bir daemon üzerinden Unix socket ya da TCP ile iletişim kurulur.
- Dovecot deliver ile karşılaştırma: Eski
dovecot-ldayöntemi her teslimat için yeni bir process başlatırdı. LMTP bunu ortadan kaldırır.
Ortam Hakkında Bilgi
Bu yazıda kullanılan ortam şu şekildedir:
- İşletim sistemi: Ubuntu 22.04 LTS veya CentOS/Rocky Linux 8+
- Postfix: 3.6+
- Dovecot: 2.3+
- Mail depolama: Maildir formatı
- Virtual kullanıcılar: MySQL/MariaDB backend
Eğer sanal kullanıcı yerine sistem kullanıcıları kullanıyorsanız, bazı adımlar farklılık gösterecektir. Onu da yazı içinde belirteceğim.
Dovecot LMTP Servisini Aktif Etme
İlk olarak Dovecot tarafında LMTP servisini yapılandırmamız gerekiyor. Ubuntu’da Dovecot konfigürasyonları /etc/dovecot/conf.d/ altında parçalı dosyalarda bulunur. CentOS/Rocky’de ise tek bir /etc/dovecot/dovecot.conf dosyası veya yine conf.d yapısı kullanılabilir.
10-master.conf Düzenlemesi
LMTP soketi burada tanımlanır:
sudo nano /etc/dovecot/conf.d/10-master.conf
Dosya içinde service lmtp bloğunu bulun veya yoksa ekleyin:
service lmtp {
unix_listener /var/spool/postfix/private/dovecot-lmtp {
mode = 0600
user = postfix
group = postfix
}
# TCP üzerinden de dinlemek isterseniz (örn. çok sunuculu yapılar için):
# inet_listener lmtp {
# address = 127.0.0.1
# port = 24
# }
}
Burada dikkat edilmesi gereken nokta, socket dosyasının /var/spool/postfix/private/ altında oluşturulmasıdır. Postfix, chroot ortamında çalıştığından bu dizine erişebilmesi için socket’in burada olması şarttır. mode = 0600 ve user = postfix ayarları, başka kullanıcıların bu sokete erişmesini engeller.
LMTP Protokol Ayarları
sudo nano /etc/dovecot/conf.d/20-lmtp.conf
Bu dosya zaten mevcut olabilir. İçeriğini şu şekilde yapılandırın:
protocol lmtp {
# Postmaster adresi hata mesajları için gereklidir
postmaster_address = [email protected]
# Sieve filtrelerini aktif etmek için (pigeonhole yüklüyse)
mail_plugins = $mail_plugins sieve
# Her alıcı için ayrı log satırı üretir, debug için faydalıdır
# lmtp_save_to_detail_mailbox = yes
}
Eğer Pigeonhole/Sieve kurulu değilse mail_plugins satırını kaldırın ya da boş bırakın.
Postfix Tarafındaki Yapılandırma
Postfix’in Dovecot LMTP’yi kullanabilmesi için main.cf ve master.cf dosyalarında değişiklikler yapmamız gerekiyor.
main.cf Değişiklikleri
sudo nano /etc/postfix/main.cf
Virtual kullanıcılar için aşağıdaki direktifleri ekleyin veya güncelleyin:
# Virtual mailbox teslimatı için LMTP kullan
virtual_transport = lmtp:unix:private/dovecot-lmtp
# Virtual mailbox domain tanımları (MySQL kullanıyorsanız)
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf
# LMTP için önemli ayar: Dovecot kullanıcıya mail göndermeden önce
# kullanıcının var olup olmadığını doğrular
virtual_mailbox_limit = 0
Sistem kullanıcıları için ise virtual_transport yerine şunu kullanırsınız:
mailbox_transport = lmtp:unix:private/dovecot-lmtp
master.cf Kontrolü
Genellikle master.cf içinde özel bir LMTP girdisi oluşturmanıza gerek yoktur çünkü Postfix LMTP’yi yerleşik olarak destekler. Ancak özel ayarlar için:
sudo nano /etc/postfix/master.cf
Dosyanın sonuna eklenebilecek isteğe bağlı bir örnek:
# İsteğe bağlı: LMTP için özel timeout ayarları
# Bu satırı eklemek zorunda değilsiniz, Postfix varsayılan LMTP client'ı kullanır
dovecot unix - n n - - pipe
flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver
-f ${sender} -d ${recipient}
Yukarıdaki pipe örneği eski dovecot-lda yöntemi için gösterim amaçlıdır. Bunu kullanmayın, LMTP ile işiniz çok daha basit.
Dovecot Authentication ile Postfix SASL Entegrasyonu
LMTP ile birlikte ele alınması gereken bir diğer konu, Postfix’in kimlik doğrulama için Dovecot’u kullanmasıdır. Bu sayede tek bir kullanıcı veritabanı yönetirsiniz.
sudo nano /etc/dovecot/conf.d/10-master.conf
service auth bloğunu bulun ve Postfix’e SASL için socket açın:
service auth {
unix_listener /var/spool/postfix/private/auth {
mode = 0660
user = postfix
group = postfix
}
unix_listener auth-userdb {
mode = 0600
user = vmail
group = vmail
}
}
Postfix tarafında da SASL ayarlarını yapın:
# main.cf içine eklenecekler
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $myhostname
broken_sasl_auth_clients = yes
Gerçek Dünya Senaryosu: Çok Domainli Yapı
Diyelim ki bir hosting firması işletiyorsunuz ve tek bir sunucuda example.com, testsite.net ve mycompany.org gibi birden fazla domain için mail servisi veriyorsunuz. Bu yapıda Dovecot LMTP çok kritik bir role sahiptir.
MySQL ile Virtual Kullanıcı Yapısı
Önce veritabanı sorgularını Postfix’e tanıtın:
# /etc/postfix/mysql-virtual-mailbox-domains.cf
user = mailuser
password = gizlisifre
hosts = 127.0.0.1
dbname = mailserver
query = SELECT 1 FROM virtual_domains WHERE name='%s'
# /etc/postfix/mysql-virtual-mailbox-maps.cf
user = mailuser
password = gizlisifre
hosts = 127.0.0.1
dbname = mailserver
query = SELECT 1 FROM virtual_users WHERE email='%s'
Dovecot tarafında da aynı veritabanını kullanarak kullanıcı doğrulama yapabilirsiniz:
sudo nano /etc/dovecot/conf.d/auth-sql.conf.ext
passdb {
driver = sql
args = /etc/dovecot/dovecot-sql.conf.ext
}
userdb {
driver = sql
args = /etc/dovecot/dovecot-sql.conf.ext
}
sudo nano /etc/dovecot/dovecot-sql.conf.ext
driver = mysql
connect = host=127.0.0.1 dbname=mailserver user=mailuser password=gizlisifre
default_pass_scheme = SHA512-CRYPT
password_query = SELECT email as user, password FROM virtual_users WHERE email='%u'
user_query = SELECT
CONCAT('/var/mail/vhosts/', domain, '/', mailbox) AS home,
'vmail' AS uid,
'vmail' AS gid,
CONCAT('*:bytes=', quota) AS quota_rule
FROM virtual_users
WHERE email='%u'
Quota Entegrasyonu
LMTP’nin en büyük avantajlarından biri, Dovecot’un quota sistemini otomatik olarak devreye sokmasıdır. Kullanıcının kotası dolduğunda LMTP bunu Postfix’e bildirir ve Postfix gönderene uygun bir hata mesajı döndürür.
sudo nano /etc/dovecot/conf.d/90-quota.conf
plugin {
quota = maildir:User quota
quota_rule = *:storage=1G
quota_rule2 = Trash:storage=+100M
quota_warning = storage=95%% quota-warning 95 %u
quota_warning2 = storage=80%% quota-warning 80 %u
}
service quota-warning {
executable = script /usr/local/bin/quota-warning.sh
unix_listener quota-warning {
user = vmail
}
}
20-lmtp.conf dosyasında quota plugin’i ekleyin:
protocol lmtp {
postmaster_address = [email protected]
mail_plugins = $mail_plugins sieve quota
}
Servisleri Yeniden Başlatma ve Test Etme
Yapılandırma değişikliklerini uygulamak için servisleri yeniden başlatın:
sudo systemctl restart dovecot
sudo systemctl restart postfix
# Servis durumlarını kontrol edin
sudo systemctl status dovecot
sudo systemctl status postfix
# Socket dosyasının oluşup oluşmadığını doğrulayın
ls -la /var/spool/postfix/private/dovecot-lmtp
Beklenen çıktı:
srw------- 1 postfix postfix 0 Oca 15 10:23 /var/spool/postfix/private/dovecot-lmtp
LMTP Bağlantı Testi
Telnet ile LMTP’yi doğrudan test edebilirsiniz:
sudo -u postfix telnet 127.0.0.1 24
# Eğer TCP üzerinden dinliyorsa
# Unix socket test için:
sudo -u vmail nc -U /var/spool/postfix/private/dovecot-lmtp
Daha güvenilir bir test için swaks aracını kullanabilirsiniz:
sudo apt install swaks # Ubuntu
# veya
sudo yum install swaks # CentOS
swaks --to [email protected]
--from [email protected]
--server 127.0.0.1
--port 25
--auth LOGIN
--auth-user [email protected]
--auth-password "sifre"
Log Takibi ve Sorun Giderme
Mail sunucularında sorun çıktığında loglar hayat kurtarır. LMTP ile ilgili sorunları şu komutlarla izleyebilirsiniz:
# Postfix logları (Ubuntu)
sudo tail -f /var/log/mail.log
# Dovecot logları
sudo tail -f /var/log/dovecot.log
# veya journald kullanıyorsanız
sudo journalctl -u dovecot -f
# Her iki logu aynı anda izlemek için
sudo tail -f /var/log/mail.log /var/log/dovecot.log
Başarılı bir LMTP teslim logu şöyle görünür:
Jan 15 10:25:43 mailserver postfix/lmtp[12345]: 3ABC123DEF: to=<[email protected]>, relay=dovecot-lmtp[/var/spool/postfix/private/dovecot-lmtp], delay=0.15, delays=0.1/0/0/0.05, dsn=2.0.0, status=sent (250 2.0.0 <[email protected]> xxxxxxxxxxx Saved)
Yaygın Sorunlar ve Çözümleri
Sorun: “Connection refused” veya “No such file or directory”
Socket dosyası oluşmamış demektir. Dovecot’un çalışıp çalışmadığını ve 10-master.conf’taki socket yolunun doğru olup olmadığını kontrol edin:
sudo dovecot -n | grep lmtp
sudo ls -la /var/spool/postfix/private/
Sorun: “Permission denied”
Socket üzerindeki izinler yanlış ayarlanmış. mode = 0600 ve user = postfix satırlarını kontrol edin. Dovecot’u restart ettikten sonra socket izinlerini tekrar kontrol edin.
Sorun: “User doesn’t exist” hatası
Dovecot userdb sorgusunu test edin:
sudo doveadm user [email protected]
sudo doveadm auth test [email protected] "sifre"
Sorun: Quota aşımında mail bounce olmuyor
20-lmtp.conf içinde quota plugin’in aktif edildiğinden ve 90-quota.conf dosyasının doğru yapılandırıldığından emin olun. Ayrıca kullanıcının Maildir içinde maildirsize dosyasını yeniden oluşturmayı deneyin:
sudo doveadm quota recalc -u [email protected]
Performans İyileştirmeleri
Yüksek hacimli mail trafiği olan ortamlarda LMTP servisini optimize etmek önemlidir:
sudo nano /etc/dovecot/conf.d/10-master.conf
service lmtp bloğuna process limitlerini ekleyin:
service lmtp {
unix_listener /var/spool/postfix/private/dovecot-lmtp {
mode = 0600
user = postfix
group = postfix
}
# Eş zamanlı process sayısı
process_min_avail = 5
# Maksimum process sayısı (0 = sınırsız)
process_limit = 50
# Her process'in handle edeceği bağlantı sayısı
service_count = 0
}
Postfix tarafında da LMTP bağlantı limitlerini ayarlayabilirsiniz:
# main.cf içine
lmtp_destination_concurrency_limit = 10
lmtp_destination_recipient_limit = 50
Güvenlik Kontrol Listesi
Kurulumu tamamladıktan sonra şu güvenlik maddelerini gözden geçirin:
- Socket izinleri:
/var/spool/postfix/private/dovecot-lmtpüzerinde yalnızca postfix kullanıcısının okuma-yazma yetkisi olmalı - vmail kullanıcısı: Mail dosyalarını saklayan dizinlerin sahibi vmail kullanıcısı olmalı, root değil
- SQL şifreleri: Veritabanı bağlantı dosyaları (
/etc/postfix/mysql-*.cf,/etc/dovecot/dovecot-sql.conf.ext) sadece ilgili servis kullanıcıları tarafından okunabilmeli - TLS zorunluluğu: Kullanıcılar SMTP ile bağlanırken TLS şifrelemesi zorunlu tutulmalı
- Rate limiting: Postfix
smtpd_client_message_rate_limitile spam gönderimini sınırlandırın
# Dosya izinlerini doğrulayın
sudo ls -la /etc/postfix/mysql-*.cf
sudo ls -la /etc/dovecot/dovecot-sql.conf.ext
sudo chmod 640 /etc/postfix/mysql-*.cf
sudo chmod 640 /etc/dovecot/dovecot-sql.conf.ext
Sieve Filtreleri ile Entegrasyon
LMTP kullandığınızda, kullanıcıların kendi mail filtrelerini yönetebilmesi için Sieve desteğini aktif etmek oldukça kolaydır. Pigeonhole paketini kurun:
# Ubuntu
sudo apt install dovecot-sieve dovecot-managesieved
# CentOS/Rocky
sudo dnf install dovecot-pigeonhole
sudo nano /etc/dovecot/conf.d/90-sieve.conf
plugin {
sieve = file:~/sieve;active=~/.dovecot.sieve
sieve_default = /var/lib/dovecot/sieve/default.sieve
sieve_dir = ~/sieve
sieve_max_script_size = 1M
sieve_quota_max_scripts = 0
sieve_quota_max_storage = 0
}
Kullanıcıların kendi Sieve kurallarını yönetmesi için ManageSieve servisini aktif edin (10-master.conf):
service managesieve-login {
inet_listener sieve {
port = 4190
}
}
service managesieve {
process_limit = 1024
}
Sonuç
Dovecot LMTP ile Postfix entegrasyonu, modern bir mail sunucusu altyapısının temel taşlarından birini oluşturuyor. Eski procmail veya dovecot-lda yöntemlerine kıyasla performans, hata yönetimi ve eklenti desteği açısından ciddi avantajlar sunuyor. Özellikle çok domainli yapılarda, quota yönetiminde ve Sieve filtrelerinin devreye alınmasında LMTP’nin sağladığı kolaylık tartışılmaz.
Kurulum sırasında en sık karşılaşılan sorunlar genellikle socket izinleri ve chroot yolu gibi basit konfigürasyon hatalarından kaynaklanıyor. Logları düzenli takip etmek ve doveadm araçlarını kullanmayı alışkanlık haline getirmek, sorun giderme sürecini büyük ölçüde hızlandırıyor. Üretim ortamına almadan önce swaks ile kapsamlı testler yapmanızı ve quota senaryolarını mutlaka denemenizi öneririm.