Mail sunucunuzda bir şeyler ters gittiğinde, ilk içgüdünüz muhtemelen kullanıcıyı aramak ya da servisi yeniden başlatmak olur. Ama deneyimli bir sysadmin olarak şunu söyleyebilirim: Dovecot logları doğru okunduğunda, sorunun kaynağına birkaç dakika içinde ulaşmak mümkün. Yıllarca mail sunucusu yöneten biri olarak, Dovecot’un log sistemini anlamak benim için en değerli becerilerden biri oldu.
Dovecot Log Mimarisi
Dovecot, log yönetimi konusunda oldukça esnek bir yapıya sahip. Varsayılan olarak sistem log’una (syslog) yazar, ancak kendi log dosyalarını da kullanabilir. Nereye log attığını bilmeden başlamak vakit kaybettirir.
Önce mevcut log yapılandırmasını kontrol edelim:
# Dovecot'un hangi log dosyasını kullandığını öğrenmek
doveconf -n | grep log_path
# Ya da doğrudan konfigürasyon dosyasına bakmak
grep -r "log_path|syslog_facility|log_timestamp" /etc/dovecot/
Tipik bir Dovecot kurulumunda loglar şu konumlarda olabilir:
- /var/log/mail.log – Debian/Ubuntu sistemlerde
- /var/log/maillog – RHEL/CentOS sistemlerde
- /var/log/dovecot.log – Özel yapılandırıldıysa
- /var/log/dovecot-info.log – Bilgi mesajları için ayrı dosya
- journald – Systemd tabanlı sistemlerde
dovecot.conf veya conf.d/10-logging.conf içinde log ayarlarını şöyle yapılandırabilirsiniz:
# /etc/dovecot/conf.d/10-logging.conf
log_path = /var/log/dovecot.log
info_log_path = /var/log/dovecot-info.log
debug_log_path = /var/log/dovecot-debug.log
log_timestamp = "%Y-%m-%d %H:%M:%S "
auth_verbose = yes
auth_debug = no
mail_debug = no
Temel Log Okuma Teknikleri
Ham log dosyası bazen çok gürültülü olabilir. Doğru filtreleme teknikleri olmadan saatlerce log okuyabilirsiniz. İşte günlük işlerimde kullandığım yöntemler:
# Gerçek zamanlı log takibi
tail -f /var/log/dovecot.log
# Belirli bir kullanıcının son 1 saatteki aktivitesi
grep "[email protected]" /var/log/dovecot.log | tail -100
# Sadece hata mesajlarını görmek
grep -i "error|fatal|panic" /var/log/dovecot.log | tail -50
# Bugünün loglarını tarih filtresiyle almak
grep "$(date '+%Y-%m-%d')" /var/log/dovecot.log | grep -i "error"
# Journald kullanıyorsanız
journalctl -u dovecot --since "1 hour ago" --no-pager
journalctl -u dovecot --since "2024-01-15 08:00:00" --until "2024-01-15 10:00:00"
Logları analiz ederken dikkat etmeniz gereken önemli alanlar şunlardır:
- Timestamp: Olayın ne zaman gerçekleştiği
- Process: dovecot, imap, pop3, auth gibi hangi servisin mesaj ürettiği
- PID: Process ID, aynı bağlantıya ait mesajları izlemek için
- Username/IP: Kimin, nereden bağlandığı
- Message: Asıl sorun ya da bilgi
Kimlik Doğrulama Sorunları
Kullanıcıların en çok şikayet ettiği konu “şifremi giriyorum ama bağlanamıyorum” meselesidir. Bu sorunların büyük çoğunluğu loglara yansır.
# Başarısız giriş denemelerini saymak
grep "auth failed" /var/log/dovecot.log | awk '{print $NF}' | sort | uniq -c | sort -rn | head -20
# IP bazlı başarısız denemeler - brute force tespiti için kritik
grep "auth failed" /var/log/dovecot.log | grep -oP 'rip=K[0-9.]+' | sort | uniq -c | sort -rn | head -20
# Belirli bir kullanıcının auth hatalarını detaylı görmek
grep "[email protected]" /var/log/dovecot.log | grep -i "auth|login|failed"
Gerçek bir senaryodan bahsedeyim: Bir gün sabah erkenden müşteri araması geldi, tüm kullanıcılar mail alamıyor diye. Logları açtığımda şunu gördüm:
2024-01-15 07:23:41 auth: Error: sql([email protected], 192.168.1.50): Password mismatch
2024-01-15 07:23:41 imap-login: Info: Disconnected (auth failed, 1 attempts in 2 secs): user=<[email protected]>, method=PLAIN, rip=192.168.1.50, lip=10.0.0.5
2024-01-15 07:23:45 auth: Fatal: master: service(auth): child 12847 returned error 89
Fatal: master: service(auth): child returned error mesajı gördüğünüzde, auth servisinin çöktüğü anlamına gelir. Bu durumda:
# Auth servis durumunu kontrol et
systemctl status dovecot
# Auth backend'ini kontrol et (SQL, LDAP, passwd-file gibi)
doveadm auth test [email protected] 'sifre123'
# Auth mekanizmalarını listele
doveadm auth login -x service=imap [email protected] 'sifre123'
Bağlantı ve Oturum Sorunları
Kullanıcılar “bağlanıyorum ama mail gelmiyor” ya da “sürekli bağlantı kopuyor” diye şikayet ettiğinde, oturum loglarına bakmanız gerekir.
# Aktif bağlantıları görüntüle
doveadm who
# Belirli bir kullanıcının aktif oturumlarını göster
doveadm who -1 [email protected]
# Son kesilen bağlantıları analiz et
grep "Disconnected" /var/log/dovecot.log | tail -30
# TLS/SSL hatalarını bul
grep -i "ssl|tls|certificate" /var/log/dovecot.log | grep -i "error|warning"
Bağlantı timeout sorunları çok yaygın. Özellikle kurumsal ağlarda firewall’lar idle bağlantıları kesiyor. Bunu şöyle teşhis edebilirsiniz:
# Timeout kaynaklı kesintileri bul
grep "Disconnected.*timeout|disconnected.*inactivity" /var/log/dovecot.log | wc -l
# Hangi client'lardan geldiğini analiz et
grep "Disconnected.*timeout" /var/log/dovecot.log | grep -oP 'rip=K[0-9.]+' | sort | uniq -c | sort -rn
Eğer bir IP’den aşırı timeout görüyorsanız, o istemcinin keepalive ayarlarını gözden geçirmesini tavsiye edin. Sunucu tarafında da şu ayarı yapabilirsiniz:
# /etc/dovecot/conf.d/20-imap.conf
imap_idle_notify_interval = 2 mins
Posta Kutusu ve Depolama Hataları
Mail depolama katmanındaki hatalar genellikle en ciddi sorunlardır çünkü kullanıcıların verilerine erişimini doğrudan etkiler.
# Mailbox erişim hatalarını bul
grep -i "mailbox|mbox|maildir" /var/log/dovecot.log | grep -i "error|failed|unable"
# İzin hatalarını tespit et
grep -i "permission denied|EACCES|EPERM" /var/log/dovecot.log
# Disk doluluğu hatalarını kontrol et
grep -i "ENOSPC|no space|disk full|quota" /var/log/dovecot.log
Gerçek dünya senaryosu: Bir kullanıcı mail gönderip alabiliyordu ama belirli bir klasöre erişemiyordu. Log analizi şunu gösterdi:
imap([email protected]): Error: stat(/home/vmail/example.com/ali/Maildir/.Arsiv) failed: Permission denied
imap([email protected]): Error: Mailbox 'Arsiv': Can't determine UID for mailbox
Çözüm basitti:
# Mail dizininin sahipliğini kontrol et
ls -la /home/vmail/example.com/ali/Maildir/.Arsiv
# Sahipliği düzelt
chown -R vmail:vmail /home/vmail/example.com/ali/Maildir/
chmod -R 700 /home/vmail/example.com/ali/Maildir/
# İndex dosyalarını yeniden oluştur
doveadm force-resync -u [email protected] INBOX
doveadm force-resync -u [email protected] 'Arsiv'
Doveadm: Güçlü Sorun Giderme Aracı
doveadm Dovecot’un İsviçre çakısı gibi bir aracıdır. Log okumakla birlikte kullanıldığında çok güçlü bir kombinasyon oluşturur.
# Kullanıcının posta kutusunu dışarıdan inceleme
doveadm mailbox list -u [email protected]
# Posta kutusundaki mesaj sayılarını gösterme
doveadm mailbox status -u [email protected] "messages unseen recent" INBOX
# Tüm kullanıcıların bağlantı istatistikleri
doveadm stats dump
# Log'daki bir session ID'yi takip etme
# Önce session ID'yi bul
grep "[email protected]" /var/log/dovecot.log | grep -oP 'session=<K[^>]+' | head -5
# Sonra o session'ı detaylı incele
doveadm log find 'abc123sessionid'
# Bağlantıyı zorla kapatma (gerektiğinde)
doveadm kick [email protected]
Performans Sorunları ve Yük Analizi
Sunucu yavaşlamaya başladığında ya da kullanıcılar yavaş mail senkronizasyonundan şikayet ettiğinde, log analizi ile darboğazı bulmak mümkün.
# Uzun süren işlemleri tespit et
grep "running" /var/log/dovecot.log | awk '{print $1, $2, $NF}' | sort -k3 -rn | head -20
# Eş zamanlı bağlantı sayısını hesapla (belirli bir saat için)
grep "2024-01-15 09:" /var/log/dovecot.log | grep "Login:" | wc -l
# En çok bağlanan IP'leri bul
grep "Login:" /var/log/dovecot.log | grep -oP 'rip=K[0-9.]+' | sort | uniq -c | sort -rn | head -20
# Index rebuild işlemlerini takip et (yavaşlığın nedeni olabilir)
grep -i "rebuilding index|resyncing" /var/log/dovecot.log | wc -l
Haftalık log özeti çıkarmak için basit bir script kullanıyorum:
#!/bin/bash
# /usr/local/bin/dovecot-log-summary.sh
LOG_FILE="/var/log/dovecot.log"
YESTERDAY=$(date -d yesterday '+%Y-%m-%d')
echo "=== Dovecot Log Özeti: $YESTERDAY ==="
echo ""
echo "Toplam başarılı giriş sayısı:"
grep "$YESTERDAY" $LOG_FILE | grep "Login:" | wc -l
echo ""
echo "Toplam başarısız giriş sayısı:"
grep "$YESTERDAY" $LOG_FILE | grep "auth failed" | wc -l
echo ""
echo "En çok başarısız giriş yapan IP'ler (Top 10):"
grep "$YESTERDAY" $LOG_FILE | grep "auth failed" | grep -oP 'rip=K[0-9.]+' | sort | uniq -c | sort -rn | head -10
echo ""
echo "Hata sayısı:"
grep "$YESTERDAY" $LOG_FILE | grep -c " Error: "
echo ""
echo "En kritik hatalar:"
grep "$YESTERDAY" $LOG_FILE | grep " Error: " | awk -F'Error: ' '{print $2}' | sort | uniq -c | sort -rn | head -10
# Raporu mail ile gönder (isteğe bağlı)
# | mail -s "Dovecot Günlük Rapor" [email protected]
Bu scripti cron’a ekleyerek her sabah otomatik rapor alabilirsiniz:
# Crontab'a ekle
echo "0 8 * * * root /usr/local/bin/dovecot-log-summary.sh" >> /etc/cron.d/dovecot-report
Debug Modunu Etkinleştirme
Bazı sorunlar normal log seviyesinde görünmez. Geçici olarak debug modunu açmak çok yardımcı olur, ancak üretim ortamında uzun süre açık bırakmayın çünkü hem disk hem de CPU’ya yük biner.
# Dovecot'u geçici debug moduyla yeniden başlat
# Önce mevcut ayarları yedekle
cp /etc/dovecot/conf.d/10-logging.conf /etc/dovecot/conf.d/10-logging.conf.bak
# Debug ayarlarını ekle
cat >> /etc/dovecot/conf.d/10-logging.conf << 'EOF'
auth_verbose = yes
auth_verbose_passwords = sha1
auth_debug = yes
auth_debug_passwords = no
mail_debug = yes
verbose_ssl = yes
EOF
# Dovecot'u yeniden yükle
systemctl reload dovecot
# Debug loglarını takip et
tail -f /var/log/dovecot.log | grep -i "debug"
# Sorunu çözdükten sonra debug modunu kapat
cp /etc/dovecot/conf.d/10-logging.conf.bak /etc/dovecot/conf.d/10-logging.conf
systemctl reload dovecot
Belirli bir kullanıcı için sadece o kullanıcının debug loglarını görmek için:
# Sadece belirli kullanıcı için verbose log
grep -A5 -B5 "[email protected]" /var/log/dovecot-debug.log | tail -50
Logrotate ve Log Yönetimi
Loglar yönetilmezse diskinizi doldurur. Dovecot için logrotate yapılandırması:
# /etc/logrotate.d/dovecot içeriği
cat /etc/logrotate.d/dovecot
# Tipik bir konfigürasyon şöyle görünür:
cat > /etc/logrotate.d/dovecot << 'EOF'
/var/log/dovecot.log
/var/log/dovecot-info.log
/var/log/dovecot-debug.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
postrotate
systemctl reload dovecot > /dev/null 2>&1 || true
endscript
}
EOF
# Logrotate'i test et
logrotate -d /etc/logrotate.d/dovecot
# Eski logları aramak (sıkıştırılmış logları da dahil)
zgrep "[email protected]" /var/log/dovecot.log.*.gz
Güvenlik Olaylarını Tespit Etme
Mail sunucuları her zaman brute force saldırılarının hedefidir. Log analizi ile bu saldırıları erkenden tespit etmek kritik öneme sahip.
# Son 24 saatte en çok başarısız deneme yapan IP'ler
grep "$(date '+%Y-%m-%d')" /var/log/dovecot.log |
grep "auth failed" |
grep -oP 'rip=K[0-9.]+' |
sort | uniq -c | sort -rn |
awk '$1 > 10 {print "UYARI: "$2" adresi "$1" kez başarısız deneme yaptı"}'
# Fail2ban entegrasyonunu kontrol et
fail2ban-client status dovecot
fail2ban-client get dovecot banlist
# Manuel ban ekleme (acil durumlarda)
fail2ban-client set dovecot banip 192.168.100.50
# Dovecot log filtresi için fail2ban filter örneği
cat /etc/fail2ban/filter.d/dovecot.conf
Güvenlik açısından dikkat etmeniz gereken log pattern’leri:
- “auth failed” + aynı IP’den kısa sürede çok sayıda deneme: Brute force saldırısı
- “Aborted login” + “no auth attempts”: Port tarama ya da misconfigure client
- “Too many connections”: Kaynak tüketen bir client veya DDoS
- “SSL: where=0x10, ret=-1”: SSL handshake başarısızlığı, genellikle zararsız ama yoğunsa incelenmeli
Yaygın Hata Mesajları Sözlüğü
Yıllar içinde defalarca karşılaştığım hata mesajları ve anlamları:
- “Maildir: Can’t open maildir”: Posta kutusu dizini yok ya da izin sorunu
- “IMAP capabilities updated”: Normal bilgi mesajı, sorun değil
- “Disconnected: Connection queue full”:
mail_max_connectionslimitine ulaşıldı - “panic: file mail-index.c”: Index dosyası bozuk,
doveadm force-resyncgerekli - “Fatal: Support not compiled in for passdb driver”: Eksik modül, Dovecot yeniden derlenebilir
- “Error: user [email protected]: Initialization failed”: Kullanıcı home dizini erişim sorunu
- “imap(ali): Error: Corrupted index cache file”: Cache yeniden oluşturulmalı
# Bozuk index dosyalarını düzelt
doveadm force-resync -u [email protected] '*'
# Tüm kullanıcılar için toplu resync (dikkatli kullanın!)
for user in $(doveadm user '*'); do
echo "Resync: $user"
doveadm force-resync -u $user '*' 2>/dev/null
done
Sonuç
Dovecot log analizi, mail sunucusu yönetiminin en kritik becerilerinden biridir. Doğru log seviyeleri, düzenli log rotasyonu ve otomatik uyarı scriptleri kurduğunuzda, sorunları kullanıcı şikayet etmeden önce tespit edebilir hale gelirsiniz.
Özetlemek gerekirse dikkat edilmesi gereken temel noktalar:
- Log konumunu ve formatını önceden bilin, sorun anında arama yapmayın
doveadmaracını log analiziyle birlikte kullanın, ikisi birbirini tamamlar- Debug modunu sadece sorun giderme süresince ve dikkatli şekilde açın
- Otomatik log özetleri ve fail2ban entegrasyonu ile reaktif değil proaktif yönetim yapın
- İndex bozulmalarında
force-resynckomutu hayat kurtarır
Mail sunucunuz ne kadar kararlı çalışırsa, gece telefon almak o kadar azalır. Ve inanın bana, bu en değerli metrik.