Exim Log Okuma: Teşhis ve Sorun Giderme

Mail sunucusu sorunlarıyla uğraşmak, özellikle müşteri “mailim gitmiyor” diye arıyorsa, oldukça stresli olabiliyor. Exim, cPanel/WHM tabanlı sunucularda ve birçok Linux dağıtımında varsayılan MTA olarak kullanıldığından, log dosyalarını okumayı öğrenmek bir sysadmin için vazgeçilmez bir beceri. Bu yazıda Exim loglarını nasıl okuyacağınızı, ne arayacağınızı ve karşılaştığınız sorunları nasıl çözeceğinizi adım adım ele alacağız.

Exim Log Dosyaları Nerede?

İlk adım, log dosyalarının nerede olduğunu bilmek. Sisteme ve kuruluma göre farklılık gösterebilir:

  • /var/log/exim/mainlog: Ana işlem logu, en çok kullandığınız yer
  • /var/log/exim/rejectlog: Reddedilen mesajlar
  • /var/log/exim/paniclog: Kritik hatalar, Exim’in çöktüğü durumlar
  • /var/log/exim4/mainlog: Debian/Ubuntu sistemlerde
  • /var/log/exim_mainlog: cPanel sunucularda

cPanel sunucusundaysanız şunu çalıştırın:

ls -la /var/log/exim_mainlog*

Eğer log rotation aktifse eski loglar .1, .2 gibi uzantılarla veya gzip sıkıştırılmış halde bulunur. Sıkıştırılmış loglarda arama yapmak için zgrep kullanabilirsiniz.

Log Satırı Anatomisi

Bir Exim log satırını ilk gördüğünüzde karmaşık gelebilir. Ama aslında oldukça düzenli bir yapısı var. Şöyle bir satıra bakalım:

2024-01-15 09:23:41 1rJkXm-0003kl-Qp <= [email protected] H=mail.example.com [192.168.1.10] P=esmtps X=TLS1.3:ECDHE-RSA-AES256-GCM-SHA384:256 S=2847 id=<[email protected]> T="Test maili" for [email protected]

Bu satırı parçalara ayıralım:

  • 2024-01-15 09:23:41: Zaman damgası
  • 1rJkXm-0003kl-Qp: Mesaj ID’si, her işlemi takip etmek için bu ID’yi kullanırsınız
  • <=: Mail teslim alındı (inbound)
  • [email protected]: Gönderici
  • H=mail.example.com: Bağlanan sunucunun hostname’i
  • [192.168.1.10]: Bağlanan sunucunun IP adresi
  • P=esmtps: Kullanılan protokol
  • S=2847: Mesaj boyutu (byte)
  • T=”Test maili”: Konu satırı

Temel operatörler şunlar:

  • <=: Mail kabul edildi (alındı)
  • =>: Mail başarıyla teslim edildi
  • ->: Aynı mesajın ek bir kopyası teslim edildi
  • : Kalıcı hata, mail teslim edilemedi
  • ==: Geçici hata, mail kuyruğa alındı, tekrar denenecek

Mesaj ID ile Takip Etmek

Bir mailin hayatını takip etmenin en pratik yolu mesaj ID’sini kullanmak. Diyelim ki bir kullanıcı “falanca maili gönderdim ama gitmiyor” dedi. Önce o maili logda bulmanız lazım.

grep "1rJkXm-0003kl-Qp" /var/log/exim_mainlog

Bu komut o mesaja ait tüm satırları listeler. Mesajın alınmasından teslim edilmesine kadar tüm adımları görebilirsiniz. Eğer mesaj ID’sini bilmiyorsanız gönderici veya alıcı adresine göre arama yapabilirsiniz:

grep "[email protected]" /var/log/exim_mainlog | tail -50

cPanel’de bunu kolaylaştıran bir araç var:

exigrep "[email protected]" /var/log/exim_mainlog

exigrep komutu, aradığınız ifadeyle ilgili tüm mesajları, o mesaja ait tüm log satırlarıyla birlikte getirir. Tek bir grep satırı yerine komple mesaj hikayesini görürsünüz. Bu çok işe yarıyor.

Gerçek Dünya Senaryosu 1: Mail Gitmiyor

Müşteri arıyor, “Sabahtan beri mail gönderemiyorum” diyor. Klasik senaryo. Önce son bir saatteki hataları görelim:

grep "$(date -d '1 hour ago' '+%Y-%m-%d %H')" /var/log/exim_mainlog | grep "**"

Bu komut son bir saatteki kalıcı hataları filtreler. Eğer çok fazla sonuç geliyorsa belirli bir domain’e odaklanabilirsiniz:

grep "[email protected]" /var/log/exim_mainlog | grep -E "(**|==)"

Şöyle bir satır görürseniz:

2024-01-15 10:45:22 1rJkXm-0003kl-Qp ** [email protected] R=dnslookup T=remote_smtp: SMTP error from remote mail server after RCPT TO:<[email protected]>: 550 5.1.1 The email account that you tried to reach does not exist

Burada ** kalıcı hata ve hata mesajı “email hesabı mevcut değil” diyor. Yani sorun karşı tarafta, mail adresi yanlış veya silinmiş. Bu durumda yapabileceğiniz bir şey yok, kullanıcıya doğru adresi kontrol etmesini söylersiniz.

Gerçek Dünya Senaryosu 2: Kuyruk Birikmiyor mu?

Bazen mailler gitmez ama hata da vermez, kuyruğa takılır. Kuyruk durumunu görmek için:

exim -bp

Bu komut mevcut mail kuyruğunu listeler. Eğer kuyruğa takılmış yüzlerce mail görüyorsanız bir sorun var demektir. Takılmış bir mesajın neden kuyruğa girdiğini anlamak için:

exim -Mvl MESAJ_ID

Daha ayrıntılı log için:

exim -Mvc MESAJ_ID

Bu komut mesajın içeriğini, başlıklarını ve neden beklemede olduğunu gösterir. Genellikle geçici DNS hatası, karşı sunucunun geçici olarak erişilememesi veya greylisting nedeniyle beklemede olduğunu görürsünüz. == operatörünü içeren satirlar şunu söyler: “Şimdi göndermedim, tekrar deneyeceğim.”

Kimlik Doğrulama Hatalarını Bulmak

Spam göndericiler veya yanlış yapılandırılmış mail istemcileri authentication hatası üretir. Bu hataları bulmak için:

grep "authenticator" /var/log/exim_mainlog | grep -i "fail|reject|denied" | tail -20

Şöyle bir çıktı görürsünüz:

2024-01-15 11:02:33 1rJm2k-0007ab-Lx authenticator failed for ([192.168.1.55] helo=Windows-PC): 535 Incorrect authentication data ([email protected])

Bu, [email protected] için yanlış şifre girildiğini gösterir. Eğer aynı IP’den çok fazla böyle hata görüyorsanız brute-force saldırısı olabilir. IP’ye göre gruplamak için:

grep "authenticator failed" /var/log/exim_mainlog | grep -oP '[([0-9]{1,3}.){3}[0-9]{1,3}]' | sort | uniq -c | sort -rn | head -20

Bu komut authentication hatalarını IP adresine göre gruplar ve en çok hata yapan IP’leri sıralar. 50’den fazla deneme yapan bir IP varsa o IP’yi firewall’da bloklayın.

Spam ve Relay Sorunları

“Sunucunuz spam gönderiyor” şikayeti her sysadmin’in korkulu rüyasıdır. Bunu tespit etmek için önce hangi hesaptan gönderim yapıldığını bulmanız lazım:

grep "<=" /var/log/exim_mainlog | grep -v "localhost|127.0.0.1" | awk '{print $6}' | sort | uniq -c | sort -rn | head -20

Bu komut son maillerin gönderenlerini listeler ve en çok gönderen adresleri sıralar. Normal bir durumda belirli bir adresin yüzlerce mail göndermesi şüphelidir.

Belirli bir IP’den gelen tüm gönderileri görmek için:

grep "H=.*[192.168.1.100]" /var/log/exim_mainlog | grep "<=" | wc -l

Eğer bir IP’den kısa sürede binlerce mail geldiyse o IP compromised olmuş olabilir. Hemen bloklayın ve ilgili hesabın şifresini değiştirin.

Open relay kontrolü yapmak için dışarıdan test edebilirsiniz ama önce log’da şüpheli relay girişimlerini arayın:

grep "relay not permitted|Relay not permitted" /var/log/exim_mainlog | tail -30

Eğer bu hataları görüyorsanız sisteminiz relay denemelerini engelliyor demektir, iyi. Ama bu hataları hiç görmüyorsanız ve dışarıdan relay testi yapıyorsanız dikkatli olun.

Bounce ve NDR Analizi

Geri dönen mailler (bounce), posta yönetiminin önemli bir parçası. Bounce mesajları genellikle /var/mail/ altında veya özel bir bounce adreste toplanır. Log’da bounce durumlarını görmek için:

grep "bounce" /var/log/exim_mainlog | tail -30

Kalıcı bounce (hard bounce) ile geçici bounce (soft bounce) arasındaki farkı anlamak önemli:

# Hard bounce - 5xx kodları
grep "**" /var/log/exim_mainlog | grep "5[0-9][0-9]" | tail -20

# Soft bounce - 4xx kodları  
grep "==" /var/log/exim_mainlog | grep "4[0-9][0-9]" | tail -20

5xx hataları kalıcı, 4xx hatalar geçici. 422, 450, 452 gibi kodlar geçici sorunlara işaret eder ve Exim bunları otomatik olarak tekrar deneyecektir. 550, 551, 553 ise kalıcı hatalardır.

TLS ve Güvenlik Sorunları

Günümüzde TLS olmadan mail göndermek neredeyse imkansız hale geldi. TLS el sıkışma hatalarını bulmak için:

grep -i "TLS error|SSL error|certificate|handshake" /var/log/exim_mainlog | tail -30

Şöyle bir hata görürseniz:

2024-01-15 14:22:11 TLS error on connection from mail.suspect.com [203.0.113.45] (SSL_accept): error:14094416:SSL routines:ssl3_read_bytes:sslv3 alert certificate unknown

Bu, karşı tarafın sertifikanızı tanımadığı anlamına gelir. Sertifikanızın güncel olup olmadığını kontrol edin:

openssl s_client -connect localhost:465 -quiet 2>&1 | head -20

Sertifika süresi dolmuşsa hemen yenilemeniz gerekiyor. Let’s Encrypt kullanıyorsanız:

certbot renew --dry-run

DKIM, SPF ve DMARC Logları

Mail deliverability sorunlarının büyük kısmı DKIM/SPF/DMARC kaynaklıdır. Exim bu konuda log tutabilir ama yapılandırma gerekebilir. Mevcut durumu görmek için:

grep -i "dkim|spf|dmarc" /var/log/exim_mainlog | tail -30

DKIM imza hatalarını görmek için:

grep -i "dkim.*fail|dkim.*invalid|dkim.*error" /var/log/exim_mainlog

Eğer DKIM ile ilgili hiç log göremiyorsanız, Exim’in DKIM logging’i aktif olmayabilir. cPanel sistemlerinde DKIM durumunu kontrol etmek için:

exim -bV 2>&1 | grep -i dkim

Gerçek Dünya Senaryosu 3: Belirli Bir Domain’e Mail Gitmiyor

Kullanıcı “gmail’e mail gönderiyorum ama gitmiyor” diyor. Bu çok yaygın bir şikayet. Gmail, Yahoo gibi büyük providerlar çok katı filtrelere sahip.

grep "gmail.com" /var/log/exim_mainlog | grep -E "(**|==)" | tail -20

Şöyle bir hata görürsünüz muhtemelen:

2024-01-15 15:30:45 1rJpQr-0002mn-Xv ** [email protected] R=dnslookup T=remote_smtp: SMTP error from remote mail server after MAIL FROM:<[email protected]> SIZE=1234: 550-5.7.26 This mail is unauthenticated, which poses a

Bu durumda SPF, DKIM veya DMARC ayarlarınız eksik ya da yanlış demektir. DNS kayıtlarınızı kontrol edin:

dig TXT yourdomain.com | grep -i "v=spf"
dig TXT _dmarc.yourdomain.com
dig TXT default._domainkey.yourdomain.com

Üç kayıt da düzgün görünüyorsa Google Postmaster Tools’a bakın, IP reputasyonunuz düşmüş olabilir.

Log’dan İstatistik Çıkarmak

Günlük/saatlik mail trafiğini görmek, anomali tespiti açısından önemli. Saate göre mail sayısını görmek için:

grep "<=" /var/log/exim_mainlog | grep "$(date '+%Y-%m-%d')" | awk '{print $2}' | cut -d: -f1 | sort | uniq -c

Bu komut bugünkü günlüğü saate göre gruplar ve her saatte kaç mail alındığını gösterir. Eğer gece 3’te anormal bir spike görüyorsanız araştırmanız gerekiyor.

Gün içindeki hata oranını görmek için:

echo "Toplam mail:"; grep "<=" /var/log/exim_mainlog | grep "$(date '+%Y-%m-%d')" | wc -l
echo "Kalici hatalar:"; grep "**" /var/log/exim_mainlog | grep "$(date '+%Y-%m-%d')" | wc -l
echo "Gecici hatalar:"; grep "==" /var/log/exim_mainlog | grep "$(date '+%Y-%m-%d')" | wc -l

Paniclog’u Asla Atlamayın

paniclog dosyası genellikle görmezden gelinir ama aslında kritik bilgiler içerir. Exim bir şeyleri çok yanlış bulduğunda buraya yazar:

cat /var/log/exim/paniclog
# veya cPanel için
cat /var/log/exim_paniclog

Eğer bu dosya boş değilse ciddi bir sorun var demektir. Tipik paniclog girişleri şunlardır:

  • Veritabanı bağlantı hataları
  • Konfigürasyon dosyasındaki sözdizimi hataları
  • Disk alanı dolması
  • Process başlatma hataları

Exim konfigürasyonunu test etmek için:

exim -bV
exim -C /etc/exim.conf -bV

Rejectlog Analizi

rejectlog dosyası, Exim’in reddettiği bağlantıları kaydeder. Spam girişimlerini, geçersiz domain bağlantılarını ve politika ihlallerini burada görebilirsiniz:

tail -100 /var/log/exim/rejectlog

Kara listeye (blacklist/RBL) alınmış IP’lerden gelen bağlantıları görmek için:

grep -i "rbl|blacklist|dnsbl|spamhaus|barracuda" /var/log/exim/rejectlog | tail -20

Eğer kendi sunucu IP’niz blacklist’e alınmışsa, önce spam kaynağını temizleyin, sonra ilgili blacklist sağlayıcısından delisting isteyin.

Pratik Araçlar ve Kısayollar

Günlük kullanım için işinize yarayacak bazı komutlar:

# Son 100 maili izle (canlı)
tail -f /var/log/exim_mainlog

# Sadece hataları canlı izle
tail -f /var/log/exim_mainlog | grep -E "(**|panic|error)"

# Bugünkü teslim başarı oranı
SUCCESS=$(grep "=>" /var/log/exim_mainlog | grep "$(date '+%Y-%m-%d')" | wc -l)
FAIL=$(grep "**" /var/log/exim_mainlog | grep "$(date '+%Y-%m-%d')" | wc -l)
echo "Basarili: $SUCCESS, Basarisiz: $FAIL"

# Kuyrukta bekleyen mail sayisi
exim -bpc

# Tum kuyrugu temizle (dikkatli kullanin!)
# exim -bp | awk '/^ *[0-9]+[mhd]/{print "exim -Mrm " $3}' | bash

Bu son komutu çalıştırmadan önce defalarca düşünün. Tüm kuyruğu silmek geri alınamaz.

Log Rotasyonu ve Arşivleme

Uzun süreli sorun takibi için eski loglara da bakmanız gerekebilir. Log rotation genellikle daily ayarlıdır ve eski loglar sıkıştırılır:

# Sıkıştırılmış logda arama
zgrep "[email protected]" /var/log/exim_mainlog.1.gz

# Tum log dosyalarinda arama (hem aktif hem arsiv)
for f in /var/log/exim_mainlog*; do
    echo "--- $f ---"
    if [[ $f == *.gz ]]; then
        zgrep "aradiginiz_ifade" $f
    else
        grep "aradiginiz_ifade" $f
    fi
done

Sonuç

Exim loglarını okumak başta zor görünse de biraz pratikle çok hızlı hale geliyor. En önemli nokta, mesaj ID’si ile takip etmeyi alışkanlık haline getirmek. Bir sorun geldiğinde önce ilgili mesaj ID’sini bulun, sonra o ID ile tüm log’u tarayın. Böylece mailin tam olarak nerede takıldığını görebilirsiniz.

Özetleyecek olursak dikkat etmeniz gereken başlıca noktalar şunlar:

  • işareti**: Kalıcı hata, o mail asla gitmeyecek, kullanıcıyı bilgilendirin
  • == işareti: Geçici hata, Exim tekrar deneyecek, birkaç saat bekleyin
  • paniclog: Boş olmalı, doluysa acil müdahale gerekli
  • Authentication hataları: Brute-force veya yanlış ayarlanmış istemci
  • TLS hataları: Sertifika sorunu olabilir, kontrol edin
  • Kuyruğun birikmesi: DNS sorunu, karşı sunucu kapalı veya blacklist’e alınmış olabilirsiniz

Mail sunucusu yönetimi hiçbir zaman tamamen sorunsuz olmaz. Ama logları düzgün okuyabilirseniz sorunları çok daha hızlı çözersiniz ve “neden gitmiyor” sorusuna somut bir cevap verebilirsiniz. Bu da hem sizin hem de kullanıcının hayatını kolaylaştırır.

Benzer Konular

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir