Birden fazla domain için tek bir Postfix sunucusu yönetmek, ilk bakışta karmaşık görünebilir. Ama doğru yapılandırıldığında hem maliyet açısından hem de yönetim kolaylığı açısından gerçekten değerli bir çözüm haline geliyor. Bu yazıda, tek bir Postfix kurulumunda birden fazla domain nasıl barındırılır, sanal kullanıcılar nasıl yönetilir ve sık karşılaşılan sorunlar nasıl çözülür, bunları gerçek dünya örnekleriyle ele alacağız.
Senaryo ve Genel Mimari
Diyelim ki şirketiniz büyüdü ve artık birden fazla markayı aynı altyapı üzerinde yönetmeniz gerekiyor. Elimizde şu domainler var:
- sirket.com.tr – Ana şirket maili
- marka-a.com – İkinci marka
- marka-b.net – Üçüncü marka
Bu üç domainin tüm mail trafiğini tek bir Postfix sunucusunda toplamak istiyoruz. Kullanıcılar birbirinden tamamen izole, her domain kendi kullanıcı havuzuna sahip olacak.
Temel mimari şu şekilde çalışır: Postfix, gelen mailleri domain adına göre ayırt eder ve sanal posta kutusu (virtual mailbox) sistemi üzerinden ilgili kullanıcıya teslim eder. Kullanıcılar sistem kullanıcısı olarak tanımlı değildir, tamamen Postfix’in kendi sanal kullanıcı mekanizması üzerinden yönetilir.
Ön Gereksinimler
Postfix zaten kurulu ve çalışıyor olmalı. Değilse hızlıca kuralım:
# Debian/Ubuntu
apt update && apt install postfix -y
# RHEL/CentOS/Rocky Linux
dnf install postfix -y
systemctl enable --now postfix
Kurulum sırasında “Internet Site” seçeneğini seçin ve primary domain olarak ana domaininizi girin. Sonra yapılandırmayı tamamen elle düzenleyeceğiz zaten.
Ayrıca mail teslimi için Dovecot kullanacağız. Postfix mail alır, Dovecot depolar ve IMAP/POP3 erişimi sağlar:
apt install dovecot-core dovecot-imapd dovecot-pop3d -y
DNS Yapılandırması
Kod yazmaya geçmeden önce DNS tarafını doğru ayarlamamız şart. Her domain için MX kaydı, Postfix sunucunuzu işaret etmeli:
# Her domain icin MX kaydi ornegi
# sirket.com.tr
sirket.com.tr. IN MX 10 mail.sirket.com.tr.
mail.sirket.com.tr. IN A 203.0.113.10
# marka-a.com
marka-a.com. IN MX 10 mail.sirket.com.tr.
# ya da kendi subdomain'i ile
mail.marka-a.com. IN A 203.0.113.10
# marka-b.net
marka-b.net. IN MX 10 mail.sirket.com.tr.
DNS değişikliklerinin yayıldığını doğrulamak için:
dig MX sirket.com.tr +short
dig MX marka-a.com +short
nslookup -type=MX marka-b.net
Ana Postfix Yapılandırması (main.cf)
Asıl işin büyük kısmı burada. /etc/postfix/main.cf dosyasını açın ve şu şekilde düzenleyin:
# /etc/postfix/main.cf
# Sunucu kimlik bilgileri
myhostname = mail.sirket.com.tr
myorigin = sirket.com.tr
# Yerel teslim icin kabul edilen domainler (sadece localhost ve hostname)
mydestination = localhost, localhost.localdomain
# Ag arayuzu ve port ayarlari
inet_interfaces = all
inet_protocols = ipv4
# Guvenlilir aglar - bu IP'lerden relay izni verilir
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
# Sanal domain ve kullanici tanimlari
virtual_mailbox_domains = /etc/postfix/virtual_domains
virtual_mailbox_base = /var/mail/vhosts
virtual_mailbox_maps = hash:/etc/postfix/virtual_mailbox
virtual_alias_maps = hash:/etc/postfix/virtual_aliases
# Sanal kullanici ve grup ID'leri (vmail kullanicisi)
virtual_minimum_uid = 100
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
# Posta kutusu boyut limiti (bytes, 0 = limitsiz)
mailbox_size_limit = 0
virtual_mailbox_limit = 512000000
# TLS ayarlari
smtpd_tls_cert_file = /etc/ssl/certs/mail.sirket.com.tr.pem
smtpd_tls_key_file = /etc/ssl/private/mail.sirket.com.tr.key
smtpd_use_tls = yes
smtpd_tls_security_level = may
smtp_tls_security_level = may
# SASL kimlik dogrulama
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination
Buradaki kritik nokta şu: mydestination listesinden tüm domainleri çıkardık. Eğer bir domain hem mydestination hem de virtual_mailbox_domains içinde yer alırsa Postfix karışır ve mail tesliminde sorun çıkar. Sanal domain sistemi kullanıyorsak, domainler sadece virtual_mailbox_domains içinde olmalı.
Sanal Domain Dosyaları Oluşturma
virtual_domains Dosyası
# /etc/postfix/virtual_domains
# Bu bir duz metin dosyasidir, hash'e gerek yok
sirket.com.tr OK
marka-a.com OK
marka-b.net OK
Bu dosya hash formatına dönüştürülmez, direkt metin dosyası olarak okunur. virtual_mailbox_domains parametresi zaten dosya tipini anlayacak şekilde yazıldı.
virtual_mailbox Dosyası
Her kullanıcının posta kutusunu ve konumunu tanımlıyoruz:
# /etc/postfix/virtual_mailbox
# sirket.com.tr kullanicilari
[email protected] sirket.com.tr/ahmet/
[email protected] sirket.com.tr/mehmet/
[email protected] sirket.com.tr/destek/
# marka-a.com kullanicilari
[email protected] marka-a.com/info/
[email protected] marka-a.com/satis/
[email protected] marka-a.com/ali/
# marka-b.net kullanicilari
[email protected] marka-b.net/info/
[email protected] marka-b.net/destek/
Dizin sonundaki / işareti önemli! Bu, Maildir formatında teslim yapılacağını belirtiyor. Eğer / koymazsanız mbox formatı kullanılır ki bu günümüzde tavsiye edilmez.
Hash dosyasını oluşturalım:
postmap /etc/postfix/virtual_mailbox
virtual_aliases Dosyası
Alias’lar, bir adrese gelen maili başka bir adrese veya birden fazla adrese yönlendirmek için kullanılır:
# /etc/postfix/virtual_aliases
# Yonetici alias'lari
[email protected] [email protected]
[email protected] [email protected]
[email protected] [email protected]
# Marka-a catch-all (olmayan adreslere gelen mailleri yonlendir)
@marka-a.com [email protected]
# Gruplar - tek adrese gelen mail birden fazla kisiye gider
[email protected] [email protected], [email protected]
# Cross-domain yonlendirme
[email protected] [email protected]
# postmaster RFC geregi zorunlu
[email protected] [email protected]
[email protected] [email protected]
Hash oluştur:
postmap /etc/postfix/virtual_aliases
vmail Kullanıcısı ve Dizin Yapısı
Sanal posta kutuları için sistem üzerinde özel bir kullanıcı oluşturuyoruz. Bu kullanıcı login yapamaz, sadece mail dosyalarının sahibidir:
# vmail grubu ve kullanicisi olustur (UID/GID 5000 - main.cf ile eslesmeli)
groupadd -g 5000 vmail
useradd -u 5000 -g 5000 -d /var/mail/vhosts -s /sbin/nologin vmail
# Ana dizin olustur
mkdir -p /var/mail/vhosts
# Her domain icin dizin olustur
mkdir -p /var/mail/vhosts/sirket.com.tr
mkdir -p /var/mail/vhosts/marka-a.com
mkdir -p /var/mail/vhosts/marka-b.net
# Izinleri ayarla
chown -R vmail:vmail /var/mail/vhosts
chmod -R 700 /var/mail/vhosts
Dizin yapısını kontrol edelim:
ls -la /var/mail/vhosts/
# Cikti:
# drwx------ 2 vmail vmail 4096 ... sirket.com.tr
# drwx------ 2 vmail vmail 4096 ... marka-a.com
# drwx------ 2 vmail vmail 4096 ... marka-b.net
Dovecot Entegrasyonu
Postfix maili alır ve teslim eder, Dovecot ise kullanıcıların IMAP/POP3 ile erişmesini sağlar. İkisini bağlamamız gerekiyor.
# /etc/dovecot/conf.d/10-mail.conf
mail_location = maildir:/var/mail/vhosts/%d/%n
mail_privileged_group = vmail
Burada %d domain adını, %n kullanıcı adını temsil ediyor. Yani [email protected] için mail dizini /var/mail/vhosts/sirket.com.tr/ahmet/ olacak.
Dovecot’un Postfix ile SASL kimlik doğrulaması için iletişim kurmasını sağlayan soket yapılandırması:
# /etc/dovecot/conf.d/10-master.conf icinde unix_listener blogu
service auth {
unix_listener /var/spool/postfix/private/auth {
mode = 0660
user = postfix
group = postfix
}
}
Kimlik doğrulama mekanizması:
# /etc/dovecot/conf.d/10-auth.conf
auth_mechanisms = plain login
disable_plaintext_auth = yes
# Sanal kullanici sifre dosyasi
passdb {
driver = passwd-file
args = /etc/dovecot/users
}
userdb {
driver = static
args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n
}
Kullanıcı şifre dosyası oluşturma:
# Sifre olustur (doveadm ile)
doveadm pw -s SHA512-CRYPT -p "guclu_sifre_123"
# Ciktiyi kopyalayip asagidaki formatta kullan
# /etc/dovecot/users
[email protected]:{SHA512-CRYPT}$6$xxx...hash...xxx
[email protected]:{SHA512-CRYPT}$6$xxx...hash...xxx
[email protected]:{SHA512-CRYPT}$6$xxx...hash...xxx
[email protected]:{SHA512-CRYPT}$6$xxx...hash...xxx
[email protected]:{SHA512-CRYPT}$6$xxx...hash...xxx
# Dosya izinlerini kisitla
chmod 640 /etc/dovecot/users
chown root:dovecot /etc/dovecot/users
master.cf ile Submission Port Yapılandırması
Modern mail kurulumlarında SMTP gönderimi için 587 portu (submission) kullanılır. /etc/postfix/master.cf dosyasına ekleyelim:
# /etc/postfix/master.cf - ilgili satirlar
smtp inet n - y - - smtpd
submission inet n - y - - smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_tls_auth_only=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
-o smtpd_relay_restrictions=permit_sasl_authenticated,reject
smtps inet n - y - - smtpd
-o syslog_name=postfix/smtps
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
Servisleri Yeniden Başlatma ve Test
Her şeyi yerine koyduğumuza göre test zamanı:
# Postfix yapilandirmasini test et
postfix check
# Hata yoksa servisleri yeniden baslat
systemctl restart postfix
systemctl restart dovecot
# Servis durumlarini kontrol et
systemctl status postfix
systemctl status dovecot
# Port'larin dinlendigini kontrol et
ss -tlnp | grep -E '25|587|993|110'
Mail teslimini test etmek için:
# Postfix ile test maili gonder
echo "Test maili - merhaba!" | sendmail -v [email protected]
# Baska bir domain'e test
echo "Marka-A test" | sendmail -v [email protected]
# Mail kutusunun olusup olusmadigini kontrol et
ls -la /var/mail/vhosts/sirket.com.tr/ahmet/
ls -la /var/mail/vhosts/marka-a.com/info/
Log dosyasını takip ederek hataları anlık görebilirsiniz:
# Gercek zamanli log takibi
tail -f /var/log/mail.log
# Sadece hatalari filtrele
tail -f /var/log/mail.log | grep -E "error|warning|reject"
# Belirli bir domain'in trafiğini izle
tail -f /var/log/mail.log | grep "marka-a.com"
Yaygın Sorunlar ve Çözümleri
“Relay Access Denied” Hatası
Bu hatayı görüyorsanız, büyük ihtimalle domain virtual_mailbox_domains dosyasında yok ya da virtual_mailbox dosyasında kullanıcı tanımlı değil:
# Domainin Postfix tarafindan gorunup gorulmedigini kontrol et
postmap -q sirket.com.tr /etc/postfix/virtual_domains
# Sonuc donmuyorsa domain eklenmemis
# Kullanicinin var olup olmadigini kontrol et
postmap -q [email protected] /etc/postfix/virtual_mailbox
# Dogru cevap: sirket.com.tr/ahmet/
Posta Kutusu Oluşmuyor
Dizin izinleri veya vmail kullanıcısı problemi olabilir:
# vmail kullanicisinin UID'sini kontrol et
id vmail
# uid=5000(vmail) gid=5000(vmail) olmali
# main.cf degerlerini dogrula
postconf virtual_uid_maps
postconf virtual_gid_maps
# Dizin sahibini kontrol et
stat /var/mail/vhosts/
Hash Dosyaları Güncelleme Unutkanlığı
En sık yapılan hata, metin dosyasını düzenledikten sonra postmap çalıştırmayı unutmak. Küçük bir script işe yarar:
#!/bin/bash
# /usr/local/bin/postfix-reload.sh
echo "Virtual mailbox hash guncelleniyor..."
postmap /etc/postfix/virtual_mailbox
echo "Virtual aliases hash guncelleniyor..."
postmap /etc/postfix/virtual_aliases
echo "Postfix yeniden yukleniyor..."
postfix reload
echo "Tamamlandi!"
chmod +x /usr/local/bin/postfix-reload.sh
Yeni Domain Ekleme Prosedürü
Sisteme yeni bir domain eklemek için adım adım yapılacaklar:
# 1. DNS tarafinda MX kaydini ekle (once DNS, sonra Postfix!)
# 2. virtual_domains dosyasina domain ekle
echo "yeni-domain.com OK" >> /etc/postfix/virtual_domains
# 3. Kullanicilari virtual_mailbox dosyasina ekle
echo "[email protected] yeni-domain.com/admin/" >> /etc/postfix/virtual_mailbox
postmap /etc/postfix/virtual_mailbox
# 4. Alias'lari ekle
echo "[email protected] [email protected]" >> /etc/postfix/virtual_aliases
postmap /etc/postfix/virtual_aliases
# 5. Mail dizinini olustur
mkdir -p /var/mail/vhosts/yeni-domain.com
chown vmail:vmail /var/mail/vhosts/yeni-domain.com
chmod 700 /var/mail/vhosts/yeni-domain.com
# 6. Dovecot kullanici dosyasina sifre ekle
HASH=$(doveadm pw -s SHA512-CRYPT -p "kullanici_sifresi")
echo "[email protected]:$HASH" >> /etc/dovecot/users
# 7. Servisleri yeniden yukle
postfix reload
systemctl reload dovecot
# 8. Test et
echo "Yeni domain testi" | sendmail -v [email protected]
SPF, DKIM ve DMARC – Spam Filtrelerine Takılmamak
Çoklu domain yapısında her domain için ayrı SPF ve DKIM kaydı gerekmez fakat kesinlikle önerilir. En azından SPF kaydı zorunlu sayılmalı:
# Her domain icin DNS'e SPF TXT kaydi ekle
# sirket.com.tr IN TXT "v=spf1 mx a ip4:203.0.113.10 ~all"
# marka-a.com IN TXT "v=spf1 mx a ip4:203.0.113.10 ~all"
# marka-b.net IN TXT "v=spf1 mx a ip4:203.0.113.10 ~all"
# DKIM icin opendkim kur
apt install opendkim opendkim-tools -y
# Her domain icin anahtar olustur
opendkim-genkey -D /etc/opendkim/keys/sirket.com.tr/ -d sirket.com.tr -s mail
opendkim-genkey -D /etc/opendkim/keys/marka-a.com/ -d marka-a.com -s mail
opendkim-genkey -D /etc/opendkim/keys/marka-b.net/ -d marka-b.net -s mail
# Sahiplik ayarla
chown -R opendkim:opendkim /etc/opendkim/keys/
DKIM anahtarını DNS’e eklemek için:
# Public key'i goster
cat /etc/opendkim/keys/sirket.com.tr/mail.txt
# Bu ciktiyi DNS yoneticisine ver, TXT kaydi olarak eklenecek
Performans ve İzleme
Çoklu domain yapısında mail kuyruğunu düzenli izlemek önemlidir:
# Kuyruk durumu
mailq
postqueue -p
# Kuyrukta bekleyen mail sayisi
postqueue -p | grep -c "^[A-F0-9]"
# Domain bazinda kuyruk analizi
postqueue -p | grep "@" | awk -F'@' '{print $2}' | sort | uniq -c | sort -rn
# Belirli bir adresi kuyruktan sil
postsuper -d QUEUE_ID
# Tum kuyruğu temizle (dikkatli kullan!)
postsuper -d ALL
Sonuç
Postfix ile çoklu domain yapılandırması, ilk kurulumda birçok detaya dikkat etmeyi gerektiriyor ama bir kez doğru yapılandırıldıktan sonra son derece stabil ve yönetimi kolay bir sistem ortaya çıkıyor. Özetleyecek olursak:
mydestination‘dan sanal domainleri çıkarmak, en çok yapılan hatanın önüne geçiyorvirtual_mailboxvevirtual_aliasesdosyalarını düzenledikten sonrapostmapçalıştırmayı asla atlamayınvmailkullanıcısının UID/GID değerlerimain.cfiçindeki değerlerle tam olarak eşleşmeli- Her yeni domain eklediğinizde önce DNS, sonra Postfix yapılandırması sıralamasına uyun
- Log dosyasını düzenli takip etmek, sorunları erkenden yakalamayı sağlar
Bu yapıyı üretim ortamında birkaç düzine domain ile çalıştırıyorum ve performans açısından herhangi bir sorun yaşamıyorum. Yüzlerce domain için daha ileri gitmek isteyenler MySQL backend’i ile Postfix entegrasyonuna bakabilir; o konuyu da ilerleyen yazılarda ele alacağız.