SpamAssassin'in 30 KB'lık local.cf dosyalarını, yıllarca biriktirdiğiniz özel score satırlarını ve SARE kural setlerini alıp rspamd'ın /etc/rspamd/ dizinine kopyalayamazsınız. Kopyalasanız bile çalışmaz — ve daha kötüsü, çalışıyormuş gibi görünüp ilk gün ya spam seli ya da yanlış-pozitif dalgası üretir.
Sebep, çoğu geçiş rehberinin atladığı bir şey: SpamAssassin ile rspamd aynı işi yapar gibi görünse de mimarileri zıttır. SA senkron, Perl tabanlı, statik kural+skor toplamı hesaplayan ve kuyruk sonrası (amavisd-new veya spamd üzerinden) çalışan bir motordur. rspamd asenkron, C ile yazılmış, çok değişkenli olasılıksal skorlamayı Lua modülleriyle yapan ve milter olarak SMTP oturumunun içine giren bir motordur. Bu yüzden "kuralları birebir çevir" yaklaşımı ilk temasta çöker.
Doğru zihinsel model şu: geçiş bir çeviri değil, birbirinden bağımsız üç eşleme problemidir — kural eşdeğeri, skor/eşik eşdeğeri ve öğrenme verisinin taşınması. Her birinde neyin doğrudan taşındığı, neyin yeniden kalibre edilmesi gerektiği ve neyin hiç karşılığı olmadığı farklıdır. Bu yazının vaadi: bu üçünü ayrı ayrı çözüp, rspamd'ı SA'nın yanında paralel çalıştırarak (shadow mode) ölçmek ve ancak rakamlar oturunca kesmek. Sıfır teslimat kaybıyla.
Mimari fark: neyi taşıdığını bilmeden taşıma
SA dünyasında akış şöyledir: Postfix mesajı kuyruğa alır, amavisd-new ya da spamass-milter mesajı spamd'a verir, spamd senkron olarak tüm regex kurallarını çalıştırıp Bayes olasılığını ekler, hepsini toplayıp tek bir skor üretir ve bunu required_score 5.0 ile karşılaştırır. Tek eşik, tek karar.
rspamd tamamen farklı bir hayvandır. Postfix'in smtpd'si mesajı milter protokolü üzerinden proxy worker'a (port 11332) verir — oturum daha bitmeden. rspamd worker'ı onlarca sinyali paralel ve asenkron değerlendirir: regexp kuralları, Bayes (Redis'te), fuzzy_check, RBL sorguları, dahili DKIM/SPF/DMARC/ARC doğrulaması, reputation, opsiyonel neural. Sonuç tek bir eşiğe değil, dört ayrı aksiyon eşiğine vurulur.
Bu ayrım her şeyi belirler. SA'da "kural" demek regex + sabit skor demektir. rspamd'da "kural" bir symbol'dür ve skoru dinamik olabilir; bazı symbol'lerin skoru mesajın diğer özelliklerine göre değişir. Bu yüzden SA skorlarını rspamd'a 1:1 yazmak matematiksel olarak yanlıştır — birazdan göreceğiz.
Kural eşdeğeri: neyin karşılığı var, neyin yok
Doğrudan taşınanlar. Elle yazdığınız özel regex kuralları rspamd'ın regexp modülüne taşınır. /etc/rspamd/local.d/regexp.conf içine yazarsınız:
# /etc/rspamd/local.d/regexp.conf
FROM_SUSPICIOUS_TLD {
re = "/\\.(top|xyz|click)>?$/i{header=From}";
score = 2.5;
description = "Şüpheli gönderen TLD";
}Header atomunu SA'nın From=/.../ sözdizimiyle değil, rspamd'ın {header=From} seçiciyle belirtmeye dikkat edin — motorun regex'i hangi parçaya uygulayacağını bu atom söyler.
SA uyumluluk köprüsü. rspamd'ın spamassassin plugin'i gerçek SA .cf dosyalarını okuyabilir. Elinizdeki büyük kural setini bir günde yeniden yazmak istemiyorsanız köprü olarak kullanın:
# /etc/rspamd/local.d/spamassassin.conf
ruleset = "/etc/rspamd/sa/local.cf";Ama bunu kalıcı çözüm sanmayın. Plugin body/header/uri regexlerini yükler; meta kurallarının çoğunu, eval fonksiyonlarını ve pluginlere bağlı kuralları desteklemez. Dahası, C-native rspamd kurallarına göre belirgin şekilde yavaştır. Köprü, geçiş dönemini yumuşatmak içindir — cutover'dan sonraki haftalarda tek tek native karşılığa çevirip söküp atarsınız.
Meta kurallar → composites. SA'nın meta kuralları (birden fazla kural tetiklendiğinde ekstra skor) rspamd'da composites ile ifade edilir: /etc/rspamd/local.d/composites.conf içinde symbol'leri mantıksal olarak birleştirir, çift sayımı engellemek için birinin skorunu sıfırlarsınız.
Hiç karşılığı olmayanlar. SARE ve topluluk kural setlerinin doğrudan bir rspamd karşılığı yoktur — ihtiyaç da duymazsınız, çünkü onların yakaladığı çoğu şeyi rspamd fuzzy_check, reputation ve neural ile zaten yakalar. Bu sinyaller SA'da hiç yoktu ve rspamd'da "bedava" gelir; ama kalibrasyon gerektirir.
Skor ve eşik eşdeğeri: en çok hata yapılan yer
SA'da required_score 5.0 tek bir çizgidir: altı temiz, üstü spam. rspamd'da dört aksiyon ve dört eşik vardır (local.d/actions.conf ile ayarlanır):
# /etc/rspamd/local.d/actions.conf
greylist = 4;
add_header = 6;
reject = 15;Yaygın refleks, "SA'da 5.0'dı, rspamd'da da reject'i 5 yapayım" demektir. Yanlış. rspamd'ın varsayılan symbol skorları farklı bir ölçekte kalibre edilmiştir ve reject varsayılanı 15'tir çünkü rspamd güvenilir spam sinyallerini (GTUBE, çoklu RBL isabeti, fuzzy tam eşleşme) yüksek skorlarla üretir. SA'nın 5.0 eşiği kabaca rspamd'ın add_header ~6 seviyesine denk gelir — yani "işaretle ama reddetme". Reddetme kararını 15 civarında tutun; ilk hafta reddetmek yerine karantina/işaretleme yapın.
Symbol skorlarını override etmek için:
# /etc/rspamd/local.d/groups.conf
symbols {
"BAYES_SPAM" { score = 4.0; }
"DKIM_REJECT" { score = 1.0; }
}Kritik nokta: çift sayımdan kaçının. SA config'inizde DKIM fail için elle eklediğiniz bir skor kuralı olabilir. rspamd bunu DKIM_REJECT symbol'ü ile zaten üretir. Eski SA skorunuzu köprü üzerinden taşırsanız aynı sinyal iki kez sayılır ve meşru posta yanlış-pozitife düşer. SA config'inizi rspamd'a alırken SPF/DKIM/DMARC ile ilgili tüm elle skorları silin — o iş artık rspamd'ın dahili modüllerinin.
Öğrenme verisi: Bayes'i import edemezsiniz, yeniden öğretirsiniz
Burası geçişin en çok yanlış anlaşılan kısmı. SA'nın Bayes veritabanı (bayes_toks, SDBM ya da Redis) rspamd'a import edilemez. Token hash şemaları uyumsuzdur; sa-learn --backup çıktısını rspamd'ın anlayacağı bir formata çeviren güvenilir bir yol yoktur. Bunu vaat eden araçlara güvenmeyin.
Doğru yol, ham corpus'u yeniden öğretmektir. Yıllardır kullanıcılarınızın .Spam ve INBOX maildir'lerinde biriken gerçek postalar sizin altın corpus'unuzdur:
# Redis backend'i ve mevcut learn sayısını doğrula
rspamc stat | grep -i bayes
# Corpus'tan öğret
rspamc learn_spam /var/mail/vhosts/evilmail.pro/*/Maildir/.Spam/cur/
rspamc learn_ham /var/mail/vhosts/evilmail.pro/*/Maildir/cur/
# Sınıf başına öğrenme sayısını kontrol et (learns rspamc stat'ta görünür)
rspamc stat | grep -i learnsrspamd Bayes'i devreye almadan önce sınıf başına en az 200 öğrenme ister (min_learns varsayılanı 200). Bunun altında BAYES_* symbol'leri hiç tetiklenmez — yani ilk gün Bayes yokmuş gibi davranır. Bu yüzden corpus öğretimini cutover'dan önce halledin.
Backend kararını da şimdi verin: classifier-bayes.conf içinde backend = "redis" ve tek bir global sınıflandırıcı çoğu kurulum için doğrudur. Per-user Bayes yalnızca kullanıcı profilleri gerçekten farklıysa (kurumsal + pazarlama kullanıcıları aynı sunucuda) mantıklıdır; temp-email veya homojen trafikte global daha hızlı öğrenir. SA'nın bayes_auto_learn eşiklerinin karşılığını aramayın — rspamd'da autolearn'i kapalı tutmak yaygın ve doğru tercihtir; otomatik öğrenme yanlış sınıflandırmayı kalıcılaştırır.
Shadow mode: kesmeden önce ölç
Cutover'ı kör yapmak felakettir. Önce rspamd'ı SA'nın yanında çalıştırıp aynı postaya iki motorun ne dediğini karşılaştırın. rspamd'ı yalnızca header ekleyecek, hiçbir mesajı reddetmeyecek şekilde konumlandırın: actions.conf eşiklerini geçici olarak çok yükseltin (reject = 9999) ya da Postfix tarafında milter_default_action = accept bırakıp reddi devre dışı tutun. Proxy worker self_scan = yes ile mesajı tarar, X-Rspamd-* başlığını ekler ama akışı kesmez.
rspamd her mesaj için loguna şöyle bir satır yazar:
rspamd: <id>; ... (add header): [6.20/6.00] ...Birkaç gün boyunca (canlı trafiğe göre 3-7 gün; tatil/kampanya dönemine denk getirmeyin) iki motorun kararlarını loglardan korele edin: SA'nın spam dediğine rspamd ne skor verdi, tersi ne oldu? Buradaki hedef, actions.conf eşiklerini kendi trafiğinize kalibre etmek ve yanlış-pozitif/yanlış-negatif oranını cutover öncesi görmektir. Rakamlar oturmadan kesmeyin.
Kesme günü: milter'ı bağla, amavis'i çıkar
Kalibrasyon tamamlandığında cutover mekaniktir. Postfix main.cf içinde SA'yı besleyen spamass-milter/amavis satırlarını çıkarıp rspamd proxy'yi bağlayın:
# /etc/postfix/main.cf
smtpd_milters = inet:127.0.0.1:11332
non_smtpd_milters = $smtpd_milters
milter_protocol = 6
milter_default_action = acceptrspamd tarafında worker-proxy.inc içinde milter modunu ve self-scan'i doğrulayın:
# /etc/rspamd/local.d/worker-proxy.inc
milter = yes;
upstream "local" {
default = yes;
self_scan = yes;
}milter_default_action = accept hayat kurtarır: rspamd bir an için düşerse Postfix mesajı reddetmez, geçirir. Geçiş dönemi için doğru tercih budur. Değişiklikten önce rspamadm configtest çalıştırın, sonra systemctl reload postfix.
Rollback planı. Eski amavis/spamass-milter satırlarını main.cf içinde silmeyin, yoruma alın. Sorun çıkarsa iki satırı geri açıp postfix reload ile on saniyede SA'ya dönersiniz. Ve Redis persistence'ını ihmal etmeyin — appendonly yes (ya da makul save aralıkları) olmadan bir restart tüm Bayes ve greylist state'inizi silip süpürür; günlerce öğrettiğiniz corpus buhar olur.
Doğrulama ve izleme
Cutover sonrası ilk saat kritik. GTUBE testi motorun canlı olduğunu kanıtlar — bu standart string SA'da da rspamd'da da tanınır ve reject aksiyonuna düşmeli. Dikkat: sadece "GTUBE" yazmak yetmez, gerçek test string'ini göndermeniz gerekir:
# Controller web UI: http://127.0.0.1:11334
rspamc stat # tarama sayıları, bayes learn durumu
rspamc counters # symbol isabet dağılımı
# GTUBE: gerçek test string'iyle reject tetiklenmeli
printf 'Subject: gtube\n\nXJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X\n' | rspamcrspamc counters çıktısında symbol dağılımını izleyin: hangi kurallar tetikleniyor, hangileri hiç ateşlenmiyor (ölü kural). neural modülünü ilk gün açmayın — perceptron anlamlı sonuç için hafta ölçeğinde eğitim verisi ister; sistem oturduktan, Bayes ve fuzzy istikrarlı çalışmaya başladıktan sonra opt-in açın.
Kontrol listesi
Kesme öncesi:
- rspamd 3.x kuruldu,
rspamadm configtesttemiz - Redis çalışıyor,
appendonly yesveyasavearalıkları ayarlı local.d/redis.conf,classifier-bayes.conf,actions.conf,worker-proxy.incdolduruldu- Özel SA regex kuralları
regexp.conf'a taşındı ya daspamassassin.confköprüsü aktif - SPF/DKIM/DMARC ile ilgili elle SA skorları silindi (çift sayım yok)
- Corpus öğretildi:
rspamc statsınıf başına >200 learns gösteriyor - Shadow mode 3-7 gün çalıştı, eşikler log korelasyonuyla kalibre edildi
Kesme ve sonrası:
main.cfmilter satırları eklendi, eski amavis satırları yorumda (silinmedi)postfix reload+systemctl reload rspamdsonrası GTUBE reject testi geçti- İlk saat
tail -f /var/log/rspamd/rspamd.logile symbol/score satırları izlendi - 48 saat FP/FN oranı takip edildi, ölü kurallar
rspamc countersile ayıklandı - Sistem oturunca
neuralopt-in değerlendirildi
evilmail.pro altyapısında bu geçişi shadow mode olmadan yapmıyoruz — iki motorun kararı log'da yan yana durmadan hiçbir milter Postfix'e bağlanmıyor.


