Kendi posta sunucunuzu çalıştırıyorsanız er ya da geç şu soruyla karşılaşırsınız: gelen eklerdeki zararlı yazılımı kim durduracak? Postfix bir teslimat aracıdır, mesajın içine bakmaz. Amavis ve ClamAV ikilisi tam bu boşluğu doldurur: Amavis, Postfix ile arasında duran bir içerik filtresi çerçevesidir; ClamAV ise gerçek virüs taramasını yapan motordur. Aynı zincire SpamAssassin'i eklediğinizde tek geçişte hem zararlı yazılım hem spam puanlaması yapılır.
Bu yazıda Postfix + Amavis + ClamAV + SpamAssassin zincirini sıfırdan kurup çalıştıracağız. Önce üç bileşenin mesaj akışında tam olarak nerede durduğunu netleştireceğim, sonra kurulum ve master.cf bağlantısını, imza güncelleme mekanizmasını, karantina ile reddetme politikaları arasındaki farkı ve kurulumun gerçekten çalıştığını kanıtlayan EICAR/GTUBE testlerini göreceğiz. Sonda da bu yapının kaynak maliyetini ve hangi durumda daha hafif bir alternatife geçmeniz gerektiğini dürüstçe konuşacağız.
Zincir Nasıl Çalışır#
Mesaj akışını kafanızda canlandırmadan bu yapıyı doğru kurmanız zor. Sıralama şöyle işler: Postfix mesajı 25 portunda kabul eder, content_filter ayarı sayesinde mesajı doğrudan teslim etmek yerine 127.0.0.1:10024 adresindeki Amavis'e SMTP ile aktarır. Amavis mesajı açar, ekleri çıkarır (arşivleri de açar), ClamAV'a taratır, SpamAssassin'den bir spam puanı ister, sonuca göre karar verir ve mesajı geri Postfix'e — bu kez 127.0.0.1:10025 portundaki özel bir dinleyiciye — iade eder. Postfix mesajı oradan normal teslimatına devam ettirir.
| Bileşen | Görev | Dinlediği yer |
|---|---|---|
| Postfix (smtpd) | Mesajı kabul eder, filtreye yollar | 25, 587 |
| Amavis | Ayrıştırma, karar, karantina | 127.0.0.1:10024 |
| ClamAV (clamd) | İmza tabanlı virüs taraması | Unix soketi |
| SpamAssassin | Kural tabanlı spam puanı | Amavis içinden |
| Postfix (re-inject) | Filtreden dönen mesajı teslim eder | 127.0.0.1:10025 |
Buradaki en kritik nokta 10025 portudur: bu dinleyici filtreye tekrar yollamamalıdır, yoksa mesaj sonsuz döngüye girer. master.cf içindeki boş -o content_filter= satırının varlık sebebi tam olarak budur. Bir de şunu baştan bilin: bu zincir gelen postayı korur, giden postayı otomatik olarak spam'den arındırmaz. Giden tarafta asıl önleminiz gönderim hız limiti ve hesap güvenliğidir; ikisini de mail sunucusu sertleştirme kontrol listesi yazısında ele aldım.
Kurulum: Paketler ve Servisler#
Debian/Ubuntu üzerinde bileşenleri ve arşiv çözücüleri birlikte kurun. Çözücüler önemlidir: bir zip ya da rar içindeki zararlı eki açamayan tarayıcı onu göremez.
sudo apt update
sudo apt install -y \
amavisd-new spamassassin clamav-daemon clamav-freshclam \
p7zip-full unzip cabextract lhasa arj lzop nomarch pax \
gzip bzip2 xz-utils
# Amavis ve ClamAV birbirinin dosyalarini okuyabilmeli
sudo adduser clamav amavis
sudo adduser amavis clamav
sudo systemctl enable --now clamav-freshclam clamav-daemon amavis
sudo systemctl status clamav-daemon --no-pager | head -5
Kurulumdan hemen sonra ilk imza indirmesi biraz sürer; clamav-daemon servisi imza veritabanı hazır olmadan başlamaz ve bu ilk denemede "failed" görmenizin en yaygın sebebidir. Önce güncellemeyi elle tetikleyip bekleyin:
# freshclam servisi calisiyorsa once durdurun (kilit cakismasi olur)
sudo systemctl stop clamav-freshclam
sudo freshclam
sudo systemctl start clamav-freshclam
# Imza veritabani surumu ve tarihi
sudo sigtool --info /var/lib/clamav/daily.cld 2>/dev/null | head -4
clamdscan --version
Debian tabanlı sistemlerde bir tuzak var ve bunu bilmeyen herkes en az bir kez düşer: Amavis'te virüs ve spam kontrolü varsayılan olarak KAPALIDIR. İlgili satırlar yorum içindedir ve yorumu kaldırmak taramayı etkinleştirir.
# /etc/amavis/conf.d/15-content_filter_mode
# Asagidaki iki blogun yorumunu KALDIRIN — bu, taramayi ETKINLESTIRIR.
@bypass_virus_checks_maps = (
\%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re);
@bypass_spam_checks_maps = (
\%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re);
1; # dosyanin sonundaki bu satir kalmali
Mantık ters gibi görünüyor ama şudur: bu diziler tanımlandığında "bypass kararı bu haritalara göre verilsin" denir ve haritalar boş olduğu için hiçbir şey bypass edilmez, yani her mesaj taranır. Satırlar yorumdayken ise Amavis toptan bypass moduna düşer. Değişiklikten sonra sudo systemctl restart amavis ile yeniden başlatın.
Postfix'i Amavis'e Bağlamak#
Şimdi mesajı filtreye yollayan ve filtreden geri alan iki ucu kuruyoruz. main.cf tarafı tek satır:
# /etc/postfix/main.cf
content_filter = smtp-amavis:[127.0.0.1]:10024
Asıl iş master.cf içinde. Aşağıdaki iki bloğu dosyanın sonuna ekleyin:
# /etc/postfix/master.cf
# Amavis'e goturen tasiyici
smtp-amavis unix - - n - 2 smtp
-o syslog_name=postfix/amavis
-o smtp_data_done_timeout=1200
-o smtp_send_xforward_command=yes
-o disable_dns_lookups=yes
-o max_use=20
# Amavis'ten donen mesaji kabul eden dinleyici
127.0.0.1:10025 inet n - n - - smtpd
-o syslog_name=postfix/10025
-o content_filter=
-o local_recipient_maps=
-o relay_recipient_maps=
-o smtpd_restriction_classes=
-o smtpd_delay_reject=no
-o smtpd_client_restrictions=permit_mynetworks,reject
-o smtpd_helo_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o smtpd_data_restrictions=reject_unauth_pipelining
-o mynetworks=127.0.0.0/8
-o smtpd_error_sleep_time=0
-o smtpd_soft_error_limit=1001
-o smtpd_hard_error_limit=1000
-o receive_override_options=no_header_body_checks,no_unknown_recipient_checks,no_milters
-o local_header_rewrite_clients=
sudo postfix check
sudo systemctl reload postfix
# Iki ucun da dinledigini dogrula
sudo ss -tlnp | grep -E ':1002[45]'
smtp_data_done_timeout=1200 satırı gereklidir: büyük ekli bir mesajın taranması uzun sürebilir ve varsayılan zaman aşımı dolarsa Postfix teslimatı başarısız sayar. mynetworks=127.0.0.0/8 ve permit_mynetworks,reject ikilisi de 10025 portunun dışarıdan erişilebilir bir kapı hâline gelmesini engeller — bu port yalnızca yerel makineye açık olmalıdır.
Karar Politikaları: Etiketle, Karantinaya Al, Reddet#
Amavis bir mesajı virüslü ya da spam bulduğunda ne yapacağını siz belirlersiniz. Kararlar /etc/amavis/conf.d/50-user dosyasında toplanır (Debian varsayılanları 20-debian_defaults içindedir, ama onu düzenlemek yerine 50-user ile ezmek doğru yöntemdir).
# /etc/amavis/conf.d/50-user
use strict;
$myhostname = 'mail.firmaniz.com';
$mydomain = 'firmaniz.com';
# Virusler: sessizce yok et (bounce URETMEYIN — sahte gonderene gider)
$final_virus_destiny = D_DISCARD;
$final_banned_destiny = D_DISCARD;
$final_spam_destiny = D_PASS; # spam'i teslim et, sadece isaretle
$final_bad_header_destiny = D_PASS;
# Karantina dizini
$QUARANTINEDIR = '/var/lib/amavis/virusmails';
$virus_quarantine_to = 'virus-quarantine';
$spam_quarantine_to = undef; # spam'i karantinaya alma
# SpamAssassin esikleri
$sa_tag_level_deflt = 2.0; # bu puandan sonra X-Spam basliklari eklenir
$sa_tag2_level_deflt = 5.0; # bu puandan sonra konuya isaret konur
$sa_kill_level_deflt = 8.0; # bu puandan sonra $final_spam_destiny uygulanir
$sa_dsn_cutoff_level = 10; # bu puanin ustunde asla DSN uretme
$sa_spam_subject_tag = '[SPAM] ';
1; # dosyanin sonu
Karar sabitlerinin anlamı şöyle:
| Sabit | Davranış | Ne zaman uygun |
|---|---|---|
D_PASS | Teslim et, sadece başlık ekle | Spam için doğru varsayılan |
D_DISCARD | Sessizce yok et, gönderene haber verme | Virüs için doğru seçim |
D_BOUNCE | Gönderene hata mesajı üret | Neredeyse hiçbir zaman |
D_REJECT | SMTP oturumunda reddet | Yalnız gerçek zamanlı filtrede |
D_BOUNCE konusunda net olalım: virüslü mailin gönderen adresi neredeyse her zaman sahtedir, dolayısıyla ürettiğiniz bounce mesajı masum bir üçüncü kişiye gider. Bu davranışa "backscatter" denir ve sizi kara listeye düşürür. Virüs için D_DISCARD, spam için D_PASS güvenli varsayılanlardır. Spam'i doğrudan silmek yerine kullanıcının Junk klasörüne düşürmek en dengeli yaklaşımdır; sunucu tarafında bunu yapan Sieve kuralı ya da panel filtresi kurabilirsiniz — cPanel e-posta filtreleri yazısı panel tarafındaki karşılığını anlatıyor.
Doğrulama: EICAR ve GTUBE Testleri#
Kurulum bitti demeden önce zincirin gerçekten çalıştığını kanıtlamak gerekir. İki standart test dizesi var; ikisi de zararsızdır ve sadece test amacıyla üretilmiştir.
# 1) Virus tarayici testi (EICAR) — once ClamAV'i dogrudan sinayin
printf '%s' 'X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*' > /tmp/eicar.txt
clamdscan /tmp/eicar.txt
# /tmp/eicar.txt: Eicar-Signature FOUND
# 2) Ayni dizeyi mail govdesinde gonderin
swaks --server 127.0.0.1 --port 25 \
--from [email protected] --to [email protected] \
--body 'X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*'
# 3) Spam testi (GTUBE) — SpamAssassin bunu her zaman 1000 puan sayar
swaks --server 127.0.0.1 --port 25 \
--from [email protected] --to [email protected] \
--body 'XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X'
Sonuçları loglardan okuyun:
grep -Ei 'amavis|Blocked|Passed|INFECTED|SPAM' /var/log/mail.log | tail -20
# ... amavis[1234]: (12345-01) Blocked INFECTED (Eicar-Signature) ...
# ... amavis[1234]: (12345-02) Blocked SPAM {DiscardedInbound} ...
# Karantinaya dusen dosyalar
sudo ls -l /var/lib/amavis/virusmails/ | tail
Log satırında Passed CLEAN görüyorsanız mesaj taranmış ve temiz bulunmuş demektir. Hiçbir amavis satırı görmüyorsanız content_filter bağlantısı kurulmamıştır; postconf -n content_filter ile kontrol edin. Blocked INFECTED görüyorsanız zincir baştan sona çalışıyordur. Filtre kurulumunun spam puanlamasını dışarıdan nasıl etkilediğini ölçmek isterseniz spam skoru testi araçları yazısındaki yöntemlerle kendi gönderdiğiniz maillerin puanına da bakın.
Performans, Bellek ve Alternatifler#
Bu zincirin görmezden gelinen bir maliyeti var: ClamAV imza veritabanını tamamen belleğe yükler. Güncel imza setiyle clamd süreci tek başına 1 GB'ın üzerinde RAM tüketebilir. Buna Amavis'in ayırdığı işçi süreçleri ve SpamAssassin'in Perl kuralları eklendiğinde, 1 GB belleğe sahip küçük bir sunucuda bu yapı ya hiç başlamaz ya da OOM killer tarafından öldürülür. Pratik asgari, bu servislerin yanında posta ve web de çalışacaksa 4 GB civarıdır.
# Bellek tuketimini gorun
ps -eo pid,rss,comm --sort=-rss | grep -E 'clamd|amavis|spamd' | head
# Amavis kac es zamanli isci calistiriyor
grep -i max_servers /etc/amavis/conf.d/*
$max_servers değerini CPU çekirdek sayınıza göre ayarlayın; varsayılan genellikle 2'dir ve düşük trafikte yeterlidir. Yoğun bir sunucuda bunu artırmak kuyruğu hızlandırır ama her işçi ayrı bellek tüketir.
Dürüst bir not: bugün yeni kurulumlarda bu klasik zincir yerine rspamd tercih etmek çoğu durumda daha mantıklıdır. Rspamd spam puanlaması, DKIM imzalama, greylisting ve ClamAV entegrasyonunu tek bir C tabanlı serviste toplar; belirgin biçimde daha az bellek tüketir ve yapılandırması daha derli topludur. Amavis + SpamAssassin ikilisini yine de tercih ettiğiniz senaryolar var: mevcut kurulumunuz zaten bu yapıdaysa, ayrıntılı karantina davranışına ihtiyacınız varsa veya ekibiniz SpamAssassin kural setine hâkimse geçişin maliyeti getirisinden büyük olabilir. Spam'i bağlantı aşamasında elemek isterseniz greylisting de tamamlayıcı bir katmandır; gecikme yan etkisini greylisting ve mail gecikmesi yazısında anlattım.
Kaynak kısıtınız varsa ve bu yapıyı kurmak yerine hazır filtrelenmiş bir posta hizmeti istiyorsanız e-posta çözümlerimizde spam ve virüs taraması zaten kuruludur; kendi sunucunuzu işletmek istiyorsanız yeterli belleğe sahip bir VDS seçmek bu zincirin ilk şartıdır.
Sık Yapılan Hatalar#
Birinci hata, 15-content_filter_mode dosyasındaki yorumları kaldırmayı unutmaktır. Kurulum sorunsuz görünür, servisler çalışır, loglarda Passed CLEAN bile yazabilir — ama hiçbir tarama yapılmamaktadır. EICAR testi yapmadan kurulumu tamamlanmış saymayın.
İkinci hata, izin ve grup üyeliklerini atlamaktır. Amavis mesajı geçici bir dizine açar ve ClamAV o dosyaları okuyabilmelidir. adduser clamav amavis komutunu çalıştırmadıysanız loglarda "Permission denied" ya da "lstat() failed" satırları görürsünüz ve her mesaj tarama hatası verir. Grup değişikliğinden sonra iki servisi de yeniden başlatmayı unutmayın.
Üçüncü hata, D_BOUNCE kullanmaktır. Yukarıda anlattığım backscatter sorunu, iyi niyetle "gönderene haber verelim" diyen herkesin başına gelir ve sonucu kara liste kaydıdır. Virüs ve yüksek puanlı spam için asla bounce üretmeyin.
Dördüncü hata, imza güncellemesinin durduğunu fark etmemektir. freshclam servisi bir sebeple durursa ClamAV eski imzalarla çalışmaya devam eder ve size hiçbir uyarı vermez. Veritabanı tarihini haftalık olarak kontrol eden basit bir kontrol koyun:
# Imza dosyasi kac gundur guncellenmemis
find /var/lib/clamav -name 'daily.c*d' -mtime +2 -print
# Cikti varsa guncelleme durmus demektir
sudo systemctl status clamav-freshclam --no-pager | tail -5
Beşinci hata, spam eşiklerini fazla agresif ayarlamaktır. $sa_kill_level_deflt değerini 5'in altına indirdiğinizde meşru kurumsal mailler elenmeye başlar ve bunu ancak müşteriniz "teklifiniz gelmedi" dediğinde öğrenirsiniz. 8.0 civarı bir eşikle başlayın, birkaç hafta karantinayı gözden geçirin, sonra ayar yapın.
Sıkça Sorulan Sorular#
ClamAV tek başına yeterli mi, Amavis şart mı#
ClamAV sadece bir tarama motorudur; bir dosyayı ya da veri akışını alıp "virüslü mü" sorusunu cevaplar. Postfix ile ClamAV arasında mesajı açan, eklerini çıkaran, arşivleri çözen ve sonuca göre karar veren bir katmana ihtiyaç vardır. Amavis bu katmandır. Alternatif olarak clamav-milter ya da rspamd de aynı köprüyü kurabilir, ancak ClamAV'ı doğrudan Postfix'e bağlamanın hazır bir yolu yoktur.
Mail virüs taraması sunucuyu yavaşlatır mı#
Evet, ölçülebilir bir maliyeti vardır. Her mesaj teslim edilmeden önce açılıp taranır; tipik bir mesaj için bu birkaç yüz milisaniyeden birkaç saniyeye kadar sürer, büyük arşiv ekleri çok daha uzun sürebilir. Asıl darboğaz CPU değil bellektir: ClamAV imza veritabanını RAM'de tutar. Yoğun sunucularda $max_servers değerini artırmak ve yeterli bellek ayırmak gecikmeyi kabul edilebilir seviyede tutar.
Amavis kurulumundan sonra mailler gelmiyor, ne yapmalıyım#
Önce zincirin hangi halkasında takıldığını bulun. postqueue -p ile mesajların kuyrukta bekleyip beklemediğine, ss -tlnp | grep 1002 ile hem 10024 hem 10025 portunun dinlendiğine bakın. Amavis çalışmıyorsa Postfix mesajı teslim edemez ve kuyrukta biriktirir. Log dosyasında connect to 127.0.0.1[127.0.0.1]:10024: Connection refused satırı görüyorsanız Amavis servisi kapalıdır; systemctl status amavis ile sebebini okuyun.
Karantinaya alınan mesajı nasıl geri teslim ederim#
Karantina dosyaları /var/lib/amavis/virusmails dizininde saklanır ve düz mail dosyalarıdır. İçeriğini less ile inceleyip yanlış pozitif olduğuna karar verirseniz amavisd-release komutuyla mesajı serbest bırakabilir ya da dosyayı doğrudan sendmail üzerinden yeniden gönderebilirsiniz. Karantina dizinini düzenli temizleyin; aksi hâlde aylar içinde diski doldurur.
Giden maillerimi de taratmalı mıyım#
Giden tarafta virüs taraması, ele geçirilmiş bir kullanıcı bilgisayarının zararlı ek göndermesini yakalayabildiği için değerlidir. Ancak giden taramanın performans maliyeti ve yanlış pozitif riski daha yüksektir; bir müşteriye giden teklifin sessizce silinmesi kabul edilemez. Pratik yaklaşım, giden tarafta yalnızca virüs kontrolünü açık tutmak, spam puanlamasını kapatmak ve kararı D_DISCARD yerine karantina olarak ayarlamaktır.
Spam filtresi meşru mailleri engelliyor, eşiği nasıl ayarlarım#
Önce mesajın hangi kurallardan puan aldığına bakın; Amavis eklediği X-Spam-Status başlığında puanı ve tetiklenen kural adlarını yazar. Sistematik bir yanlış pozitif varsa (örneğin belirli bir gönderen alan adı sürekli takılıyorsa) eşiği topluca yükseltmek yerine o gönderen için beyaz liste tanımlamak daha doğrudur. Genel eşik değişikliğini yalnızca birden çok farklı gönderende aynı sorunu gördüğünüzde yapın.
Amavis yerine rspamd kullanmalı mıyım#
Yeni bir kurulum yapıyorsanız ve özellikle belleğiniz kısıtlıysa rspamd güçlü bir tercihtir: spam puanlama, DKIM imzalama, greylisting ve ClamAV entegrasyonunu tek serviste toplar ve daha az kaynak tüketir. Halihazırda çalışan bir Amavis kurulumunuz varsa ve kural setine hâkimseniz göç etmenin acil bir gerekçesi yoktur. Karar verirken bakmanız gereken şey özellik listesi değil, ekibinizin hangi araçta sorun giderebildiğidir.
Kapanış#
Amavis + ClamAV zinciri, Postfix'in içine bakmadığı mesaj gövdesini denetleyen katmandır ve doğru kurulduğunda sessizce çalışır. Aklınızda dört madde kalsın: Debian'da taramayı açan şey 15-content_filter_mode içindeki yorumları kaldırmaktır; 10025 dinleyicisinde content_filter boş bırakılmazsa mesaj sonsuz döngüye girer; virüs için D_DISCARD, spam için D_PASS kullanın ve asla bounce üretmeyin; kurulumu EICAR ve GTUBE testleriyle kanıtlamadan tamamlanmış saymayın. Bir de imza güncellemesinin durup durmadığını periyodik kontrol edin — sessizce eskiyen bir tarayıcı hiç tarayıcı olmamasına yakındır.
Bu katmanı kendi sunucunuzda işletmek yerine hazır isterseniz e-posta çözümlerimizde spam ve virüs filtresi kurulu ve güncel gelir. Kendi Postfix kurulumunuzu yönetiyor ve yeterli belleğe sahip bir makine arıyorsanız VDS paketleri uygun bir temel sunar; yalnız gönderim için ayrılmış bir yapı istiyorsanız SMTP sunucu çözümümüz, kurulum ve bakımı devretmek isterseniz sunucu yönetimi hizmetimiz işi üstlenir.