E-posta & SMTP Sunucu

    Amavis ve ClamAV ile Mail Virüs Taraması

    Postfix'e virüs ve spam tarama katmanı ekleyip doğru çalıştığını kanıtlama adımları.

    11 dk okuma Güncellendi: 25 Ağustos 2026

    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şenGörevDinlediği yer
    Postfix (smtpd)Mesajı kabul eder, filtreye yollar25, 587
    AmavisAyrıştırma, karar, karantina127.0.0.1:10024
    ClamAV (clamd)İmza tabanlı virüs taramasıUnix soketi
    SpamAssassinKural tabanlı spam puanıAmavis içinden
    Postfix (re-inject)Filtreden dönen mesajı teslim eder127.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:

    SabitDavranışNe zaman uygun
    D_PASSTeslim et, sadece başlık ekleSpam için doğru varsayılan
    D_DISCARDSessizce yok et, gönderene haber vermeVirüs için doğru seçim
    D_BOUNCEGönderene hata mesajı üretNeredeyse hiçbir zaman
    D_REJECTSMTP oturumunda reddetYalnı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.

    AmavisClamAVPostfix

    Uygulamaya geçmeye hazır mısınız?

    NVMe SSD, ücretsiz SSL ve %99.9 uptime garantisiyle Clou.TR hosting ve sunucu çözümleriyle projenizi hayata geçirin.