Mail sunucusu yönetiminin en kritik ve sık ihtiyaç duyulan konularından biri, gelen maillerin doğru kişilere veya sistemlere yönlendirilmesi. Küçük bir işletmede bile “[email protected]” adresine gelen maillerin birden fazla kişiye ulaşması, “[email protected]” adresine gelen maillerin yeni adrese yönlendirilmesi gibi onlarca senaryo ortaya çıkar. Postfix bu ihtiyaçları karşılamak için oldukça esnek bir yapı sunar. Bu yazıda alias yönetiminden sanal domain yönlendirmesine, transport tablolarından header manipülasyonuna kadar gerçek dünyada işinize yarayacak senaryoları ele alacağız.
Temel Kavramlar: Alias mi, Redirect mi?
Başlamadan önce bazı terimleri netleştirmek gerekiyor. Postfix dünyasında birbirine karışan birkaç kavram var:
- Alias: Bir mail adresini başka bir adrese veya yerel kullanıcıya eşler. Genellikle aynı domain içinde çalışır.
- Yönlendirme (Redirect/Forward): Gelen maili farklı bir adrese veya farklı bir domain’e gönderir.
- Virtual Alias: Sanal (gerçek sistem kullanıcısı olmayan) adresler için yapılan eşlemeler.
- Transport: Mailin hangi mekanizma veya sunucu üzerinden iletileceğini belirler.
Bu kavramları karıştırmak yapılandırma hatalarına yol açar. Şimdi her birini sırayla ele alalım.
/etc/aliases: Sistem Düzeyinde Alias Yönetimi
Postfix’in en temel alias mekanizması /etc/aliases dosyasıdır. Bu dosya aslında Sendmail’den miras kalan bir yapıdır ama Postfix tam uyumlu şekilde kullanır.
# /etc/aliases dosyasının mevcut içeriğini görelim
cat /etc/aliases
# Tipik bir /etc/aliases içeriği:
# postmaster: root
# root: [email protected]
Dosyayı düzenledikten sonra mutlaka newaliases komutu çalıştırılmalıdır. Bu komut /etc/aliases dosyasını derleyerek Postfix’in okuyabileceği hash formatına dönüştürür.
# /etc/aliases dosyasını düzenliyoruz
nano /etc/aliases
Tipik bir kurumsal senaryo için /etc/aliases içeriği şöyle görünebilir:
# Sistem adresleri
postmaster: root
mailer-daemon: postmaster
root: [email protected]
# Departman adresleri - birden fazla kişiye yönlendirme
info: [email protected], [email protected], [email protected]
destek: [email protected]
satis: [email protected]
# Eski adreslerden yeni adreslere yönlendirme
eski.calisan: [email protected]
# Dış adrese yönlendirme
ceo: [email protected]
# Bir programa pipe etme (mail içeriğini işleme)
logparser: |/usr/local/bin/mail-parser.sh
# Dosyaya kaydetme
arsiv: /var/mail/arsiv/genel.mbox
# Liste benzeri yapı için include
ekip: :include:/etc/mail/ekip-listesi.txt
Düzenlemeden sonra:
# aliases veritabanını yenile
newaliases
# Postfix'i yeniden yükle
systemctl reload postfix
# Alias'ın çalışıp çalışmadığını test et
echo "Test mesaji" | mail -s "Alias Test" [email protected]
Dikkat edilmesi gereken nokta: /etc/aliases yalnızca yerel teslimat için çalışır. Yani Postfix’in mydestination direktifinde tanımlı domain’lere gelen mailler için geçerlidir.
Virtual Alias Maps: Sanal Domain Yönetimi
Birden fazla domain’i tek bir Postfix sunucusunda yönetiyorsanız virtual_alias_maps direktifi devreye girer. Bu özellikle hosting ortamlarında veya birden fazla şirket domain’ini yöneten yapılarda kritik önem taşır.
Önce main.cf dosyasına gerekli direktifi ekliyoruz:
nano /etc/postfix/main.cf
# main.cf içine eklenecekler
virtual_alias_domains = sirket.com, yenisirket.com, eski-domain.com
virtual_alias_maps = hash:/etc/postfix/virtual
Şimdi /etc/postfix/virtual dosyasını oluşturalım:
nano /etc/postfix/virtual
# /etc/postfix/virtual içeriği
# sirket.com için tanımlar
[email protected] [email protected], [email protected]
[email protected] [email protected]
[email protected] [email protected]
[email protected] [email protected]
# eski-domain.com -> sirket.com yönlendirmeleri
@eski-domain.com [email protected] # Catch-all
[email protected] [email protected]
[email protected] [email protected]
# yenisirket.com için tanımlar
@yenisirket.com [email protected] # Tüm mailler arşive
# Catch-all: Belirli bir adrese eşleşmeyenlerin hepsi buraya
@sirket.com [email protected]
Virtual map dosyasını derleyip Postfix’i yeniden başlatıyoruz:
# Hash veritabanı oluştur
postmap /etc/postfix/virtual
# Doğrulama
postmap -q "[email protected]" hash:/etc/postfix/virtual
# Postfix yeniden yükle
systemctl reload postfix
Önemli: postmap komutunu her değişiklikten sonra çalıştırmayı unutmayın. Aksi takdirde değişiklikler devreye girmez ve sorun gidermek için saatler harcayabilirsiniz.
Canonical Maps: Gönderici ve Alıcı Adres Dönüşümü
Bazen mailin içindeki From: veya To: adreslerini de dönüştürmeniz gerekebilir. Örneğin sunucudan gönderilen otomatik maillerin [email protected] yerine [email protected] olarak görünmesini isteyebilirsiniz.
nano /etc/postfix/main.cf
# Gönderici adresleri için canonical map
sender_canonical_maps = hash:/etc/postfix/sender_canonical
# Alıcı adresleri için canonical map
recipient_canonical_maps = hash:/etc/postfix/recipient_canonical
# Her ikisi için canonical map (daha az granüler kontrol)
# canonical_maps = hash:/etc/postfix/canonical
nano /etc/postfix/sender_canonical
# /etc/postfix/sender_canonical içeriği
# Sunucu kullanıcılarının adreslerini değiştir
root [email protected]
www-data [email protected]
nobody [email protected]
nagios [email protected]
cron [email protected]
# Spesifik hostname bazlı dönüşüm
[email protected]ç.sirket.com [email protected]
# Derle ve yükle
postmap /etc/postfix/sender_canonical
postmap /etc/postfix/recipient_canonical
systemctl reload postfix
# Test: root'tan mail gönder ve From adresini kontrol et
echo "Test" | mail -s "Canonical Test" [email protected]
Transport Maps ile Gelişmiş Yönlendirme
Transport maps, belirli domain’lere veya adreslere gönderilecek maillerin hangi yöntemle iletileceğini kontrol eder. Bu özellikle hibrit mail ortamlarında (bir kısım şirket içi, bir kısım bulut) veya özel relay yapılandırmalarında çok işe yarar.
nano /etc/postfix/main.cf
transport_maps = hash:/etc/postfix/transport
nano /etc/postfix/transport
# /etc/postfix/transport içeriği
# Belirli domain'i farklı bir mail sunucusuna yönlendir
partner-firma.com smtp:[mail.partner-firma.com]:25
# TLS zorunlu relay
guvenli-partner.com smtp:[mail.guvenli-partner.com]:587
# Yerel teslimat zorla (MX kaydına bakma)
dahili.sirket.com local:
# Belirli bir domain için tüm mailleri discard et (sildir)
spam-domain.com discard:
# O365 veya Google Workspace'e relay
office365-domain.com smtp:[smtp.office365.com]:587
# Tüm diğer mailler için varsayılan SMTP
* smtp:
postmap /etc/postfix/transport
systemctl reload postfix
# Transport map'i test et
postmap -q "partner-firma.com" hash:/etc/postfix/transport
Gerçek Dünya Senaryosu: Hibrit Exchange + Postfix Ortamı
Birçok kurumda şöyle bir durum yaşanır: Şirketin bir kısmı hala Exchange kullanırken yeni kullanıcılar Postfix üzerinde. Bu durumda Postfix’in bazı kullanıcıları Exchange’e yönlendirmesi gerekir.
# /etc/postfix/transport
[email protected] smtp:[exchange.iç.sirket.com]:25
# /etc/postfix/virtual
[email protected] [email protected]
Bu yapıda dış dünyadan gelen mail önce Postfix’e gelir, Postfix virtual alias map’e bakarak Exchange’e yönlendirir.
Header Checks ile Mail Manipülasyonu
Bazen sadece adresi değil, mailin header’larını da manipüle etmek gerekir. Bu hem spam filtreleme hem de yönlendirme için kullanılabilir.
nano /etc/postfix/main.cf
# Header kontrolleri
header_checks = regexp:/etc/postfix/header_checks
mime_header_checks = regexp:/etc/postfix/mime_header_checks
nano /etc/postfix/header_checks
# /etc/postfix/header_checks içeriği
# Belirli subject'li mailleri farklı yere yönlendir
/^Subject: [FATURA]/ REDIRECT [email protected]
# Belirli gönderenden gelen mailleri engelle
/^From:.*[email protected]/ REJECT Kabul edilmiyor
# Belirli maillere uyarı ekle
/^Subject: .*/ PREPEND X-Processed-By: postfix-filter-v1
# Büyük attachment subject'ini logla
/^Subject: .*INVOICE.*/ WARN Fatura maili alindi
# header_checks için postmap gerekmez, doğrudan regexp kullanılır
systemctl reload postfix
# Test
postfix check
Büyük Ölçekli Alias Yönetimi için LDAP Entegrasyonu
Yüzlerce kullanıcıdan oluşan bir ortamda alias’ları düz dosyalarla yönetmek çok zorlaşır. Bu durumda LDAP entegrasyonu hayat kurtarır.
nano /etc/postfix/main.cf
# LDAP tabanlı virtual alias
virtual_alias_maps = ldap:/etc/postfix/ldap-aliases.cf
# Veya hem dosya hem LDAP birlikte
virtual_alias_maps = hash:/etc/postfix/virtual, ldap:/etc/postfix/ldap-aliases.cf
nano /etc/postfix/ldap-aliases.cf
# /etc/postfix/ldap-aliases.cf içeriği
server_host = ldap://ldap.sirket.com
server_port = 389
bind = yes
bind_dn = cn=postfix,dc=sirket,dc=com
bind_pw = gizli_sifre
search_base = ou=users,dc=sirket,dc=com
scope = sub
query_filter = (mail=%s)
result_attribute = mailAlternateAddress
# LDAP bağlantısını test et
postmap -q "[email protected]" ldap:/etc/postfix/ldap-aliases.cf
Sorun Giderme: Alias ve Yönlendirme Sorunları
Mail yönlendirme sorunları genellikle birkaç temel nedenden kaynaklanır. Sistematik bir yaklaşımla çoğunu çözebilirsiniz.
# Postfix mail kuyruğunu kontrol et
mailq
postqueue -p
# Belirli bir mail'i debug modda gönder
sendmail -bv [email protected]
# Adres yönlendirmesini test et (teslimat yapmadan)
postmap -q "[email protected]" hash:/etc/postfix/virtual
# Mail loglarını canlı izle
tail -f /var/log/mail.log
# Sadece hataları filtrele
grep -i "reject|error|warning" /var/log/mail.log | tail -50
# Belirli bir adrese giden mailleri izle
tail -f /var/log/mail.log | grep "to=<[email protected]>"
# Postfix yapılandırmasını doğrula
postfix check
postconf -n | grep virtual
postconf -n | grep alias
Sık Karşılaşılan Hatalar ve Çözümleri
- “User unknown in virtual alias table”: Virtual alias dosyasında adres tanımlı değil veya
postmapçalıştırılmamış demektir.postmap /etc/postfix/virtualkomutunu çalıştırın.
- “mail for domain loops back to myself”: Domain hem
mydestinationhemvirtual_alias_domainsiçinde tanımlı. Bu ikisi birbirini dışlar, birinden kaldırın.
- Alias değişikliği sonrası eski davranış:
newaliasesveyapostmapçalıştırılmamış. Her değişiklikten sonra bu komutları çalıştırmayı alışkanlık haline getirin.
- Sonsuz döngü (mail loop): A adresi B’ye, B adresi tekrar A’ya yönlendiriyor. Log’larda “too many hops” veya benzer bir hata görürsünüz. Yönlendirme zincirini çizerek döngüyü bulun.
Güvenlik: Açık Relay ve Alias Güvenliği
Mail yönlendirme yapılandırırken güvenlik konularını göz ardı etmek ciddi sorunlara yol açar.
nano /etc/postfix/main.cf
# Açık relay olmamak için kısıtlamalar
smtpd_relay_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
defer_unauth_destination
# Alıcı kısıtlamaları
smtpd_recipient_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination,
reject_unknown_recipient_domain,
check_recipient_access hash:/etc/postfix/recipient_access
# Catch-all'ları dikkatli kullanın - directory harvest saldırılarına açık
# @sirket.com [email protected] <- Bu satırı dikkatli değerlendirin
nano /etc/postfix/recipient_access
# Belirli adreslere erişimi kısıtla
[email protected] REJECT Bu adrese teslim edilmiyor
[email protected] OK
postmap /etc/postfix/recipient_access
systemctl reload postfix
# Açık relay testi (asla gerçek spam göndermek için kullanmayın)
# Dış bir sunucudan:
# telnet mail.sirket.com 25
# EHLO test.com
# MAIL FROM: <[email protected]>
# RCPT TO: <[email protected]> <- Bunu kabul etmemeli!
Pratik Senaryo: Şirket Mail Altyapısı Kurulumu
Gerçek bir kurumsal senaryo üzerinden tüm öğrendiklerimizi bir araya getirelim. 50 çalışanı olan, eski çalışanlardan mail alan, birden fazla departmanı bulunan bir şirket için yapılandırma:
# main.cf'deki ilgili direktifler
myhostname = mail.sirket.com
mydomain = sirket.com
myorigin = $mydomain
mydestination = $myhostname, localhost.$mydomain, localhost
virtual_alias_domains = sirket.com, yenisirket.com
virtual_alias_maps = hash:/etc/postfix/virtual
transport_maps = hash:/etc/postfix/transport
sender_canonical_maps = hash:/etc/postfix/sender_canonical
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
# /etc/postfix/virtual - Kurumsal yapılandırma
# Departman adresleri
[email protected] [email protected], [email protected]
[email protected] [email protected]
[email protected] [email protected], [email protected], [email protected]
[email protected] [email protected]
[email protected] [email protected]
[email protected] [email protected], [email protected]
# Ayrılan çalışanların mailleri
[email protected] [email protected]
[email protected] [email protected]
# Otomatik sistem mailleri
[email protected] /dev/null
[email protected] /dev/null
# yenisirket.com tüm mailleri sirket.com'a
@yenisirket.com [email protected]
# Derle ve aktif et
postmap /etc/postfix/virtual
postmap /etc/postfix/transport
postmap /etc/postfix/sender_canonical
newaliases
systemctl reload postfix
# Yapılandırmayı doğrula
postfix check && echo "Konfigürasyon OK"
# Birkaç test senaryosu
postmap -q "[email protected]" hash:/etc/postfix/virtual
postmap -q "[email protected]" hash:/etc/postfix/virtual
postmap -q "[email protected]" hash:/etc/postfix/virtual
Düzenli Bakım ve İzleme
Mail yönlendirme yapılandırmasını kurup bırakmak olmaz. Düzenli bakım şart:
# Haftalık kontrol scripti - /usr/local/bin/mail-alias-check.sh
#!/bin/bash
echo "=== Mail Alias Sağlık Kontrolü ==="
echo "Tarih: $(date)"
echo ""
echo "--- Kuyruk Durumu ---"
mailq | tail -1
echo ""
echo "--- Son 24 Saatteki Hatalı Teslimler ---"
grep "$(date +%b %d)" /var/log/mail.log | grep -c "status=bounced"
echo ""
echo "--- Virtual Map Boyutu ---"
wc -l /etc/postfix/virtual
echo ""
echo "--- Postfix Durumu ---"
systemctl is-active postfix
chmod +x /usr/local/bin/mail-alias-check.sh
# Cron'a ekle - her sabah 08:00'de çalıştır
echo "0 8 * * 1-5 root /usr/local/bin/mail-alias-check.sh | mail -s 'Mail Alias Raporu' [email protected]" >> /etc/cron.d/mail-checks
Alias ve transport dosyalarında yapılan değişiklikleri sürüm kontrolüne almanızı da tavsiye ederim. Git kullanarak /etc/postfix/ dizinini takip altına almak, kimin ne zaman hangi değişikliği yaptığını görmenizi sağlar ve geri almayı kolaylaştırır.
Sonuç
Postfix’te mail yönlendirme ve alias yönetimi, ilk bakışta birden fazla mekanizmanın varlığı nedeniyle kafa karıştırıcı gelebilir. Ama temel mantığı kavradıktan sonra her şey yerli yerine oturuyor: /etc/aliases yerel kullanıcılar için, virtual_alias_maps sanal domain’ler için, transport_maps teslimat yöntemi için, canonical_maps ise adres dönüşümü için kullanılıyor.
En sık yapılan hata, dosyayı düzenleyip postmap veya newaliases çalıştırmayı unutmak. Bunu önlemek için değişiklik yapan kişiye özel bir alias koyabilir, hatta bir wrapper script yazabilirsiniz. İkinci kritik nokta ise virtual_alias_domains ile mydestination arasındaki çakışmayı önlemek.
Mail loglarını düzenli okumak, sorunları büyümeden yakalamanın en iyi yoludur. /var/log/mail.log içindeki pattern’leri tanıdıkça hem sorun giderme hızınız artar hem de altyapınızın nasıl davrandığını çok daha iyi anlarsınız. Özellikle status=bounced ve status=deferred satırlarını düzenli takip etmek, kullanıcıların şikayeti gelmeden önce sorunları fark etmenizi sağlar.