Postfix ile Çoklu Domain Yapılandırması

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çiyor
  • virtual_mailbox ve virtual_aliases dosyalarını düzenledikten sonra postmap çalıştırmayı asla atlamayın
  • vmail kullanıcısının UID/GID değerleri main.cf iç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.

Yorum yapın