Mail sunucusu yönetiminde en çok zaman harcanan konuların başında “neden mail gitmiyor?” sorusu gelir. Postfix, aslında oldukça detaylı log tutmasına rağmen bu logları okumak başlangıçta biraz zorlayıcı olabilir. Bu yazıda Postfix log analizini nasıl yapacağınızı, yaygın hataları nasıl tespit edeceğinizi ve gerçek dünya senaryolarıyla sorun giderme süreçlerini ele alacağız.
Postfix Log Dosyaları Nerede?
Postfix logları sisteme göre farklı konumlarda bulunabilir. Çoğu dağıtımda şu yollardan birinde olur:
- Debian/Ubuntu:
/var/log/mail.log - RHEL/CentOS/AlmaLinux:
/var/log/maillog - Systemd tabanlı sistemler:
journalctl -u postfix
Hangi sistemi kullandığınıza bakılmaksızın önce log dosyasını bulun:
# Log dosyasını bul
find /var/log -name "mail*" -o -name "maillog*" 2>/dev/null
# Systemd üzerinden kontrol
journalctl -u postfix --since "1 hour ago"
# Gerçek zamanlı takip
tail -f /var/log/mail.log
Bir Postfix log satırının anatomisini anlamak, analizi çok kolaylaştırır. Tipik bir log satırı şu şekilde görünür:
Mar 15 10:23:41 mailserver postfix/smtp[12345]: ABC123DEF456: to=<[email protected]>, relay=mail.example.com[192.168.1.1]:25, delay=2.3, delays=0.1/0.2/1.8/0.2, dsn=2.0.0, status=sent (250 2.0.0 OK)
Bu satırdaki her alan şu anlama gelir:
- Mar 15 10:23:41: Tarih ve saat
- mailserver: Hostname
- postfix/smtp[12345]: Postfix bileşeni ve process ID
- ABC123DEF456: Mail kuyruk ID’si
- to=: Alıcı adresi
- relay=: Mailin iletildiği sunucu
- delay=: Toplam gecikme süresi (saniye)
- delays=: Gecikmelerin breakdown’u (sıra/gönderim hazırlık/bağlantı/aktarım)
- dsn=: Delivery Status Notification kodu
- status=: sent, deferred veya bounced
Temel Log Analiz Komutları
Günlük sysadmin rutininde kullanabileceğiniz pratik komutlara bakalım:
# Son 1 saatteki başarısız teslimatları say
grep "status=bounced" /var/log/mail.log | grep "$(date '+%b %e')" | wc -l
# Belirli bir alıcıya giden mailleri filtrele
grep "to=<[email protected]>" /var/log/mail.log | tail -20
# Kuyruktaki maillerin durumunu görüntüle
mailq | head -50
# Postfix kuyruk istatistikleri
postqueue -p | tail -1
# Belirli bir queue ID'sini tüm log dosyasında takip et
grep "ABC123DEF456" /var/log/mail.log
Kuyruk ID’si ile takip etmek en değerli tekniklerden biridir. Bir mailin tüm yaşam döngüsünü tek bir ID ile izleyebilirsiniz. Önce kuyrukta bekleyen mailleri görün, sonra ilgili ID için logları filtreleyin.
pflogsumm ile Özet Rapor Oluşturma
pflogsumm, Postfix log dosyalarından detaylı özet raporlar üreten harika bir araçtır. Neredeyse her dağıtımın paket depolarında bulunur:
# Kurulum
apt install pflogsumm # Debian/Ubuntu
yum install postfix-perl-scripts # RHEL/CentOS
# Bugünkü log için özet rapor
pflogsumm /var/log/mail.log
# Dün için rapor
pflogsumm /var/log/mail.log.1
# Son 24 saatin raporu (tarih filtresiyle)
pflogsumm -d yesterday /var/log/mail.log
# Detaylı raporu dosyaya kaydet
pflogsumm /var/log/mail.log > /tmp/mail_report_$(date +%Y%m%d).txt
pflogsumm çıktısı size gönderilen/alınan mail sayısı, hata oranları, en çok mail alan/gönderen domainler ve host bazlı istatistikler gibi bilgileri özetler. Bunu bir cron job ile günlük mail raporu olarak kendinize gönderebilirsiniz.
Yaygın Hata Kodları ve Anlamları
4xx Geçici Hatalar
4xx ile başlayan kodlar geçici hatalar anlamına gelir ve Postfix bu mailleri kuyrukta tutarak yeniden denemeye devam eder.
- 421: Hedef sunucu geçici olarak hizmet dışı
- 450: Posta kutusu geçici olarak kullanılamıyor
- 451: İşlem sırasında yerel hata oluştu
- 452: Yetersiz sistem depolama alanı
- 454: TLS müzakeresi başarısız
5xx Kalıcı Hatalar
5xx kodları kalıcı hatalardır. Mail bounce edilir ve gönderene hata bildirimi gider.
- 500: Sözdizimi hatası
- 501: Parametre sözdizimi hatası
- 502: Komut uygulanmamış
- 503: Hatalı komut sırası
- 550: Posta kutusu bulunamadı veya erişilemiyor
- 551: Kullanıcı bu makinede yok
- 552: Depolama aşıldı
- 553: Posta kutusu adı kabul edilemez
- 554: İşlem başarısız, bağlantı reddedildi
Gerçek Dünya Senaryosu 1: Mail Neden Gitmiyor?
Sabah iş yerine geldiniz, kullanıcılar “mail gönderemiyorum” diyor. İlk yapacağınız şey logları kontrol etmek:
# Son 30 dakikanın hatalarına bak
tail -n 1000 /var/log/mail.log | grep -E "status=(bounced|deferred)" | tail -30
# Hangi hata ne sıklıkta çıkıyor?
grep "$(date '+%b %e')" /var/log/mail.log | grep -oP 'status=w+' | sort | uniq -c | sort -rn
Diyelim ki şu çıktıyı gördünüz:
Mar 15 09:45:12 mailserver postfix/smtp[9876]: XYZABC123456: to=<[email protected]>, relay=none, delay=0.5, delays=0.4/0.1/0/0, dsn=5.4.4, status=bounced (Host or domain name not found. Name service error for name=bigcorp.com type=MX: Host not found, try again)
Bu DNS çözümleme sorunu. Hızlıca kontrol edin:
# DNS çözümlemesini test et
host -t MX bigcorp.com
dig MX bigcorp.com
# Postfix'in DNS kullandığını doğrula
postconf inet_protocols
postconf smtp_dns_support_level
# /etc/resolv.conf'u kontrol et
cat /etc/resolv.conf
# Postfix'in kendi resolver ayarlarını kontrol et
postconf -n | grep dns
Eğer DNS sorunu Postfix’e özgüyse ve sistem genelinde çalışıyorsa, smtpd_tls_loglevel ve benzeri ayarlar da dahil olmak üzere Postfix’in network bağlantısını test edin:
# Postfix'ten manuel SMTP testi
postfix-smtp-test() {
echo "EHLO test" | openssl s_client -connect mail.example.com:587 -starttls smtp 2>/dev/null
}
# Veya daha basit şekilde
telnet mail.bigcorp.com 25
Gerçek Dünya Senaryosu 2: Spam Kara Listesine Düşme
En sık karşılaşılan durumlardan biri, sunucunuzun spam kara listelerine (RBL – Real-time Blackhole List) girmesidir. Log’da şöyle bir hata görürsünüz:
Mar 15 11:30:55 mailserver postfix/smtp[11111]: ABC999DEF111: to=<[email protected]>, relay=gmail-smtp-in.l.google.com[64.233.160.27]:25, delay=8.2, delays=0.1/0.2/7.6/0.3, dsn=5.7.1, status=bounced (host gmail-smtp-in.l.google.com[64.233.160.27] said: 550-5.7.1 [203.0.113.10] The IP you're trying to send mail from has been blocked (in reply to MAIL FROM command))
Bu durumda yapmanız gerekenler:
# IP adresinizi öğrenin
curl -s ifconfig.me
# veya
postconf inet_interfaces
# Kara liste kontrolü için araçlar
# mxtoolbox.com, multirbl.valli.org gibi sitelerden kontrol edin
# Komut satırından RBL sorgusu:
MAIL_IP="203.0.113.10"
REVERSED_IP=$(echo $MAIL_IP | awk -F'.' '{print $4"."$3"."$2"."$1}')
# Spamhaus kontrolü
host ${REVERSED_IP}.zen.spamhaus.org
# Barracuda kontrolü
host ${REVERSED_IP}.b.barracudacentral.org
# Son 24 saatte dışarıya ne kadar mail gönderilmiş?
grep "$(date '+%b %e')" /var/log/mail.log | grep "status=sent" | wc -l
grep "$(date '+%b %e')" /var/log/mail.log | grep "postfix/smtp" | grep "status=sent" | awk '{print $7}' | sort | uniq -c | sort -rn | head -20
Kara listeye düşmenizin sebebini bulmak için spam gönderen hesabı tespit etmeniz gerekir:
# Hangi from adresleri en çok mail gönderiyor?
grep "$(date '+%b %e')" /var/log/mail.log | grep "from=" | grep -oP 'from=<[^>]+>' | sort | uniq -c | sort -rn | head -20
# Saatlik mail gönderim trendi (ani artış var mı?)
grep "status=sent" /var/log/mail.log | grep "$(date '+%b %e')" | awk '{print $3}' | cut -d: -f1 | sort | uniq -c
Gerçek Dünya Senaryosu 3: TLS Sorunları
Günümüzde TLS şifrelemesi neredeyse zorunlu hale geldi. TLS ile ilgili hataları logda tanımak önemli:
# TLS hatalarını filtrele
grep -i "tls|ssl|certificate" /var/log/mail.log | grep -i "error|fail|warn" | tail -20
# TLS log seviyesini geçici olarak artır
postconf -e "smtpd_tls_loglevel=2"
postconf -e "smtp_tls_loglevel=2"
postfix reload
# Sertifika geçerlilik tarihini kontrol et
openssl x509 -in /etc/ssl/certs/mail.crt -noout -dates
# Postfix'in hangi sertifikayı kullandığını kontrol et
postconf smtpd_tls_cert_file
postconf smtpd_tls_key_file
# TLS bağlantısını test et
openssl s_client -connect localhost:587 -starttls smtp
openssl s_client -connect localhost:465
Sertifika süresi dolmuşsa hata şöyle görünür:
Mar 15 14:22:10 mailserver postfix/smtpd[22222]: SSL_accept error from client.example.com[192.168.1.100]: -1
Mar 15 14:22:10 mailserver postfix/smtpd[22222]: warning: TLS library problem: error:14094416:SSL routines:ssl3_read_bytes:sslv3 alert certificate unknown
Log Analizi için Özel Script Yazma
Günlük kontrolleri için basit ama etkili bir bash scripti hazırlayın:
#!/bin/bash
# /usr/local/bin/mail-health-check.sh
LOG_FILE="/var/log/mail.log"
TODAY=$(date '+%b %e')
HOSTNAME=$(hostname)
ALERT_THRESHOLD=50 # Bounce sayısı bu değeri geçerse uyar
echo "=== Mail Sunucusu Sağlık Raporu ==="
echo "Tarih: $(date)"
echo "Sunucu: $HOSTNAME"
echo ""
# Gönderim istatistikleri
SENT=$(grep "$TODAY" $LOG_FILE | grep "status=sent" | wc -l)
DEFERRED=$(grep "$TODAY" $LOG_FILE | grep "status=deferred" | wc -l)
BOUNCED=$(grep "$TODAY" $LOG_FILE | grep "status=bounced" | wc -l)
REJECTED=$(grep "$TODAY" $LOG_FILE | grep "NOQUEUE: reject" | wc -l)
echo "Bugünkü İstatistikler:"
echo " Gönderilen: $SENT"
echo " Geciktirilen (Deferred): $DEFERRED"
echo " Bounce: $BOUNCED"
echo " Reddedilen: $REJECTED"
echo ""
# Kuyruk durumu
QUEUE_SIZE=$(postqueue -p | tail -1 | awk '{print $5}')
echo "Kuyruk Durumu:"
echo " Bekleyen mail sayısı: ${QUEUE_SIZE:-0}"
echo ""
# En çok hata veren domainler
echo "En Çok Bounce Alan İlk 5 Domain:"
grep "$TODAY" $LOG_FILE | grep "status=bounced" | grep -oP 'to=<[^@]+@K[^>]+' | sort | uniq -c | sort -rn | head -5
# Uyarı kontrolü
if [ "$BOUNCED" -gt "$ALERT_THRESHOLD" ]; then
echo ""
echo "UYARI: Bounce sayısı ($BOUNCED) eşik değerini ($ALERT_THRESHOLD) aştı!"
echo "Son bounce hatalarından örnekler:"
grep "$TODAY" $LOG_FILE | grep "status=bounced" | tail -5
fi
Bu scripti cron ile her sabah çalıştırın:
chmod +x /usr/local/bin/mail-health-check.sh
# Her gün sabah 08:00'de çalıştır ve sonucu mailet
echo "0 8 * * * root /usr/local/bin/mail-health-check.sh | mail -s 'Mail Sunucu Raporu' [email protected]" >> /etc/crontab
Postfix Kuyruk Yönetimi
Sorun giderme sırasında kuyruk yönetimi çok kritik:
# Kuyruktaki tüm mailleri listele
postqueue -p
# Belirli bir maili kuyruğa bak
postcat -q QUEUEID
# Kuyruktaki tüm mailleri hemen yeniden dene
postqueue -f
# Belirli bir maili kuyruğa sil
postsuper -d QUEUEID
# Tüm deferred mailleri sil (dikkatli kullanın!)
postsuper -d ALL deferred
# Belirli bir alıcıya giden tüm mailleri sil
postqueue -p | grep "[email protected]" | awk '{print $1}' | postsuper -d -
# Kuyruğu yeniden işle (hold kuyruğundan aktif kuyruğa al)
postsuper -H ALL # Hold'a al
postsuper -r ALL # Requeue yap
Log Rotasyonu ve Arşivleme
Postfix logları hızla büyüyebilir. Logrotate ile bunu yönetin:
# /etc/logrotate.d/postfix dosyasını kontrol et
cat /etc/logrotate.d/postfix
# Tipik bir logrotate konfigürasyonu
cat > /etc/logrotate.d/mail-custom << 'EOF'
/var/log/mail.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 0640 syslog adm
sharedscripts
postrotate
/usr/lib/rsyslog/rsyslog-rotate
endscript
}
EOF
# Arşivlenmiş logları analiz et
zgrep "status=bounced" /var/log/mail.log.2.gz | wc -l
# Tüm arşivlerdeki bounce sayısını topla
for f in /var/log/mail.log*; do
if [[ $f == *.gz ]]; then
COUNT=$(zgrep -c "status=bounced" "$f" 2>/dev/null)
else
COUNT=$(grep -c "status=bounced" "$f" 2>/dev/null)
fi
echo "$f: $COUNT bounce"
done
Performans Sorunlarını Tespit Etme
Mail gönderimi yavaşladığında gecikme analizine bakmanız gerekir:
# Yüksek gecikmeli mailleri bul (10 saniyeden uzun)
grep "status=sent" /var/log/mail.log | awk -F'delay=' '{print $2}' | awk '{print $1}' | awk -F',' '{print $1}' | awk '$1 > 10 {print}' | sort -n | tail -20
# Ortalama teslimat süresini hesapla
grep "status=sent" /var/log/mail.log | grep "$(date '+%b %e')" | grep -oP 'delay=K[d.]+' | awk '{sum+=$1; count++} END {if(count>0) print "Ortalama gecikme:", sum/count, "saniye, Toplam mail:", count}'
# Hangi hedef sunucular yavaş?
grep "status=sent" /var/log/mail.log | grep "$(date '+%b %e')" | grep -oP 'relay=K[^[]+' | sort | uniq -c | sort -rn | head -10
Güvenlik Açısından Log Analizi
Mail sunucusu güvenliği açısından bazı kritik durumları loglardan takip etmek gerekir:
# Brute force girişimlerini tespit et
grep "authentication failed" /var/log/mail.log | grep "$(date '+%b %e')" | grep -oP 'from=K[^s]+' | sort | uniq -c | sort -rn | head -20
# SASL authentication hatalarını say
grep "warning: .*SASL" /var/log/mail.log | grep "$(date '+%b %e')" | wc -l
# Açık relay denemeleri
grep "Relay access denied" /var/log/mail.log | tail -20
# Şüpheli yüksek hacimli gönderim tespiti
grep "postfix/smtp" /var/log/mail.log | grep "$(date '+%b %e')" | grep -oP 'from=<[^>]+>' | sort | uniq -c | sort -rn | head -10
Eğer bir IP adresinden sürekli brute force geliyorsa fail2ban ile bunu otomatik bloke edebilirsiniz. Postfix için fail2ban filter dosyası zaten çoğu kurulumda hazır gelir:
# fail2ban postfix filter durumunu kontrol et
fail2ban-client status postfix
# Son bloke edilen IP'leri gör
fail2ban-client status postfix-sasl
# Manuel olarak bir IP'yi bloke et
fail2ban-client set postfix-sasl banip 192.168.1.100
Sonuç
Postfix log analizi, mail sunucusu yönetiminin en kritik becerilerinden biridir. Özetlemek gerekirse:
- Kuyruk ID’si ile takip, bir mailin tüm yaşam döngüsünü görmenizi sağlar
- pflogsumm gibi araçları düzenli kullanın ve günlük raporlar oluşturun
- 4xx ve 5xx hata kodlarını ezberlemek zorunda değilsiniz ama genel mantığını bilin
- Özel izleme scriptleri yazın ve kritik metrikleri otomatik takip edin
- Log rotasyonu ihmal etmeyin, büyük log dosyaları hem disk hem de analiz performansını etkiler
- Güvenlik açısından brute force ve açık relay denemelerini düzenli kontrol edin
Mail sorunları genellikle panikle başlar ama sistematik log analizi ile çoğu sorun birkaç dakikada çözülür. Postfix’in ürettiği loglar yeterince detaylıdır, önemli olan hangi bileşenin ne söylediğini anlamak ve doğru sorguları oluşturmaktır. Yukarıdaki komutları bir “runbook” dosyasına kaydedin, bir sonraki “mail gitmiyor” vakasında çok işinize yarayacak.