Relay Denied Hatası: Açık Relay ve Mail Sunucu Güvenlik Sorunları
Mail sunucunuzda bir sabah işe geldiğinizde spam kara listesine alındığınızı, müşterilerinizin mailleri almadığını veya sunucunuzun başka ağlara relay denied hatası verdiğini fark etmek gerçekten can sıkıcı bir durum. Bu hata hem güvenlik açısından hem de mail akışı açısından ciddi sonuçlar doğurabilir. Gelin bu sorunu derinlemesine inceleyelim ve nasıl çözeceğimizi pratik örneklerle ele alalım.
Relay Denied Hatası Nedir?
“Relay denied” veya tam hali ile “550 5.7.1 Unable to relay” hatası, mail sunucunuzun bir e-postayı iletmeyi reddettiği anlamına gelir. Yani bir kullanıcı veya sistem, sizin mail sunucunuz üzerinden başka bir domain’e mail göndermek istediğinde sunucu bunu reddeder.
Bu hatanın iki farklı yüzü vardır:
- Meşru kullanıcıların relay yetkisi olmaması: Müşteriniz veya çalışanınız mail gönderemiyor, sunucu reddediyor.
- Açık relay (Open Relay) sorunu: Sunucunuz herkese relay izni veriyor, yani spamcılar için açık kapı haline gelmiş.
İkincisi çok daha tehlikeli. Açık relay, sunucunuzun dünyadaki herhangi birinin sizin üzerinizden mail göndermesine izin verdiği anlamına gelir. Bu durum sizi spam göndericisi konumuna sokar, IP’nizi kara listelere alır ve itibarınızı mahveder.
Relay Nasıl Çalışır?
Önce temel mantığı anlayalım. Mail sunucusu şu soruyu sorar: “Bu maili benim üzerimden geçirmemi istiyor musun? Kim olduğunu kanıtlayabilir misin?”
Normal akış şöyle işler:
- Yerel domain kullanıcıları (example.com) birbirine mail gönderebilir, bu relay değildir.
- Dış kullanıcı sizin sunucunuz üzerinden başka bir domain’e mail göndermek istiyorsa, ya kimlik doğrulaması yapmalı ya da izin verilen bir ağdan gelmelidir.
- Kimlik doğrulaması yapılmadan gelen dış istekler reddedilmelidir.
Açık relay’de ise bu kontrol yoktur. Sunucu “herkese güveniyorum, gelin gönderin” der.
Postfix Üzerinde Relay Yapılandırması
Postfix, en yaygın kullanılan mail sunucularından biri. Relay ayarları main.cf dosyasında yapılır.
Temel Relay Kısıtlamaları
# /etc/postfix/main.cf içindeki kritik parametreler
smtpd_relay_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
defer_unauth_destination
smtpd_recipient_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination
Bu yapılandırmada:
- permit_mynetworks:
mynetworksparametresinde tanımlı ağlardan gelen isteklere izin verir. - permit_sasl_authenticated: SASL ile kimlik doğrulaması yapan kullanıcılara izin verir.
- reject_unauth_destination: Yukarıdaki iki koşulu sağlamayan herkesi reddeder.
Mevcut Durumu Kontrol Etme
Önce sunucunuzun açık relay olup olmadığını test edin:
# Postfix yapılandırmasını kontrol et
postconf -n | grep -E "relay|restrict|network"
# mynetworks değerini gör
postconf mynetworks
# Hangi domain'lere relay yapıldığını gör
postconf relay_domains
Postfix Log Analizi
Relay denied hatalarını loglardan takip etmek şart:
# Mail loglarını canlı izle
tail -f /var/log/mail.log | grep -i "relay"
# Son 24 saatte relay denied hatalarını say
grep "$(date +%b %e)" /var/log/mail.log | grep -c "relay denied"
# Hangi IP'lerden relay denemesi gelmiş
grep "relay denied" /var/log/mail.log | awk '{print $NF}' | sort | uniq -c | sort -rn | head -20
Örnek bir log çıktısı şöyle görünür:
Nov 15 09:23:41 mailserver postfix/smtpd[12345]: NOQUEUE: reject: RCPT from unknown[192.168.50.100]:
554 5.7.1 <[email protected]>: Relay access denied; from=<[email protected]>
to=<[email protected]> proto=ESMTP helo=<client.example.com>
Bu logda dikkat edilecek noktalar:
- NOQUEUE: Mail kuyruğa alınmadan reddedildi.
- reject: Reddedilme tipi.
- 554 5.7.1: SMTP hata kodu, relay reddedildi.
- from= ve to=: Gönderen ve alıcı.
Gerçek Dünya Senaryosu 1: Çalışan Mail Gönderemiyor
Bir çalışan size geliyor: “Outlook’tan mail göndermeye çalışıyorum, ‘550 5.7.1 Unable to relay’ hatası alıyorum.” Bu klasik bir SMTP Auth sorunudur.
SASL Kimlik Doğrulamasını Etkinleştirme
# Postfix SASL yapılandırması
cat >> /etc/postfix/main.cf << 'EOF'
# SASL Authentication
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $myhostname
broken_sasl_auth_clients = yes
# TLS zorunlu kıl
smtpd_tls_security_level = may
smtpd_tls_cert_file = /etc/ssl/certs/mailserver.crt
smtpd_tls_key_file = /etc/ssl/private/mailserver.key
EOF
# Dovecot SASL entegrasyonu için
cat >> /etc/postfix/main.cf << 'EOF'
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
EOF
# Postfix'i yeniden başlat
systemctl restart postfix
# SASL'in çalıştığını doğrula
postconf smtpd_sasl_auth_enable
Kullanıcı Kimlik Doğrulamasını Test Etme
# Telnet ile SMTP Auth test et
telnet mail.example.com 587
# Bağlandıktan sonra
EHLO test.local
AUTH LOGIN
# Base64 encoded kullanıcı adı ve şifre gir
# Python ile test
python3 -c "
import smtplib
import base64
server = smtplib.SMTP('mail.example.com', 587)
server.ehlo()
server.starttls()
server.login('[email protected]', 'sifre')
print('Kimlik dogrulama basarili!')
server.quit()
"
Açık Relay Testi ve Tehlikesi
Sunucunuzun açık relay olup olmadığını test etmenin birkaç yolu var.
Harici Test Araçları
# MXToolbox veya benzeri bir servis kullanmak yerine
# kendi testinizi yapabilirsiniz
# swaks aracı ile test (apt install swaks)
swaks --to [email protected]
--from [email protected]
--server mail.example.com
--port 25
--no-auth
# Eğer bu başarılı olursa, sunucunuz açık relay!
# Beklenen çıktı:
# ** smtp> RCPT To:<[email protected]>
# ** smtp< 554 5.7.1 <[email protected]>: Relay access denied
Eğer test başarılı olursa ve mail gönderilirse, acil müdahale gerekir.
Açık Relay’i Kapama
# Postfix için acil düzeltme
# /etc/postfix/main.cf düzenle
# YANLIS yapılandırma (açık relay):
# smtpd_recipient_restrictions = permit_all
# DOGRU yapılandırma:
postconf -e 'smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, defer_unauth_destination'
postconf -e 'smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination'
# mynetworks'ü sadece gerçekten güvendiğiniz ağlarla sınırla
postconf -e 'mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128'
# Değişiklikleri uygula
postfix reload
Gerçek Dünya Senaryosu 2: IP Kara Listeye Alınmış
Sabah geliyorsunuz, müşterilerden “maillerimiz gitmiyor” şikayetleri var. Sunucunuz açık relay haline gelmiş ve kara listeye alınmış.
Durum Tespiti
# IP itibarını kontrol et
# Sunucu IP'nizi öğrenin
SERVER_IP=$(curl -s ifconfig.me)
echo "Sunucu IP: $SERVER_IP"
# dig ile RBL kontrolü
for rbl in zen.spamhaus.org bl.spamcop.net dnsbl.sorbs.net; do
LOOKUP=$(dig +short $SERVER_IP.${rbl} 2>/dev/null)
if [ -n "$LOOKUP" ]; then
echo "KARA LISTEDE: ${rbl} - $LOOKUP"
else
echo "Temiz: ${rbl}"
fi
done
# Mail kuyruğunu kontrol et
mailq | head -50
postqueue -p | wc -l
Kuyruktaki Spam Maillerini Temizleme
# Kuyrukta ne var diye bak
postqueue -p
# Tüm kuyruğu temizle (dikkatli ol!)
postsuper -d ALL
# Sadece belirli bir göndericinin maillerini temizle
postqueue -p | grep "[email protected]" | awk '{print $1}' |
tr -d '*!' | postsuper -d -
# Kuyruk boyutunu izle
watch -n 5 'postqueue -p | tail -1'
Rate Limiting ile Hasarı Sınırlama
# /etc/postfix/main.cf'e ekle
cat >> /etc/postfix/main.cf << 'EOF'
# Bağlantı hız sınırlama
smtpd_client_connection_rate_limit = 30
smtpd_client_message_rate_limit = 50
smtpd_client_recipient_rate_limit = 100
# Yeni bağlantı kısıtlamaları
smtpd_client_connection_count_limit = 10
anvil_rate_time_unit = 60s
EOF
postfix reload
Exim Üzerinde Relay Yapılandırması
Bazı sunucular, özellikle cPanel kullananlar, Exim ile gelir.
# Exim yapılandırmasını kontrol et
cat /etc/exim.conf | grep -A5 "relay"
# Exim ile açık relay testi
exim -bh 192.168.1.100
# Bu komut o IP'den gelmiş gibi simüle eder
# Exim log analizi
grep "relay" /var/log/exim_mainlog | tail -50
# Exim'de relay'e izin verilen hostları göster
exim -bP host_list relay_hosts
# Exim queue kontrolü
exim -bp | head -30
exim -bpc # Sadece sayısını göster
Sendmail Üzerinde Relay Kontrolü
# access.db dosyasını kontrol et
cat /etc/mail/access
# Normalde şöyle görünmeli:
# Connect:localhost.localdomain RELAY
# Connect:localhost RELAY
# Connect:127.0.0.1 RELAY
# Tehlikeli olan:
# Connect: RELAY <- Herkese relay izni!
# access.db güncelle
makemap hash /etc/mail/access < /etc/mail/access
# Sendmail'i yeniden başlat
systemctl restart sendmail
Güvenlik Katmanları Ekleme
Sadece relay’i kapatmak yeterli değil. Kapsamlı bir savunma stratejisi gerekiyor.
SPF, DKIM ve DMARC
# SPF kaydını kontrol et
dig TXT example.com | grep spf
# Postfix'e SPF kontrolü ekle (postfix-policyd-spf)
apt install postfix-policyd-spf-python
cat >> /etc/postfix/main.cf << 'EOF'
policy-spf_time_limit = 3600s
EOF
cat >> /etc/postfix/master.cf << 'EOF'
policy-spf unix - n n - - spawn
user=nobody argv=/usr/bin/policyd-spf
EOF
# smtpd_recipient_restrictions'a ekle:
# check_policy_service unix:private/policy-spf
postfix reload
Fail2Ban ile Brute Force Koruması
# fail2ban konfigürasyonu
cat > /etc/fail2ban/jail.d/postfix.conf << 'EOF'
[postfix]
enabled = true
port = smtp,465,587
logpath = /var/log/mail.log
maxretry = 5
bantime = 3600
findtime = 600
[postfix-sasl]
enabled = true
port = smtp,465,587,imap,imaps,pop3,pop3s
logpath = /var/log/mail.log
maxretry = 3
bantime = 86400
EOF
systemctl restart fail2ban
# Yasaklı IP'leri görüntüle
fail2ban-client status postfix
fail2ban-client status postfix-sasl
Gerçek Dünya Senaryosu 3: Uygulama Sunucusundan Mail Gönderimi
Bir web uygulamanız var ve uygulama sunucusundan mail atmak istiyorsunuz ama “relay denied” hatası alıyorsunuz.
# Uygulama sunucusunun IP'sini mynetworks'e ekle
# Bu güvenli bir yaklaşım değil, SASL kullanmak daha iyi
# Güvenli yaklaşım: Uygulama için ayrı bir SMTP kullanıcısı oluştur
# Dovecot üzerinde kullanıcı ekle
echo "[email protected]:{PLAIN}guclu_sifre" >> /etc/dovecot/users
# Postfix'te özel transport tanımla
cat >> /etc/postfix/main.cf << 'EOF'
# Uygulama sunucusu için özel kısıtlama
smtpd_restriction_classes = webapp_policy
webapp_policy = permit_sasl_authenticated, reject
EOF
# Test scripti
cat > /tmp/test_relay.py << 'EOF'
import smtplib
from email.mime.text import MIMEText
msg = MIMEText("Test maili")
msg['Subject'] = "Relay Test"
msg['From'] = "[email protected]"
msg['To'] = "[email protected]"
with smtplib.SMTP('mail.example.com', 587) as server:
server.starttls()
server.login('[email protected]', 'guclu_sifre')
server.send_message(msg)
print("Mail gonderildi!")
EOF
python3 /tmp/test_relay.py
Monitoring ve Alarm Kurulumu
# Basit bir monitoring scripti
cat > /usr/local/bin/relay_monitor.sh << 'EOF'
#!/bin/bash
LOG="/var/log/mail.log"
THRESHOLD=100
ALERT_EMAIL="[email protected]"
# Son 5 dakikadaki relay denied sayısını kontrol et
COUNT=$(grep "$(date +'%b %e %H:%M' --date='5 minutes ago')" $LOG |
grep -c "relay denied")
if [ "$COUNT" -gt "$THRESHOLD" ]; then
echo "UYARI: Son 5 dakikada $COUNT relay denied hatasi!" |
mail -s "Mail Sunucu Guvenlik Alarmi" $ALERT_EMAIL
# Aynı zamanda log'a yaz
logger "KRITIK: Yuksek relay denied sayisi: $COUNT"
fi
# Kuyruk boyutunu kontrol et
QUEUE_SIZE=$(postqueue -p | tail -1 | awk '{print $5}')
if [ "$QUEUE_SIZE" -gt "1000" ]; then
echo "UYARI: Mail kuyrugu $QUEUE_SIZE mesaj iceriyor!" |
mail -s "Mail Kuyrugu Alarmi" $ALERT_EMAIL
fi
EOF
chmod +x /usr/local/bin/relay_monitor.sh
# Cron'a ekle
echo "*/5 * * * * root /usr/local/bin/relay_monitor.sh" >> /etc/cron.d/mail-monitor
Sık Yapılan Hatalar
- mynetworks’ü geniş tutmak:
mynetworks = 0.0.0.0/0gibi bir tanım tüm internete relay izni verir. Sadece ihtiyaç duyduğunuz IP aralıklarını girin. - TLS olmadan kimlik doğrulama: SASL kullanıyorsanız mutlaka TLS ile birleştirin, yoksa şifreler açık metin olarak gezer.
- relay_domains’i yanlış ayarlamak: Bu parametre hangi domain’ler için relay yapacağınızı belirler. Boş bırakmak veya yanlış doldurmak sorun çıkarır.
- Test ortamında açık bırakıp unutmak: Geliştirme ortamında açık relay bırakıp prod’a almak felaket olabilir.
- Logları takip etmemek: Açık relay fark edilmeden aylarca çalışabilir. Düzenli log analizi şart.
Kara Listeden Çıkma Süreci
Eğer kara listeye alındıysanız şu adımları takip edin:
- Spamhaus: spamhaus.org/lookup adresinden sorgulama yapın, delisting talebi gönderin.
- SpamCop: spamcop.net üzerinden işlem yapın, genellikle 24-48 saat içinde otomatik temizlenir.
- SORBS: sorbs.net üzerinden delisting isteği gönderin, açıklama yazmanız gerekir.
- Microsoft JMRP: Hotmail/Outlook hedef alıyorsanız JMRP ve SNDS programlarına kaydolun.
- Google Postmaster Tools: Gmail’e mail gönderiyorsanız bu aracı kullanarak itibarınızı takip edin.
Her kara liste başvurusunda şunları belirtin: sorunu nasıl tespit ettiğinizi, ne zaman düzelttiğinizi, tekrarlanmaması için ne gibi önlemler aldığınızı.
Sonuç
Relay denied hatası hem bir güvenlik kalkanı hem de potansiyel bir sorun kaynağı. Doğru yapılandırıldığında sisteminizi koruyan bu mekanizma, yanlış kurulduğunda ya meşru kullanıcıları engelleyecek ya da kötü niyetli kişilerin istismar ettiği açık bir kapıya dönüşecek.
Temel kurallar şunlar: Kimlik doğrulamasız hiçbir dış bağlantıya relay izni verme, mynetworks’ü mümkün olduğunca dar tut, SASL ile birlikte mutlaka TLS kullan, logları düzenli analiz et ve otomatik monitoring kur. SPF, DKIM, DMARC üçlüsünü eklemek ise mail güvenliğinizi bir üst seviyeye taşır.
Açık relay tespiti durumunda paniklemeden önce logları analiz edin, ne kadar süredir açık olduğunu anlayın, kuyruğu temizleyin ve sonra kara liste başvurularını yapın. Sabırlı ve sistematik davranmak bu süreçte en büyük yardımcınız olacak.
