Exim ile Backup MX Yapılandırması

Mail altyapısında tek nokta arızası (single point of failure) her zaman en büyük kabuslardan biridir. Bir sabah birincil mail sunucunuzun çöktüğünü, saatlerdir mail alamadığınızı ve müşterilerinizin “maillerim nereye gitti?” diye aradığını düşünün. İşte tam bu senaryoyu önlemek için Backup MX yapılandırması hayat kurtarıcı hale gelir. Exim ile bu yapılandırmayı doğru şekilde kurmak, mail akışınızın kesintisiz devam etmesini sağlar.

Backup MX Nedir ve Neden Gereklidir?

Backup MX, birincil mail sunucunuz erişilemez olduğunda gelen mailleri geçici olarak depolayan ve birincil sunucu yeniden devreye girdiğinde bu mailleri ileten ikincil (veya üçüncül) mail sunucusudur. DNS’te MX kayıtlarının öncelik değerleri (priority) bu sistemi yönetir.

Gerçek dünyadan bir senaryo: Bir e-ticaret firmasının mail sunucusu kernel güncellemesi sonrası yeniden başlatma gerekti. Planlı bakım penceresi 2 saat olarak belirlenmişti ama beklenmedik bir disk sorunu çıkıp bu süre 6 saate uzadı. Backup MX olmadığı için gönderici sunucular bu 6 saat boyunca tekrar denedi, bir kısmı “geçici hata” döndürdü ama bazı kurumsal mail sunucuları 3 denemeden sonra mail’i reddetti. Backup MX olsaydı bu maillerIn hiçbiri kaybolmazdı.

MX Öncelik Değerleri

DNS’te MX kayıtları şu şekilde çalışır:

  • Düşük öncelik değeri (örn. 10): Birincil sunucu, ilk tercih
  • Yüksek öncelik değeri (örn. 20, 30): Yedek sunucular, birincil erişilemez olduğunda devreye girer
  • Gönderici sunucu, düşük değerli MX’e bağlanamadığında sıradaki yüksek değerli MX’i dener

Exim’in Backup MX Rolü

Exim’i backup MX olarak yapılandırmak, onu hem bir relay (aktarma) hem de geçici depolama sunucusu olarak çalıştırmak anlamına gelir. Temel görevler şunlardır:

  • Birincil sunucu çevrimdışıyken gelen mailleri kabul etmek
  • Mailleri kuyruğa alarak saklamak
  • Birincil sunucu yeniden erişilebilir olduğunda bekleyen mailleri iletmek
  • Spam ve kötü niyetli trafiği filtrelemek (opsiyonel ama önerilen)

Ön Hazırlık ve DNS Yapılandırması

DNS MX Kayıtları

Önce DNS tarafını düzgün kurmak gerekir. Zone dosyanıza şu kayıtları ekleyin:

; Birincil MX - düşük öncelik değeri = yüksek öncelik
example.com.    IN  MX  10  mail1.example.com.
; Backup MX - yüksek öncelik değeri = düşük öncelik (yedek)
example.com.    IN  MX  20  mail2.example.com.
; İkinci yedek (opsiyonel)
example.com.    IN  MX  30  mail3.example.com.

; A kayıtları
mail1.example.com.  IN  A  203.0.113.10
mail2.example.com.  IN  A  203.0.113.20

DNS değişikliklerinin yayılmasını beklerken (dig MX example.com ile kontrol edebilirsiniz) Exim yapılandırmasına geçebilirsiniz.

Reverse DNS (PTR) Kaydı

Backup MX sunucusunun IP adresi için de PTR kaydı tanımlanmalıdır. Birçok mail sunucusu PTR kaydı olmayan sunuculardan gelen mailleri reddeder:

# PTR kaydını kontrol et
dig -x 203.0.113.20 +short
# Beklenen çıktı: mail2.example.com.

# Veya host komutuyla
host 203.0.113.20

Exim Kurulumu ve Temel Yapılandırma

Debian/Ubuntu üzerinde Exim kurulumu:

apt update
apt install exim4 exim4-daemon-heavy

# Heavy daemon önemli: daha gelişmiş özellikler (content scanning, dkim vb.) içerir
# Yapılandırma dizini
ls /etc/exim4/

CentOS/RHEL üzerinde:

dnf install exim
systemctl enable exim
systemctl start exim

Exim Yapılandırma Dosyası Yapısı

Exim’in ana yapılandırma dosyası /etc/exim4/exim4.conf.template (Debian) veya /etc/exim4/exim4.conf (RHEL) üzerindedir. Debian split-config yapısı kullanıyorsa /etc/exim4/conf.d/ altında ayrı dosyalar bulunur. Biz monolitik yapılandırma üzerinden gideceğiz çünkü daha kolay yönetilir:

# Debian'da update-exim4.conf ile monolitik yapılandırma oluşturabilirsiniz
# ya da direkt /etc/exim4/exim4.conf dosyasını düzenleyin
cp /etc/exim4/exim4.conf /etc/exim4/exim4.conf.bak

Backup MX için Exim Yapılandırması

Ana Parametreler

/etc/exim4/exim4.conf dosyasının başına genel ayarları koyun:

# Temel kimlik ayarları
primary_hostname = mail2.example.com
domainlist local_domains = @ : localhost
domainlist relay_to_domains = example.com : example.org

# Backup MX olarak relay yapacağımız domainler
# Bu alan çok önemli - sadece yetkili olduğunuz domainler olmalı
hostlist relay_from_hosts = 127.0.0.1 : ::1

# Dinlenecek arayüzler
local_interfaces = 0.0.0.0

# Kuyruk yönetimi - backup MX için kritik
queue_only_on_queue = false
# Birincil sunucu down olduğunda mailleri kuyruğa al
queue_run_max = 5

# Yeniden deneme süresi (birincil sunucu erişilemezse ne kadar bekle)
# Default değerler çoğu zaman yeterli ama fine-tune etmek gerekebilir

Backup MX Router Yapılandırması

Exim’de router’lar mailin nasıl yönlendirileceğini belirler. Backup MX rolü için özel bir router tanımlaması gerekir:

begin routers

# Backup MX router - birincil sunucuya ilet
backup_mx_route:
  driver = manualroute
  domains = ! +local_domains
  # Sadece relay_to_domains listesindekiler için geçerli
  transport = remote_smtp
  route_list = example.com  mail1.example.com::25 ; 
               example.org  mail1-alt.example.com::25
  # Birincil sunucu down olsa kuyrukta beklet
  cannot_route_message = Birincil mail sunucusuna ulasilamiyor, 
                         mail kuyruga alindi
  # Host bulunamazsa hata döndürme, kuyruğa al
  no_more

Transport Yapılandırması

begin transports

remote_smtp:
  driver = smtp
  # TLS kullan (destekleniyorsa)
  hosts_try_starttls = *
  # Bağlantı zaman aşımı
  connect_timeout = 30s
  # Birincil sunucu geçici olarak erişilemezse (4xx hata) kuyruğa al
  # 5xx hata kalıcı hata anlamına gelir, bounce gönder
  retry_include_ip_address = true

Retry (Yeniden Deneme) Politikası

Bu backup MX yapılandırmasının kalbi burasıdır. Birincil sunucu down olduğunda Exim ne kadar süre denemeye devam etmeli?

begin retry

# Genel yeniden deneme kuralı
# Format: <domain> <error-type> <time-intervals>
# F,<time>: Sabit aralık
# G,<time>,<multiplier>: Geometrik artış
# H,<time>,<jitter>: Değişken aralık

# Birincil sunucu için yeniden deneme politikası
mail1.example.com   *   F,2h,15m; G,16h,2h,1.5; F,4d,8h

# Açıklaması:
# İlk 2 saat: Her 15 dakikada bir dene
# Sonraki 16 saat: 2 saat başlangıç, 1.5 çarpanla artan aralıklarla dene
# Sonraki 4 gün: Her 8 saatte bir dene
# 4 günden sonra: Mail bounce et

# Genel kural (diğer tüm hostlar için)
*   *   F,2h,15m; G,16h,1h,1.5; F,5d,6h

Bu yapılandırma özellikle hafta sonu veya tatil dönemlerinde birincil sunucunun uzun süre down olabileceği senaryolarda kritiktir. Varsayılan Exim ayarları 5 gün kuyrukta tutar, bu RFC 5321’e uygundur.

ACL (Access Control List) ile Güvenlik

Backup MX’in açık relay haline gelmemesi çok önemlidir. Yanlış yapılandırılmış bir backup MX, spam göndericilerin cenneti olabilir:

begin acl

acl_check_rcpt:
  # Yerel mailler her zaman kabul
  accept  domains = +local_domains

  # Relay izni olan hostlardan gelen mailler kabul
  accept  hosts = +relay_from_hosts

  # Sadece yetkili domainler için relay yap
  accept  domains = +relay_to_domains
          endpass
          message = Bu domain icin relay yetkimiz yok

  # Geçersiz alıcıyı reddet - bu önemli!
  # Birincil sunucu olmadan alıcı doğrulaması yapamayabiliriz
  # Bu yüzden dikkatli olun
  deny    message = Relay not permitted

acl_check_data:
  # Temel spam kontrolleri
  deny    condition = ${if >{$message_size}{52428800}}
          message = Mail boyutu 50MB limiti asiyor

  accept

Callout Doğrulaması

Backup MX olarak çalışırken geçersiz alıcılara mail kabul etmemek için birincil sunucudan alıcı doğrulaması yapabilirsiniz. Ancak bu, birincil sunucu down olduğunda sorun çıkarır. İki yaklaşım var:

Yaklaşım 1: Callout aktif, birincil down olduğunda geçici hata ver

acl_check_rcpt:
  # Birincil sunucu erişilebilirse callout yap
  deny    domains = +relay_to_domains
          !verify = recipient/callout=10s,defer_ok,use_sender
          message = Gecersiz alici adresi

Yaklaşım 2: Tüm mailleri kabul et (daha güvenli backup MX davranışı)

Birincil sunucu down olduğunda alıcı doğrulaması yapamazsınız. Bu yüzden genellikle tüm mailleri kabul edip birincil sunucu devreye girince iletmek daha güvenlidir. Ancak bu spam riskini artırır. Denge için sadece temel kontroller yapın:

acl_check_rcpt:
  accept  domains = +local_domains

  # Relay için sadece yetkili domainleri kabul et
  accept  domains = +relay_to_domains
          # DNSBL kontrolü ekle
          !hosts = +relay_from_hosts
          !dnslists = zen.spamhaus.org : bl.spamcop.net
          endpass
          message = IP adresiniz kara listede: $dnslist_domain

  deny

Birincil Sunucu Tespiti ve Otomatik Failover İzleme

Backup MX’in ne zaman devreye girdiğini ve ne zaman birincili tekrar denediğini izlemek önemlidir:

#!/bin/bash
# /usr/local/bin/check-primary-mx.sh
# Bu scripti cron ile her 5 dakikada çalıştırın

PRIMARY_MX="mail1.example.com"
PRIMARY_PORT=25
LOG_FILE="/var/log/backup-mx-status.log"
ALERT_EMAIL="[email protected]"

# SMTP bağlantısı test et
if timeout 10 bash -c "echo QUIT | nc -w 5 $PRIMARY_MX $PRIMARY_PORT" > /dev/null 2>&1; then
    STATUS="UP"
    # Eğer önceden down kaydı varsa, kuyruk işlemeyi tetikle
    if [ -f /tmp/primary-mx-was-down ]; then
        echo "$(date): Birincil MX yeniden erisilebilir. Kuyruk isleniyor..." >> $LOG_FILE
        /usr/sbin/exim -q -v >> $LOG_FILE 2>&1
        rm -f /tmp/primary-mx-was-down
        echo "Birincil MX $PRIMARY_MX yeniden devrede, kuyruk islendi" | 
            mail -s "Backup MX: Birincil Sunucu Geri Geldi" $ALERT_EMAIL
    fi
else
    STATUS="DOWN"
    echo "$(date): Birincil MX ERISILEMEDIGI TESPIT EDILDI" >> $LOG_FILE
    if [ ! -f /tmp/primary-mx-was-down ]; then
        touch /tmp/primary-mx-was-down
        echo "Birincil MX $PRIMARY_MX erisilemedigi tespit edildi!" | 
            mail -s "UYARI: Backup MX aktif" $ALERT_EMAIL
    fi
fi

echo "$(date): Birincil MX durumu: $STATUS" >> $LOG_FILE

Cron kaydı:

*/5 * * * * /usr/local/bin/check-primary-mx.sh

Kuyruk Yönetimi ve İzleme

Backup MX’te biriken mailleri yönetmek günlük operasyonların önemli bir parçasıdır:

# Mevcut kuyruğu listele
exim -bp

# Kuyruk özetini göster (kaç mail bekliyor)
exim -bpc

# Belirli bir domain için bekleyen mailleri göster
exim -bp | grep "example.com"

# Kuyruğu hemen işle (birincil sunucu geri geldiğinde)
exim -q

# Verbose modda kuyruk işle
exim -qv

# Sadece dondurulmuş (frozen) mailleri işle
exim -qff

# Belirli bir message ID'sini yeniden dene
exim -M <message-id>

# Kuyruktaki tüm mailleri birincil sunucuya doğru yeniden kuyruğa al
exim -bp | awk '/^ *[0-9]/{print $3}' | xargs -I{} exim -M {}

Kuyruğu İzlemek için Log Takibi

# Gerçek zamanlı log takibi
tail -f /var/log/exim4/mainlog

# Backup MX olarak relay edilen mailleri filtrele
grep "relay=" /var/log/exim4/mainlog | tail -50

# Hata durumlarını bul
grep "** " /var/log/exim4/mainlog | tail -20

# Belirli bir domain için logları filtrele
grep "@example.com" /var/log/exim4/mainlog | tail -30

SPF ve DKIM Değerlendirmeleri

Backup MX kullanırken SPF kayıtlarını da güncellemeniz gerekir:

# SPF kaydı - hem birincil hem backup MX'i dahil et
example.com.  IN  TXT  "v=spf1 mx ip4:203.0.113.10 ip4:203.0.113.20 -all"

# ya da sadece mx mekanizmasını kullanın (otomatik olarak tüm MX'leri kapsar)
example.com.  IN  TXT  "v=spf1 mx -all"

Backup MX tipik olarak mail iletmek (relay) için kullanıldığından, gönderen adresi değişmez ve DKIM imzası bozulmamalıdır. Ancak herhangi bir header değişikliği yaparsanız DKIM imzası bozulur, buna dikkat edin.

Yaygın Sorunlar ve Çözümleri

Sorun 1: Açık Relay

Backup MX’inizin açık relay olmadığını test edin:

# Harici bir makineden test et
telnet mail2.example.com 25
EHLO test.com
MAIL FROM: [email protected]
RCPT TO: [email protected]
# "550 Relay not permitted" almalısınız

Sorun 2: Mail Döngüsü

Backup MX, birincil sunucuya iletirken dikkat edilmesi gereken bir durum: birincil sunucu da backup’a iletecek şekilde yanlış yapılandırılmışsa döngü oluşur.

# exim4.conf'ta döngüyü önlemek için
# Birincil sunucu tarafında backup MX'in IP'sini güvenilir relay olarak tanımlayın
# ama backup'a iletmeyecek şekilde ayarlayın
trusted_hosts = 203.0.113.20  # Backup MX IP

# Route_data ayarında döngüyü önle
pass_router = dnslookup  # Bir sonraki router'a geç

Sorun 3: Dondurulmuş Mailler

Uzun süre kuyrukta kalan ve “frozen” durumuna düşen mailleri yönetin:

# Frozen mail sayısını kontrol et
exim -bp | grep frozen | wc -l

# Frozen mailleri tekrar aktif et
exim -qff

# Çok eski frozen mailleri sil (30 günden eski)
exiqgrep -z -o 2592000 | xargs exim -Mrm

# Exim konfigürasyonunda otomatik dondurma süresini ayarla
# exim4.conf'ta:
timeout_frozen_after = 7d  # 7 günden eski frozen mailleri sil

Performans Optimizasyonu

Backup MX’in ani yük altında çökmemesi için:

# exim4.conf'ta eşzamanlı bağlantı limitleri
smtp_accept_max = 100
smtp_accept_max_per_host = 10
smtp_connect_backlog = 20

# Kuyruk işleme aralığı
queue_interval = 15m

# Paralel kuyruk işleme
queue_run_max = 5

# Bellek ve süreç limitleri
deliver_queue_load_max = 10.0
# Sistem yükü 10'un üzerindeyse yeni teslimat başlatma

Tam Yapılandırma Örneği

Tüm parçaları bir araya getiren minimal ama fonksiyonel bir backup MX yapılandırması:

# /etc/exim4/exim4.conf - Backup MX Yapılandırması
# ================================================

primary_hostname = mail2.example.com

domainlist local_domains = @ : localhost
domainlist relay_to_domains = example.com : example.org

hostlist relay_from_hosts = 127.0.0.1 : ::1 : 203.0.113.10

# Logging
log_selector = +smtp_connection +smtp_incomplete_transaction 
               +tls_cipher +queue_run

# Güvenlik
smtp_banner = "$primary_hostname ESMTP"
helo_allow_chars =

# Performans
smtp_accept_max = 100
queue_run_max = 5
queue_interval = 15m
timeout_frozen_after = 7d

# ACL
acl_smtp_rcpt = acl_check_rcpt
acl_smtp_data = acl_check_data

begin acl

acl_check_rcpt:
  accept  hosts = : @[]
  deny    message = Gecersiz HELO/EHLO
          condition = ${if isip{$sender_helo_name}{true}{false}}
  accept  domains = +local_domains
  accept  hosts = +relay_from_hosts
  accept  domains = +relay_to_domains
          !dnslists = zen.spamhaus.org
          endpass
          message = IP kara listede: $dnslist_domain
  deny    message = Relay yetkisi yok

acl_check_data:
  deny    condition = ${if >{$message_size}{52428800}}
          message = 50MB boyut limiti asildi
  accept

begin routers

backup_mx_route:
  driver = manualroute
  domains = +relay_to_domains
  transport = remote_smtp_transport
  route_list = example.com  mail1.example.com ; 
               example.org  mail1-alt.example.com
  no_more

dnslookup:
  driver = dnslookup
  domains = ! +local_domains
  transport = remote_smtp_transport
  ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8
  no_more

begin transports

remote_smtp_transport:
  driver = smtp
  hosts_try_starttls = *
  connect_timeout = 30s

begin retry

mail1.example.com  *  F,2h,15m; G,16h,2h,1.5; F,4d,8h
*                  *  F,2h,15m; G,16h,1h,1.5; F,5d,6h

begin rewrite
begin authenticators

Yapılandırmayı uyguladıktan sonra test edin:

# Syntax kontrolü
exim -bV

# Yapılandırma testini çalıştır
exim -C /etc/exim4/exim4.conf -bV

# Test maili gönder (routing test)
exim -bt [email protected]

# Servisi yeniden başlat
systemctl restart exim4

# Durumu kontrol et
systemctl status exim4
journalctl -u exim4 -f

Sonuç

Exim ile backup MX yapılandırması, doğru yapıldığında mail altyapınıza ciddi bir dayanıklılık katıyor. Özetlemek gerekirse kritik noktalar şunlardır:

  • DNS MX öncelikleri doğru ayarlanmalı, backup MX yüksek değer almalı
  • ACL kuralları backup MX’i açık relay olmaktan korumalı
  • Retry politikaları birincil sunucunuzun tipik downtime süresine göre ayarlanmalı
  • SPF kayıtları backup MX IP’sini kapsayacak şekilde güncellenmeli
  • İzleme scriptleri birincil sunucu geri geldiğinde kuyruğu otomatik işlemeli
  • Log takibi düzenli yapılmalı, frozen mailler birikip taşmamalı

Bakım pencerelerinden önce backup MX’inizi gerçek bir failover testiyle mutlaka doğrulayın. Teoride çalışan bir yapılandırma, gerçek kriz anında sizi hayal kırıklığına uğratabilir. Ayda bir kez birincil sunucunuzu kasıtlı olarak kapatıp backup MX’in devreye girdiğini ve maillerin birincil geri gelince iletildiğini gözlemlemenizi kesinlikle öneririm.

Yorum yapın