Spam ile mücadele etmek, bir mail sunucusu yönetiyorsanız kaçınılmaz bir gerçek. Onlarca farklı anti-spam yöntemi arasında greylisting, kurulumu basit ama etkinliği oldukça yüksek bir teknik olarak öne çıkıyor. Exim ile bu yöntemi doğru şekilde yapılandırdığınızda, sunucunuzun spam yükünü dramatik biçimde azaltabilirsiniz. Bu yazıda greylisting’in nasıl çalıştığını, Exim üzerinde nasıl kurulup yapılandırıldığını ve gerçek dünya senaryolarında nasıl optimize edileceğini detaylıca ele alacağız.
Greylisting Nedir ve Nasıl Çalışır?
Greylisting, basit ama akıllıca bir prensibi esas alır: Bir mail sunucusu size ilk kez posta göndermeye çalıştığında, geçici bir hata kodu döndürürsünüz. Gerçek bir SMTP sunucusu bu hatayı alınca RFC standartlarına uygun olarak belirli bir süre bekler ve tekrar dener. Spam botları ise genellikle bu standardı umursamaz, tek seferlik deneme yapar ve bir sonraki hedefe geçer.
Bu yöntemin temel mantığı şu üç bileşen üzerine kuruludur:
- Gönderen IP adresi: Posta nereden geliyor?
- Gönderen e-posta adresi: MAIL FROM değeri nedir?
- Alıcı e-posta adresi: RCPT TO değeri nedir?
Bu üç değerin kombinasyonuna triplet denir. Exim, bu triplet’i bir veritabanında saklar. İlk bağlantıda geçici red (421 veya 451 kodu) gönderilir. Eğer aynı triplet belirli bir süre sonra tekrar gelirse, bu sefer kabul edilir ve beyaz listeye alınır.
Greylisting’in avantajları:
- Kurulumu ve bakımı son derece basit
- Yanlış pozitif oranı düşük
- Sunucu kaynaklarına minimal yük bindirir
- Spamhaus, SpamAssassin gibi araçlarla birlikte kullanıldığında çok daha güçlü
Dezavantajı ise ilk mailde yaşanan gecikmedir. Kritik mail altyapıları için bu gecikme sorun yaratabilir. Ancak doğru beyaz liste yönetimiyle bu problem büyük ölçüde giderilebilir.
Exim’de Greylisting için Gerekli Hazırlıklar
Exim, greylisting’i doğrudan desteklemiyor; bu iş için harici bir araç kullanmanız gerekiyor. En yaygın tercih greylistd veya sqlgrey gibi araçlardır. Ancak pratik ve hafif bir çözüm olarak Exim’in kendi ACL (Access Control List) mekanizmasıyla SQLite tabanlı basit bir greylisting sistemi de kurabilirsiniz.
Önce sisteminizin güncel olduğundan emin olun:
# Debian/Ubuntu
apt update && apt upgrade -y
apt install exim4 sqlite3 -y
# CentOS/RHEL
yum update -y
yum install exim sqlite3 -y
Exim versiyonunuzu kontrol edin; 4.80 ve üzeri versiyonlarda greylisting desteği çok daha iyidir:
exim --version
# veya
exim4 --version
greylistd Kurulumu ve Yapılandırması
greylistd, Exim ile mükemmel uyum içinde çalışan, hafif ve güvenilir bir greylisting daemon’udur. Debian tabanlı sistemlerde direkt paket olarak mevcut:
apt install greylistd -y
Kurulum sonrası greylistd’nin temel yapılandırma dosyası /etc/greylistd/config konumundadır:
nano /etc/greylistd/config
Varsayılan yapılandırmayı şu şekilde düzenleyin:
# /etc/greylistd/config
[timeout]
# İlk greylisting süresi (saniye cinsinden) - 5 dakika
retryMin = 300
# Bu süre içinde retry gelirse whitelist'e al - 8 saat
retryMax = 28800
# Whitelist süresi - 36 gün
greylistTime = 3110400
[data]
# Veri dosyalarının konumu
greylist = /var/lib/greylistd/greylist.data
whitelist = /var/lib/greylistd/whitelist.data
greylist-triplets = /var/lib/greylistd/triplets.data
[lookup]
# Sadece IP mi, triplet mi kontrol edilsin?
singleCheck = 0
greylistd servisini başlatın ve otomatik başlayacak şekilde ayarlayın:
systemctl start greylistd
systemctl enable greylistd
systemctl status greylistd
Exim ACL Yapılandırması
Greylisting’i Exim’e entegre etmek için ACL (Access Control List) kullanacağız. Exim’in ana yapılandırma dosyası genellikle /etc/exim4/exim4.conf.template veya /etc/exim4/conf.d/acl/ dizini altında bulunur.
Önce mevcut yapılandırmanızı yedekleyin:
cp /etc/exim4/exim4.conf.template /etc/exim4/exim4.conf.template.bak
# veya tüm conf.d dizinini
cp -r /etc/exim4/conf.d/ /etc/exim4/conf.d.bak/
ACL yapılandırma dosyasını açın. Split config kullanıyorsanız:
nano /etc/exim4/conf.d/acl/30_exim4-config_check_rcpt
RCPT TO aşamasında greylisting kontrolü ekleyin. Bu, en verimli nokta çünkü zarflın tamamlanmadan önce kontrolü yapıyoruz:
# Greylisting ACL bloğu - RCPT TO aşamasında
deny message = Greylisted, please retry later
!hosts = ${if exists{/etc/exim4/greylisting_whitelist}
{/etc/exim4/greylisting_whitelist}{}}
!authenticated = *
condition = ${readsocket{/var/run/greylistd/socket}
{${sender_host_address} ${sender_address} ${local_part}@${domain}}
{5s}{}{false}
}
condition = ${if eq{$value}{white}{false}{true}}
Eğer readsocket ile direkt greylistd soketini kullanmak istiyorsanız daha temiz bir versiyon:
# Greylisting - greylistd socket üzerinden
defer message = Greylisted: $sender_host_address. Try again later.
log_message = Greylisted $sender_host_address ($sender_host_name)
!hosts = +relay_from_hosts
!hosts = +mynetworks
!authenticated = *
condition = ${readsocket{/var/run/greylistd/socket}
{${sender_host_address} ${sender_address}
${local_part}@${domain}}
{5s}
{}
{false}}
condition = ${if eq{$value}{grey}{true}{false}}
Burada defer kullanmak önemli. deny kullanırsanız kalıcı red gönderirsiniz (5xx kodu), defer ise geçici red (4xx kodu) gönderir ve SMTP standartlarına göre gönderen tekrar denemelidir.
Beyaz Liste Yönetimi
Greylisting’in en büyük pratik sorunu, büyük servis sağlayıcıların (Gmail, Outlook, Yahoo gibi) çok sayıda farklı IP’den mail göndermesidir. Bu durumda greylisting bazen gecikmelere yol açabilir.
Statik beyaz liste dosyası oluşturun:
nano /etc/exim4/greylisting_whitelist
İçeriğine güvendiğiniz IP aralıklarını ekleyin:
# Google Mail
74.125.0.0/16
209.85.128.0/17
# Microsoft/Outlook
40.92.0.0/15
40.107.0.0/16
52.100.0.0/14
# Amazon SES
199.255.192.0/22
199.127.232.0/22
54.240.0.0/18
# Yerel ağ
192.168.0.0/16
10.0.0.0/8
greylistd’nin kendi whitelist mekanizmasını da kullanabilirsiniz. Elle beyaz listeye eklemek için:
# Belirli bir IP'yi whitelist'e ekle
greylistd --add-white 203.0.113.45
# Whitelist içeriğini görüntüle
greylistd --dump-white
# Greylisted mailleri görüntüle
greylistd --dump-grey
SQLite ile Manuel Greylisting Sistemi
greylistd kullanmak istemiyorsanız veya daha fazla kontrol istiyorsanız, Exim’in yerleşik ${lookup sqlite} özelliğiyle kendi greylisting sisteminizi kurabilirsiniz. Bu yaklaşım daha esnektir.
Önce SQLite veritabanını oluşturun:
# Veritabanı dizini oluştur
mkdir -p /var/lib/exim-greylisting
chown Debian-exim:Debian-exim /var/lib/exim-greylisting
# CentOS için: chown exim:exim /var/lib/exim-greylisting
# SQLite veritabanı ve tabloyu oluştur
sqlite3 /var/lib/exim-greylisting/greylist.db << 'EOF'
CREATE TABLE IF NOT EXISTS greylist (
id INTEGER PRIMARY KEY AUTOINCREMENT,
sender_ip TEXT NOT NULL,
sender_email TEXT NOT NULL,
recipient_email TEXT NOT NULL,
first_seen INTEGER NOT NULL,
last_seen INTEGER NOT NULL,
count INTEGER DEFAULT 1,
whitelisted INTEGER DEFAULT 0
);
CREATE INDEX IF NOT EXISTS idx_triplet ON greylist(sender_ip, sender_email, recipient_email);
CREATE INDEX IF NOT EXISTS idx_whitelisted ON greylist(whitelisted);
EOF
chmod 660 /var/lib/exim-greylisting/greylist.db
chown Debian-exim:Debian-exim /var/lib/exim-greylisting/greylist.db
Exim ACL’de SQLite lookup kullanımı:
# exim4.conf veya ilgili ACL dosyasına ekle
# Greylisting için yardımcı ACL tanımı
acl_check_greylisting:
# Zaten whitelist'te mi?
accept
condition = ${lookup sqlite{/var/lib/exim-greylisting/greylist.db
SELECT whitelisted FROM greylist
WHERE sender_ip='${quote_sqlite:$sender_host_address}'
AND sender_email='${quote_sqlite:$sender_address}'
AND recipient_email='${quote_sqlite:${local_part}@${domain}}'
AND whitelisted=1 LIMIT 1}{$value}{}}
condition = ${if eq{$value}{1}{true}{false}}
# Kaydı güncelle veya oluştur
warn
condition = ${lookup sqlite{/var/lib/exim-greylisting/greylist.db
INSERT OR IGNORE INTO greylist
(sender_ip,sender_email,recipient_email,first_seen,last_seen,count)
VALUES('${quote_sqlite:$sender_host_address}',
'${quote_sqlite:$sender_address}',
'${quote_sqlite:${local_part}@${domain}}',
strftime('%s','now'),strftime('%s','now'),1)}{yes}{no}}
# 5 dakikadan fazla geçtiyse whitelist'e al
accept
condition = ${lookup sqlite{/var/lib/exim-greylisting/greylist.db
SELECT id FROM greylist
WHERE sender_ip='${quote_sqlite:$sender_host_address}'
AND sender_email='${quote_sqlite:$sender_address}'
AND recipient_email='${quote_sqlite:${local_part}@${domain}}'
AND (strftime('%s','now') - first_seen) > 300}{$value}{}}
condition = ${lookup sqlite{/var/lib/exim-greylisting/greylist.db
UPDATE greylist SET whitelisted=1, last_seen=strftime('%s','now')
WHERE sender_ip='${quote_sqlite:$sender_host_address}'
AND sender_email='${quote_sqlite:$sender_address}'
AND recipient_email='${quote_sqlite:${local_part}@${domain}}'}{yes}{no}}
# Henüz zaman geçmedi, greylisted
defer
message = Greylisted. Please retry in a few minutes.
log_message = GREYLISTED: $sender_host_address <$sender_address>
Eski Kayıtları Temizleme
Greylisting veritabanı zamanla şişer. Düzenli temizlik için cron job kurun:
nano /etc/cron.daily/exim-greylist-cleanup
Temizlik scripti:
#!/bin/bash
# /etc/cron.daily/exim-greylist-cleanup
DB="/var/lib/exim-greylisting/greylist.db"
LOG="/var/log/exim-greylist-cleanup.log"
echo "$(date): Greylisting temizliği başladı" >> $LOG
# 7 günden eski whitelist olmayan kayıtları sil
sqlite3 $DB "DELETE FROM greylist WHERE whitelisted=0 AND (strftime('%s','now') - first_seen) > 604800;"
# 60 günden eski whitelist kayıtlarını sil (artık aktif değiller)
sqlite3 $DB "DELETE FROM greylist WHERE whitelisted=1 AND (strftime('%s','now') - last_seen) > 5184000;"
# Veritabanını optimize et
sqlite3 $DB "VACUUM;"
GREY_COUNT=$(sqlite3 $DB "SELECT COUNT(*) FROM greylist WHERE whitelisted=0;")
WHITE_COUNT=$(sqlite3 $DB "SELECT COUNT(*) FROM greylist WHERE whitelisted=1;")
echo "$(date): Grey: $GREY_COUNT, White: $WHITE_COUNT" >> $LOG
chmod +x /etc/cron.daily/exim-greylist-cleanup
Exim Yapılandırmasını Test Etme ve Doğrulama
Her değişiklikten sonra Exim yapılandırmasını test etmek şart:
# Syntax kontrolü
exim -bV
exim4 -C /etc/exim4/exim4.conf -bV
# Split config kullananlar için önce tek dosyaya birleştir
update-exim4.conf
exim4 -bV
# Mail akışını test et (debug modu)
exim -bhc 203.0.113.100
# Bu komut interaktif SMTP simülasyonu başlatır
Greylisting’in çalışıp çalışmadığını log’lardan takip edin:
# Exim main log'unu izle
tail -f /var/log/exim4/mainlog | grep -i grey
# Greylisted mesajları filtrele
grep "GREYLISTED|greylisted|Greylisted" /var/log/exim4/mainlog | tail -20
# Son 1 saatte greylisted olan IP'ler
grep "GREYLISTED" /var/log/exim4/mainlog | awk '{print $NF}' | sort | uniq -c | sort -rn | head -20
Gerçek Dünya Senaryosu: E-Ticaret Sitesi Mail Altyapısı
Orta ölçekli bir e-ticaret şirketinde yaşanan gerçekçi bir senaryoyu ele alalım. Şirketin mail sunucusu günde yaklaşık 50.000 mail alıyor ve bunların %70’i spam. SpamAssassin tek başına yeterli gelmiyor, sunucu CPU kullanımı %40’lara çıkıyor.
Greylisting eklendikten sonra durum şöyle değişti: Spam botlarının %65’i tek deneme yapıp vazgeçti. Geriye kalan %35 için SpamAssassin çalıştı. CPU kullanımı %40’tan %15’e düştü. Meşru mailler için ortalama gecikme ilk bağlantıda 5 dakika, sonraki bağlantılarda sıfır.
Bu senaryoda kritik bir sorunla karşılaştılar: Büyük bir muşteri ödeme onayı maillerini alamıyordu. Sorun, ödeme sisteminin farklı IP havuzlarından mail göndermesiydi. Çözüm, ödeme sisteminin IP aralığını whitelist’e eklemekti:
# /etc/exim4/greylisting_whitelist dosyasına eklendi
# Ödeme sistemi IP aralıkları
185.x.x.0/24
91.x.x.0/24
Bu tür sorunları proaktif çözmek için kritik gönderici listesi tutun ve onboarding sürecinde yeni servisleri whitelist’e ekleyin.
İzleme ve Raporlama
Greylisting sisteminin etkinliğini düzenli izlemek için basit bir rapor scripti:
#!/bin/bash
# /usr/local/bin/greylist-report.sh
echo "=== Greylisting Günlük Raporu ==="
echo "Tarih: $(date)"
echo ""
MAINLOG="/var/log/exim4/mainlog"
TODAY=$(date +"%Y-%m-%d")
echo "--- Bugün Greylisted ---"
grep "$TODAY" $MAINLOG | grep -i "greylisted" | wc -l
echo ""
echo "--- En Çok Greylisted IP'ler (Son 24 saat) ---"
grep "$TODAY" $MAINLOG | grep "GREYLISTED" |
grep -oP 'd+.d+.d+.d+' | sort | uniq -c | sort -rn | head -10
echo ""
echo "--- Whitelist'e Geçen Bağlantılar ---"
grep "$TODAY" $MAINLOG | grep "greylisting_passed|white" | wc -l
if command -v greylistd &> /dev/null; then
echo ""
echo "--- greylistd İstatistikleri ---"
greylistd --statistics 2>/dev/null || echo "İstatistik alınamadı"
fi
Bu scripti cron ile günlük çalıştırıp mail ile alabilirsiniz:
chmod +x /usr/local/bin/greylist-report.sh
echo "0 8 * * * root /usr/local/bin/greylist-report.sh | mail -s 'Greylisting Raporu' [email protected]" >> /etc/crontab
Greylisting ile Birlikte Kullanılabilecek Yöntemler
Greylisting tek başına mükemmel değildir. En iyi sonucu şu yöntemlerle birlikte kullanıldığında verir:
- SPF (Sender Policy Framework): Gönderenin gerçekten o sunucudan geldiğini doğrular. Greylisting öncesinde SPF kontrolü yapılırsa yanlış pozitifler azalır.
- DKIM: Mailin içeriğinin değiştirilmediğini doğrular.
- DMARC: SPF ve DKIM politikalarını birleştiren üst katman.
- RBL/DNSBL Kontrolleri: Bilinen spam IP’lerini gerçek zamanlı olarak bloke eder. Greylisting ile birlikte kullanıldığında çok güçlü bir savunma oluşturur.
- SpamAssassin: İçerik tabanlı filtreleme için greylisting’i geçen maillere uygulanabilir.
- Rate Limiting: Tek IP’den gelen bağlantı sayısını sınırlamak için Exim’in
ratelimitözelliği kullanılabilir.
Bu katmanlı yaklaşımla spam oranınızı %95’in üzerinde azaltmak mümkün.
Yaygın Sorunlar ve Çözümleri
Sorun: Greylisting bazı legitim mailleri çok uzun süre geciktiriyor
Bazı mail sunucuları retry aralığını çok uzun tutar. Bu durumda retryMin değerini 60 saniyeye düşürebilirsiniz. Ayrıca büyük e-posta servis sağlayıcılarının IP aralıklarını whitelist’e almanız önerilir.
Sorun: greylistd soketi bulunamıyor
ls -la /var/run/greylistd/
# Soket yoksa daemon'u yeniden başlatın
systemctl restart greylistd
Sorun: Exim yapılandırma değişikliklerinin etkisi yok
# Split config kullananlar için
update-exim4.conf && systemctl reload exim4
# Tek dosya kullananlar için
systemctl reload exim4
Sorun: Veritabanı kilitleniyor
SQLite yoğun yük altında kilit sorunları yaşayabilir. Bu durumda PostgreSQL tabanlı bir çözüme veya greylistd’nin dosya tabanlı sistemine geçmek daha stabil sonuç verir.
Sonuç
Greylisting, minimal çabayla maksimum etki sağlayan nadir anti-spam yöntemlerinden biridir. Exim’in güçlü ACL mekanizmasıyla birleştirildiğinde, geliştirilebilir ve ölçeklenebilir bir spam savunma katmanı elde edersiniz.
Temel çıkarımları özetlersek: greylistd ile hızlı bir kurulum yapabilir, kritik göndericileri whitelist’e alarak yanlış pozitiflerden kaçınabilirsiniz. Veritabanını düzenli temizleyerek performansı koruyabilirsiniz. Greylisting’i tek çözüm olarak görmeyip SPF, DKIM, RBL kontrolleri ile katmanlı bir savunma inşa etmek uzun vadede çok daha sağlam sonuçlar verir.
Küçük bir e-posta altyapısı işletiyorsanız greylistd yeterli ve basittir. Kurumsal ölçekte bir altyapınız varsa SQLite yerine PostgreSQL’e geçmeyi ve merkezi bir greylisting yönetim arayüzü kurmayı düşünün. Her iki durumda da greylisting, mail sunucunuzun kaynak kullanımını gözle görülür biçimde azaltacak ve postfix yönetim hayatınızı kolaylaştıracaktır.