Mail sunucularında en sık karşılaşılan problemlerden biri, gönderilen e-postaların spam klasörüne düşmesi ya da hiç ulaşmamasıdır. Bunun temel nedeni genellikle IP itibar puanı düşük bir sunucudan doğrudan e-posta göndermeye çalışmaktır. İşte tam bu noktada relay host yapılandırması devreye giriyor. Postfix’i bir relay host üzerinden e-posta gönderecek şekilde yapılandırdığınızda, kendi sunucunuzun IP itibarı yerine relay sağlayıcısının köklü altyapısını kullanıyorsunuz. Bu yazıda sıfırdan başlayarak Postfix relay host yapılandırmasını, kimlik doğrulama ayarlarını ve gerçek dünya senaryolarını detaylıca ele alacağız.
Relay Host Nedir ve Neden Kullanılır?
Postfix varsayılan olarak e-postaları doğrudan hedef mail sunucusuna iletmeye çalışır. Yani [email protected] adresine mail gönderirken Postfix, Gmail’in MX kayıtlarını sorgular ve doğrudan bağlantı kurar. Bu yaklaşım teoride güzel çalışır ama pratikte bir sürü sorun çıkarır.
Öncelikle, yeni bir sunucunun IP adresi neredeyse her zaman “temiz” olmayan bir geçmişe sahip olabilir. Veri merkezlerinin IP blokları spam listelerine sıkça girer. Bunun yanında PTR kaydı düzgün yapılandırılmamış sunucular, DKIM/SPF imzalaması yapmayan sistemler doğrudan gönderimde büyük sorunlarla karşılaşır.
Relay host kullanmanın avantajları şöyle sıralanabilir:
- IP itibarı: SendGrid, Mailgun, Amazon SES gibi servisler yüksek itibarı olan IP havuzlarına sahiptir
- Deliverability: E-postalarınızın inbox’a ulaşma oranı ciddi ölçüde artar
- Basit yapılandırma: Karmaşık DNS ve SPF ayarları yerine sadece SMTP kimlik bilgileri yeterlidir
- İzleme ve raporlama: Çoğu relay servisi bounce, open ve click istatistikleri sunar
- Güvenlik: Kendi sunucunuzun SMTP portunu dışarıya açmak zorunda kalmazsınız
Relay host genellikle iki senaryoda kullanılır. Birincisi, uygulama sunucularının sistem bildirimleri, şifre sıfırlama ve işlem e-postalarını göndermesi gerektiğinde. İkincisi ise bir şirket içi mail sunucusunun internet üzerindeki alıcılara mail göndermesi için dış bir SMTP relay kullanması gerektiğinde.
Postfix Kurulumu
Eğer Postfix henüz kurulu değilse, önce bunu halledelim.
Debian/Ubuntu üzerinde:
sudo apt update
sudo apt install postfix libsasl2-modules -y
Kurulum sırasında bir yapılandırma türü soracak. “Internet Site” seçeneği yerine “Satellite system” seçebilirsiniz çünkü relay kullanacaksınız. Ama bu adımı atlasanız da sonradan düzenleyeceğiz.
RHEL/CentOS/AlmaLinux üzerinde:
sudo dnf install postfix cyrus-sasl-plain cyrus-sasl-md5 -y
sudo systemctl enable postfix
sudo systemctl start postfix
Postfix’in versiyonunu kontrol edelim:
postconf mail_version
Temel Relay Host Yapılandırması
Postfix’in ana yapılandırma dosyası /etc/postfix/main.cf dosyasıdır. Relay host yapılandırması için bu dosyayı düzenlememiz gerekiyor.
Önce mevcut durumu kontrol edelim:
postconf -n | grep relay
Bu komut sadece varsayılan değerden farklı olan relay ile ilgili parametreleri gösterir. Temiz bir kurulumda muhtemelen hiçbir şey çıkmaz.
Şimdi temel relay yapılandırmasını yapalım. Bu örnekte SendGrid kullanıyoruz ama mantık her relay servisi için aynıdır:
sudo nano /etc/postfix/main.cf
Dosyaya şu parametreleri ekleyin veya düzenleyin:
# Relay host tanımı - köşeli parantez DNS MX kaydı sorgusunu devre dışı bırakır
relayhost = [smtp.sendgrid.net]:587
# SASL kimlik doğrulamasını etkinleştir
smtp_sasl_auth_enable = yes
# Şifre dosyasının yolu
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
# Güvensiz kimlik doğrulama mekanizmalarını devre dışı bırak
smtp_sasl_security_options = noanonymous
# TLS şifrelemesini zorunlu kıl
smtp_tls_security_level = encrypt
# TLS CA sertifikalarının yolu
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt
# Relay sonrası header'larını koru
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
relayhost: Postfix’e tüm giden mailleri bu sunucuya iletmesini söyler. Köşeli parantez kullanmak önemlidir, bu sayede Postfix o hostname için MX kaydı aramaz, doğrudan A/AAAA kaydına bakar.
smtp_sasl_auth_enable: SMTP kimlik doğrulamasını aktif eder. Relay servisler genellikle kullanıcı adı/şifre ister.
smtp_sasl_security_options: noanonymous değeri anonim bağlantıları reddeder, güvenlik açısından önemlidir.
smtp_tls_security_level: encrypt değeri TLS şifrelemesini zorunlu kılar. may yazarsanız TLS destekleniyorsa kullanır ama zorunlu tutmaz, bunu tercih etmeyin.
SASL Kimlik Bilgilerini Ayarlama
Relay sunucu için kullanıcı adı ve şifre bilgilerini ayrı bir dosyada tutuyoruz. Bu dosya /etc/postfix/sasl_passwd konumunda oluşturulur:
sudo nano /etc/postfix/sasl_passwd
Dosyanın formatı şöyledir:
[smtp.sendgrid.net]:587 apikey:SG.xxxxxxxxxxxxxxxxxxxx
SendGrid için kullanıcı adı her zaman apikey kelimesidir, şifre ise API key değeridir. Mailgun için format farklıdır:
[smtp.mailgun.org]:587 [email protected]:gizli-sifreniz
Amazon SES için:
[email-smtp.eu-west-1.amazonaws.com]:587 AKIAIOSFODNN7EXAMPLE:gizlisifre
Dosyayı kaydettikten sonra hash veritabanını oluşturmalıyız:
sudo postmap /etc/postfix/sasl_passwd
Bu komut /etc/postfix/sasl_passwd.db dosyasını oluşturur. Postfix bu veritabanını okur.
Güvenlik açısından bu dosyaların izinlerini kısıtlayalım:
sudo chmod 600 /etc/postfix/sasl_passwd
sudo chmod 600 /etc/postfix/sasl_passwd.db
sudo chown root:root /etc/postfix/sasl_passwd
sudo chown root:root /etc/postfix/sasl_passwd.db
Kimlik bilgileri değiştiğinde yapmanız gereken işlem:
sudo nano /etc/postfix/sasl_passwd
# Değişiklikleri yaptıktan sonra:
sudo postmap /etc/postfix/sasl_passwd
sudo systemctl reload postfix
Postfix’i Yeniden Başlatma ve Test
Yapılandırmayı syntax hatası olup olmadığını kontrol edelim:
sudo postfix check
Eğer çıktı boşsa hata yok demektir. Şimdi Postfix’i yeniden başlatalım:
sudo systemctl restart postfix
sudo systemctl status postfix
Test maili gönderelim. Bunun için mail komutunu kullanabiliriz:
echo "Bu bir test mailidir." | mail -s "Postfix Relay Test" [email protected]
Eğer mail komutu yoksa sendmail ile de deneyebilirsiniz:
sendmail -v [email protected] << EOF
Subject: Test
From: [email protected]
Bu bir test.
EOF
Mail kuyruğunu kontrol edelim:
mailq
Kuyruk boşsa mail gönderilmiş demektir. Eğer kuyrukta mesajlar bekliyorsa, log dosyasına bakalım:
sudo tail -f /var/log/mail.log
RHEL tabanlı sistemlerde:
sudo tail -f /var/log/maillog
Gerçek Dünya Senaryosu: E-Ticaret Sitesi
Diyelim ki bir e-ticaret platformu işletiyorsunuz. Siparişler, şifre sıfırlama, kargo bildirimleri için günde binlerce mail göndermeniz gerekiyor. Uygulama sunucunuz doğrudan mail göndermeye çalışıyor ama maillerin büyük kısmı spam klasörüne düşüyor.
Çözüm: Postfix’i Amazon SES üzerinden relay yapacak şekilde yapılandırıyoruz.
Önce SES’te SMTP kimlik bilgileri oluşturun (AWS Console > SES > SMTP Settings > Create SMTP Credentials).
/etc/postfix/main.cf dosyasına eklenecekler:
# Temel relay ayarları
relayhost = [email-smtp.eu-west-1.amazonaws.com]:587
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_tls_security_level = encrypt
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt
# Gönderen adresi yeniden yaz (SES'te doğrulanmış domain kullan)
sender_canonical_maps = hash:/etc/postfix/sender_canonical
# Header'dan eski server bilgisini gizle
smtp_header_checks = regexp:/etc/postfix/header_checks
# Bağlantı parametreleri
smtp_connection_cache_on_demand = yes
smtp_connection_cache_destinations = [email-smtp.eu-west-1.amazonaws.com]:587
Gönderen adresi yeniden yazma için /etc/postfix/sender_canonical dosyasını oluşturun:
sudo nano /etc/postfix/sender_canonical
root [email protected]
www-data [email protected]
ubuntu [email protected]
sudo postmap /etc/postfix/sender_canonical
Header’dan sunucu bilgisini gizlemek için /etc/postfix/header_checks dosyasını oluşturun:
sudo nano /etc/postfix/header_checks
/^Received: .*/ IGNORE
/^X-Originating-IP:/ IGNORE
/^X-Mailer:/ REPLACE X-Mailer: Mail
sudo systemctl restart postfix
Gerçek Dünya Senaryosu: Kurumsal Şirket İç Mail Sunucusu
Bir şirketin iç ağında Exchange Server var ama İnternet’e giden mailleri için dış relay kullanmak istiyorsunuz. Bu kez Postfix’i bir “smart host” olarak konumlandırıyoruz.
Exchange, Postfix’e mail gönderiyor. Postfix ise bu mailleri Mailgun üzerinden iletecek.
/etc/postfix/main.cf için ek yapılandırma:
# Hangi ağlardan relay izni var
mynetworks = 127.0.0.0/8, 192.168.10.0/24, 10.0.0.0/8
# İç ağdan gelen mailleri relay etmeye izin ver
smtpd_relay_restrictions =
permit_mynetworks,
reject_unauth_destination
# Relay host
relayhost = [smtp.eu.mailgun.org]:587
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_tls_security_level = encrypt
# Dinleme adresi (sadece iç ağ)
inet_interfaces = 127.0.0.1, 192.168.10.50
# Gelen SMTP bağlantıları için TLS
smtpd_tls_cert_file = /etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file = /etc/ssl/private/ssl-cert-snakeoil.key
smtpd_tls_security_level = may
Bu yapılandırmayla 192.168.10.0/24 ağındaki Exchange sunucusu, Postfix’e mail gönderebilir ve Postfix bunları Mailgun üzerinden iletir.
Sorun Giderme
Mail Kuyruğunda Takılan Mesajlar
Kuyruktaki mesajların durumunu görmek için:
mailq | head -50
Kuyruktaki tüm mailleri hemen yeniden göndermeye zorlamak için:
sudo postfix flush
Belirli bir mesajı kuyruktan silmek için:
sudo postsuper -d QUEUE_ID
Tüm kuyruğu temizlemek için (dikkatli kullanın):
sudo postsuper -d ALL
TLS Bağlantı Sorunları
TLS handshake hatası alıyorsanız, relay sunucusuyla TLS bağlantısını test edin:
openssl s_client -starttls smtp -connect smtp.sendgrid.net:587
Sertifika doğrulama sorunlarında geçici olarak smtp_tls_security_level = may yapıp test edin. Sorun çözülüyorsa CA sertifika paketini güncelleyin:
sudo update-ca-certificates
Authentication Failed Hataları
Log dosyasında “Authentication failed” görüyorsanız:
sudo grep "authentication failed" /var/log/mail.log | tail -20
SASL kimlik bilgilerini tekrar kontrol edin. postmap komutu çalıştırılmayı unutmak en yaygın hatadır. Ayrıca bazı servisler (özellikle Gmail) için “Less secure app access” veya App Password kullanmanız gerekebilir.
Kimlik doğrulamayı manuel test etmek için:
telnet smtp.sendgrid.net 587
EHLO test
AUTH LOGIN
# Base64 encode edilmiş kullanıcı adı
# Base64 encode edilmiş şifre
Base64 encoding için:
echo -n "kullaniciadi" | base64
echo -n "sifre" | base64
İzleme ve Log Yönetimi
Mail log’larını düzenli takip etmek için basit bir script hazırlayalım:
#!/bin/bash
# /usr/local/bin/mail-status-check.sh
LOGFILE="/var/log/mail.log"
TARIH=$(date '+%Y-%m-%d %H:%M')
echo "=== Mail Status Check: $TARIH ==="
echo ""
# Son 1 saatte gönderilen mail sayısı
SENT=$(grep "$(date '+%b %e %H')" $LOGFILE | grep "status=sent" | wc -l)
echo "Son 1 saatte gönderilen: $SENT mail"
# Son 1 saatteki hatalar
BOUNCED=$(grep "$(date '+%b %e %H')" $LOGFILE | grep "status=bounced" | wc -l)
echo "Bounce olan: $BOUNCED mail"
# Kuyruk durumu
QUEUE=$(mailq | tail -1)
echo "Kuyruk durumu: $QUEUE"
# Connection refused hataları
REFUSED=$(grep "$(date '+%b %e %H')" $LOGFILE | grep "Connection refused" | wc -l)
echo "Connection refused: $REFUSED adet"
sudo chmod +x /usr/local/bin/mail-status-check.sh
Cron’a ekleyin, her saat başı rapor alsın:
0 * * * * /usr/local/bin/mail-status-check.sh >> /var/log/mail-status.log 2>&1
Güvenlik Önerileri
Relay yapılandırmasında güvenlik kritik önem taşır. Yanlış yapılandırılmış bir Postfix sunucusu açık relay haline gelir ve spam göndermek için kullanılabilir.
- Açık relay testi: Yapılandırmadan sonra
https://mxtoolbox.com/diagnostic.aspxüzerinden açık relay testi yapın - mynetworks parametresi: Sadece güvendiğiniz IP aralıklarını ekleyin,
0.0.0.0/0kesinlikle kullanmayın - SASL şifrelerini şifreleyin:
sasl_passwddosyasına 600 izni verin ve sadece root okuyabilsin - Rate limiting: Ani mail artışlarını tespit etmek için log izlemesi yapın
- API key rotation: Relay servis API key’lerini periyodik olarak yenileyin
# Açık relay testi için
postmap -q "[email protected]" hash:/etc/postfix/sasl_passwd
Postfix’in relay kısıtlamalarını doğrulamak için:
postconf smtpd_relay_restrictions
postconf smtpd_recipient_restrictions
Sonuç
Postfix relay host yapılandırması ilk bakışta karmaşık görünse de aslında birkaç temel parametreden oluşuyor. relayhost, smtp_sasl_auth_enable ve smtp_sasl_password_maps parametrelerini doğru ayarladığınızda işin özünü kavramış oluyorsunuz.
Gerçek dünya deneyiminden şunu söyleyebilirim: Direkt gönderim yerine güvenilir bir relay servisi kullanmak, deliverability oranını ciddi ölçüde artırıyor. Özellikle üretim ortamlarında Amazon SES veya SendGrid gibi servisler hem uygun fiyatlı hem de güvenilir alternatifler sunuyor.
Unutmayın, yapılandırma değişikliği yaptıktan sonra her zaman postfix check ile syntax kontrolü yapın, log dosyalarını yakından takip edin ve açık relay testi ile güvenliği doğrulayın. Mail altyapısı “bir kere kur unut” değil, sürekli izleme gerektiren bir sistem. Log’larınızı takip edin, bounce oranlarınıza dikkat edin ve relay servis kotalarınızı gözleyin.