Mail sunucusu yönetiminde en çok baş ağrıtan konuların başında spam ve yetkisiz kullanım geliyor. Postfix’i kurdunuz, temel yapılandırmayı yaptınız, ama sunucunuz hala istenmeyen maillere açık mı? İşte tam bu noktada sender ve recipient kısıtlamaları devreye giriyor. Bu yazıda Postfix’in güçlü kısıtlama mekanizmalarını gerçek dünya senaryolarıyla ele alacağız.
Postfix Kısıtlama Mimarisi
Postfix, gelen bağlantıları ve mailleri birden fazla aşamada değerlendiriyor. Her aşamada farklı kısıtlama parametreleri devreye giriyor ve bu parametreler sırayla kontrol ediliyor. Bir kısıtlama permit veya reject döndürdüğünde o aşamadaki değerlendirme duruyor.
Temel kısıtlama parametreleri şunlar:
- smtpd_client_restrictions: Bağlanan istemciye göre kısıtlama
- smtpd_helo_restrictions: HELO/EHLO komutuna göre kısıtlama
- smtpd_sender_restrictions: MAIL FROM komutuna göre kısıtlama
- smtpd_recipient_restrictions: RCPT TO komutuna göre kısıtlama
- smtpd_data_restrictions: DATA komutuna göre kısıtlama
- smtpd_relay_restrictions: Relay izinleri için kısıtlama
Bu parametreler main.cf dosyasında tanımlanıyor ve Postfix her yeni SMTP bağlantısında bu kuralları sırayla uyguluyor.
Temel Kısıtlama Direktifleri
Kısıtlamalarda kullanabileceğiniz temel direktifleri anlamak çok önemli. En sık kullanılanlar:
- permit: Bağlantıya izin ver, diğer kısıtlamaları atla
- reject: Bağlantıyı reddet
- defer: Geçici hata döndür (421)
- warn_if_reject: Reddetmek yerine logla
- permit_mynetworks: Yerel ağlardan gelen bağlantılara izin ver
- permit_sasl_authenticated: SASL ile doğrulanmış kullanıcılara izin ver
- reject_unauth_destination: Yetkisiz relay girişimlerini reddet
- reject_unknown_sender_domain: Bilinmeyen gönderici domainlerini reddet
- reject_invalid_helo_hostname: Geçersiz HELO isimlerini reddet
- check_client_access: Erişim tablosuna göre kontrol et
- check_sender_access: Gönderici tablosuna göre kontrol et
- check_recipient_access: Alıcı tablosuna göre kontrol et
Sender Kısıtlamaları
HELO Kısıtlamaları ile Başlamak
Birçok spam gönderici, HELO aşamasında kendini ele veriyor. Geçersiz veya sahte HELO değerleri kullanan bağlantıları bu aşamada bloklayabilirsiniz.
# /etc/postfix/main.cf
smtpd_helo_required = yes
smtpd_helo_restrictions =
permit_mynetworks,
reject_invalid_helo_hostname,
reject_non_fqdn_helo_hostname,
reject_unknown_helo_hostname
smtpd_helo_required = yes ayarı HELO/EHLO göndermeden devam etmeye çalışan istemcileri engelliyor. reject_unknown_helo_hostname ise DNS’de kaydı olmayan hostnamelerle gelen bağlantıları reddediyor. Bu ayar agresif olabilir, önce warn_if_reject ile test edin.
MAIL FROM Kısıtlamaları
Gönderici kısıtlamaları smtpd_sender_restrictions parametresiyle yapılandırılıyor. Burada göndericinin domain geçerliliğini, kara listeye alınıp alınmadığını ve başka kriterleri kontrol edebilirsiniz.
# /etc/postfix/main.cf
smtpd_sender_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_non_fqdn_sender,
reject_unknown_sender_domain,
check_sender_access hash:/etc/postfix/sender_access,
reject_unverified_sender
Bu yapılandırmayı açıklayalım:
- Önce yerel ağdan ve SASL ile doğrulanmış kullanıcılara izin veriliyor
reject_non_fqdn_sender: Tam nitelikli domain adı olmayan göndericileri reddediyorreject_unknown_sender_domain: MX veya A kaydı olmayan domainleri reddediyorcheck_sender_access: Özel erişim tablomuzu kontrol ediyorreject_unverified_sender: Postfix’in gönderici adresini doğrulamasını sağlıyor
Özel Sender Erişim Tablosu Oluşturma
Belirli göndericileri veya domainleri kara listeye almak ya da beyaz listeye eklemek için erişim tabloları kullanıyoruz.
# /etc/postfix/sender_access dosyası
# Kara listeye alınan domainler
spammer.com REJECT Spamdomain kabul edilmiyor
baddomain.net REJECT Kotu niceli domain
@phishing.org REJECT Bu domainden mail kabul edilmiyor
# Belirli adresler engelle
[email protected] REJECT Bu adres kara listede
# Beyaz listeye al (erken permit)
[email protected] OK
@trusted-partner.net OK
Tabloyu oluşturduktan sonra hash formatına derlemeniz gerekiyor:
postmap /etc/postfix/sender_access
postfix reload
reject_unverified_sender Kullanımı
Bu direktif Postfix’in gönderici adresinin gerçekten var olup olmadığını kontrol etmesini sağlıyor. Ancak dikkatli kullanın, bazı mail sunucuları doğrulama isteklerini reddedebilir.
# main.cf'e eklenecek ek ayarlar
unverified_sender_reject_code = 550
unverified_sender_defer_code = 450
address_verify_negative_cache = yes
address_verify_negative_expire_time = 3d
address_verify_positive_expire_time = 31d
Recipient Kısıtlamaları
Temel Recipient Yapılandırması
Alıcı kısıtlamaları, hangi adreslere mail kabul edeceğinizi belirliyor. Bu en kritik kısıtlama noktası çünkü açık relay’i burada engelliyoruz.
# /etc/postfix/main.cf
smtpd_recipient_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination,
reject_non_fqdn_recipient,
reject_unknown_recipient_domain,
check_recipient_access hash:/etc/postfix/recipient_access,
check_policy_service inet:127.0.0.1:10023,
reject_rbl_client zen.spamhaus.org,
reject_rbl_client bl.spamcop.net
reject_unauth_destination buradaki en önemli direktif. Bu olmadan sunucunuz açık relay haline gelir ve spam göndermek için kullanılabilir. Bu direktifi asla atlamamalısınız.
Recipient Erişim Tablosu
Belirli alıcıları özelleştirmek için recipient erişim tablosu kullanıyoruz:
# /etc/postfix/recipient_access
# Belirli adreslere gelen mailleri reddet
[email protected] REJECT Bu adres artik aktif degil
[email protected] REJECT Lutfen yeni adresimizi kullanin: [email protected]
# Belirli bir kullanici icin ozel islem
[email protected] OK
# Bir alt domain icin tamamen engelleme
@old-subdomain.example.com REJECT Bu subdomain kapatilmistir
postmap /etc/postfix/recipient_access
postfix reload
Bilinmeyen Kullanıcıları Reddetmek
Sisteminizde olmayan kullanıcılara gelen mailleri kabul edip sonra bouncing yapmak yerine, SMTP aşamasında reddetmek çok daha temiz bir yaklaşım. Bunun için local_recipient_maps kullanıyoruz.
# main.cf
local_recipient_maps = proxy:unix:passwd.byname $alias_maps
unknown_local_recipient_reject_code = 550
Postfix destekli kullanıcı listesi için:
# Virtual mailbox kullanıyorsanız
virtual_mailbox_maps = hash:/etc/postfix/vmailbox
local_recipient_maps = $virtual_mailbox_maps
RBL (Realtime Blackhole List) Entegrasyonu
RBL listeleri, bilinen spam göndericilerini ve kötü niyetli IP adreslerini içeriyor. Postfix bu listeleri DNS sorgusu ile kontrol edebiliyor.
# main.cf - RBL konfigürasyonu
smtpd_recipient_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination,
reject_rbl_client zen.spamhaus.org=127.0.0.4,
reject_rbl_client zen.spamhaus.org=127.0.0.11,
reject_rbl_client bl.spamcop.net,
reject_rbl_client dnsbl.sorbs.net,
reject_rhsbl_sender dsn.rfc-ignorant.org,
permit
RBL listelerinde = ile belirli dönüş kodlarını filtreleyebilirsiniz. Spamhaus ZEN listesinde 127.0.0.4 SBL listesini, 127.0.0.11 ise PBL (Policy Block List) listesini temsil ediyor.
Önemli not: Bazı RBL listeleri ücretli veya kayıt gerektiriyor. Yüksek hacimli sorgularda Spamhaus gibi listelerin ticari kullanım şartlarını kontrol edin.
RBL Bypass Listesi
Bazen güvenilir bir sunucu RBL’de listelenmiş olabilir. Bu durumda bypass listesi kullanıyoruz:
# main.cf
smtpd_client_restrictions =
check_client_access hash:/etc/postfix/rbl_override,
reject_rbl_client zen.spamhaus.org
# /etc/postfix/rbl_override
192.168.1.100 OK
trusted-server.partner.com OK
Gerçek Dünya Senaryoları
Senaryo 1: Kurumsal Mail Sunucusu Güvenlik Sertleştirmesi
Diyelim ki 500 kullanıcılı bir şirketin mail sunucusunu yönetiyorsunuz. Şikayetlerin yoğunlaştığı konular: çok fazla spam geliyor, bazı çalışanlar kimlik avı maillerine düşüyor.
# /etc/postfix/main.cf - Kurumsal profil
# HELO kısıtlamaları
smtpd_helo_required = yes
smtpd_helo_restrictions =
permit_mynetworks,
reject_invalid_helo_hostname,
reject_non_fqdn_helo_hostname
# Gönderici kısıtlamaları
smtpd_sender_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_non_fqdn_sender,
reject_unknown_sender_domain,
check_sender_access hash:/etc/postfix/sender_access
# Alıcı kısıtlamaları
smtpd_recipient_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination,
reject_non_fqdn_recipient,
reject_unknown_recipient_domain,
reject_unknown_client_hostname,
check_recipient_access hash:/etc/postfix/recipient_access,
reject_rbl_client zen.spamhaus.org,
reject_rbl_client bl.spamcop.net,
permit
# Rate limiting
smtpd_client_connection_rate_limit = 30
smtpd_client_message_rate_limit = 50
anvil_rate_time_unit = 60s
Senaryo 2: Hosting Firması – Çok Kiracılı Yapı
Hosting firmanızda her müşterinin ayrı domain ve kullanıcıları var. Kısıtlamaları virtual domain yapısıyla uyumlu hale getirmek gerekiyor.
# Virtual domain için recipient kısıtlamaları
smtpd_recipient_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination,
check_recipient_access mysql:/etc/postfix/mysql-recipient-access.cf,
reject_rbl_client zen.spamhaus.org,
permit
# Outbound için ayrı kısıtlama (submission port 587)
# master.cf
submission inet n - n - - smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
-o smtpd_sender_restrictions=reject_sender_login_mismatch
-o smtpd_recipient_restrictions=permit_sasl_authenticated,reject_unauth_destination
Senaryo 3: Kısıtlamaları Test Etme ve Debug
Yeni kısıtlamalar eklemeden önce mutlaka test edin. warn_if_reject direktifi gerçek reddetme yapmadan logu incelemenizi sağlıyor.
# Test modu - önce logları izle
smtpd_recipient_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination,
warn_if_reject reject_unknown_client_hostname,
warn_if_reject reject_rbl_client zen.spamhaus.org,
permit
Mail loglarını takip etmek için:
# Gerçek zamanlı log takibi
tail -f /var/log/mail.log | grep -E "(reject|warning|permit)"
# Reddedilen mailleri özetle
grep "reject" /var/log/mail.log | awk '{print $NF}' | sort | uniq -c | sort -rn | head -20
# Belirli bir IP'nin durumunu kontrol et
postmap -q "192.168.1.100" cidr:/etc/postfix/client_access
Postscreen ile Ön Filtreleme
Postfix 2.8 ile gelen postscreen özelliği, gerçek SMTP bağlantısına geçmeden önce IP tabanlı kontroller yapıyor. Bu, sunucu kaynaklarını önemli ölçüde koruyor.
# master.cf
smtp inet n - n - 1 postscreen
smtpd pass - - n - - smtpd
dnsblog unix - - n - 0 dnsblog
tlsproxy unix - - n - 0 tlsproxy
# main.cf - postscreen ayarları
postscreen_access_list = permit_mynetworks,
cidr:/etc/postfix/postscreen_access.cidr
postscreen_blacklist_action = drop
postscreen_greet_action = enforce
postscreen_dnsbl_action = enforce
postscreen_dnsbl_threshold = 3
postscreen_dnsbl_sites =
zen.spamhaus.org*2,
bl.spamcop.net*1,
b.barracudacentral.org*2,
psbl.surriel.com*1
postscreen_dnsbl_whitelist_threshold = -2
Postscreen puan sistemiyle çalışıyor. Her RBL listesinden alınan puan toplanıyor ve eşik değeri aşıldığında bağlantı reddediliyor.
Header ve Body Kısıtlamaları
SMTP aşamasındaki kısıtlamaların yanı sıra mail başlıklarını da filtreleyebilirsiniz:
# main.cf
header_checks = regexp:/etc/postfix/header_checks
body_checks = regexp:/etc/postfix/body_checks
mime_header_checks = regexp:/etc/postfix/mime_header_checks
# /etc/postfix/header_checks
/^Subject:.*[SPAM]/ PREPEND X-Spam-Flag: YES
/^From:.*@known-phishing.com/ REJECT Kimlik avi denemesi tespit edildi
/^X-Mailer: The Bat/ WARN Eski mail istemcisi kullaniliyor
# /etc/postfix/body_checks
/casino|viagra|phishing-link.com/i REJECT Icerik filtresine takıldı
postmap -q - regexp:/etc/postfix/header_checks << 'EOF'
Subject: Test [SPAM] maili
EOF
Kısıtlama Sıralamasının Önemi
Postfix kısıtlamaları sırayla değerlendiriyor ve ilk eşleşmede duruyor. Bu yüzden sıralama kritik:
# DOGRU sıralama
smtpd_recipient_restrictions =
permit_mynetworks, # 1. Yerel ağa her zaman izin ver
permit_sasl_authenticated, # 2. Doğrulanmış kullanıcılara izin ver
reject_unauth_destination, # 3. Yetkisiz relay'i engelle
reject_non_fqdn_recipient, # 4. Format kontrolleri
reject_unknown_recipient_domain, # 5. Domain kontrolleri
check_recipient_access hash:/etc/postfix/recipient_access, # 6. Özel listeler
reject_rbl_client zen.spamhaus.org, # 7. Kara listeler
permit # 8. Geriye kalanları kabul et
# YANLIS sıralama - reject_unauth_destination olmadan açık relay!
smtpd_recipient_restrictions =
permit_mynetworks,
reject_rbl_client zen.spamhaus.org, # RBL önce gelirse sorun yok ama...
permit_sasl_authenticated,
permit # Bu son permit herkese izin veriyor!
Güvenlik İzleme ve Log Analizi
Kısıtlamalar kurulduktan sonra düzenli izleme şart:
#!/bin/bash
# /usr/local/bin/postfix-stats.sh
# Günlük mail istatistikleri
echo "=== Postfix Gunluk Rapor ==="
echo "Tarih: $(date)"
echo ""
echo "--- Reddedilen Baglantılar ---"
grep "$(date +%b %d)" /var/log/mail.log | grep "reject:" | wc -l
echo "--- RBL Engelleri ---"
grep "$(date +%b %d)" /var/log/mail.log | grep "blocked using" |
awk -F'blocked using' '{print $2}' | sort | uniq -c | sort -rn
echo "--- En Cok Reddedilen IP'ler ---"
grep "$(date +%b %d)" /var/log/mail.log | grep "reject:" |
awk '{print $6}' | cut -d'[' -f2 | cut -d']' -f1 |
sort | uniq -c | sort -rn | head -10
echo "--- Kabul Edilen Mailler ---"
grep "$(date +%b %d)" /var/log/mail.log | grep "status=sent" | wc -l
Bu scripti cron ile günlük çalıştırabilirsiniz:
chmod +x /usr/local/bin/postfix-stats.sh
echo "0 8 * * * root /usr/local/bin/postfix-stats.sh | mail -s 'Postfix Raporu' [email protected]" >> /etc/cron.d/postfix-stats
Sık Yapılan Hatalar
Kurulum ve yapılandırma sırasında karşılaşılan yaygın hatalar:
- reject_unauth_destination unutmak: Sunucunuzu açık relay haline getirir. Her zaman ekleyin.
- Çok agresif HELO kısıtlamaları:
reject_unknown_helo_hostnamebazı meşru sunucuları engelleyebilir. - RBL listelerini test etmeden production’a almak: Önce
warn_if_rejectile test edin. - permit_mynetworks’ü sona koymak: Her zaman listenin başında olmalı.
- Hash tablosunu yeniden derlememek:
postmapçalıştırmadan yapılan değişiklikler etkisiz kalır. - Kısıtlama değişikliğinden sonra reload yapmamak:
postfix reloadşart.
Sonuç
Postfix sender ve recipient kısıtlamaları, mail sunucunuzun güvenliğinin temel taşlarını oluşturuyor. Doğru yapılandırılmış kısıtlamalar sunucunuzu açık relay olmaktan koruyor, spam yükünü önemli ölçüde azaltıyor ve meşru maillerinizin güvenli şekilde iletilmesini sağlıyor.
Temel yaklaşımı şöyle özetleyebilirim: Önce koruyucu kısıtlamaları ekleyin ve warn_if_reject ile test edin. Log çıktılarını analiz edin, false positive’leri tespit edin, gerekirse istisnalar tanımlayın. Sonrasında enforce moduna alın ve izlemeye devam edin.
Postscreen eklediğinizde ise bu filtreleme katmanı çok daha verimli çalışıyor çünkü bilinen kötü IP adreslerini SMTP handshake’e bile sokmadan eliyor. Sunucu kaynaklarınızı önemli ölçüde koruyorsunuz.
Her ortam farklı gereksinimlere sahip. 10 kullanıcılı küçük bir şirket ile 10.000 kullanıcılı hosting firmasının ihtiyaçları farklı. Kısıtlama profilinizi kendi kullanım senaryonuza göre uyarlayın ve düzenli olarak log analizleriyle gözden geçirin. Mail güvenliği statik bir yapılandırma değil, sürekli gelişen bir süreç.