Dovecot LMTP ile Postfix Entegrasyonu

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-lda yö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_limit ile 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.

Yorum yapın