Deneyiminizi geliştirmek için çerezler kullanıyoruz. Bu siteyi ziyaret etmeye devam ederek çerez kullanımımızı kabul etmiş olursunuz.Gizlilik Politikası
rspamd'ı Postfix'e Milter Olarak Bağlamak ve Skorları Web Arayüzünden Canlı İzlemek
amavisd + SpamAssassin yığınını bırakıp rspamd'ı re-injection olmadan, milter içinde self-scan modunda kurun. Gerçek portlar, gerçek local.d dosyaları, gerçek eşikler ve web arayüzünde her mesajın skorunu sembol sembol okuyup kendi trafiğinize kalibre etme.
EvilMail Team21 Temmuz 202613 dk okuma
"Postfix'e bir spam filtresi tak" dendiğinde refleks hep aynı: amavisd-new'i kur, arkasına SpamAssassin bağla, content_filter ile mesajı kuyruktan çıkarıp tarayıcıya ver, taransın, tekrar 10025 portundan Postfix'e enjekte et. Bu mimari çalışır ama üç yerinden sızdırır. Re-injection her mesaja gecikme ve ekstra bir kuyruk döngüsü ekler. Karar tek bir eşiğe indirgenir: eşik altı temiz, üstü spam. Ve en kötüsü, o kararın neden verildiği opaktır; bir mesaj neden 5.8 puan aldı, hangi sinyal onu itti, dışarıdan göremezsin.
rspamd bu modeli tersine çevirir. Mesaj daha SMTP oturumu kapanmadan, milter içinde puanlanır. Onlarca sinyalden (DKIM, SPF, DMARC, Bayes, URL itibarı, başlık tutarlılığı) toplam bir skor üretir; kararı — geç bırak, başlık ekle, greylist, reddet — senin belirlediğin eşiklere göre verir ve her kararı canlı bir web arayüzünde sembol sembol okursun. Bu yazıda rspamd'ı amavis tarzı re-injection ile değil, rspamd_proxy'nin self-scan (milter) modunda kuracağız. 2026'da doğru mimari bu: tek worker hem milter uç noktası hem tarayıcı, oturum içinde puanlama, re-injection yok.
Ana fikri baştan söyleyelim, çünkü tüm ayarlar bunun etrafında dönüyor: rspamd'da "skor" bir çıktı değil, senin kontrol ettiğin bir kadrandır. Web arayüzü de o kadranı gerçek postayla kalibre ettiğin yerdir.
Mimari: neden milter, worker'lar ne iş yapıyor
Milter olmanın kazancı somut. Mesaj Postfix'in
rspamd + Postfix Milter Kurulumu ve Web UI ile Canlı Skor İzleme — EvilMail Blog
döner. Spam senin diskine hiç yazılmaz, kuyruğa girmez, re-injection turu yaşamaz. amavis kurulumunda mesaj önce kabul edilir, sonra taranır, sonra karar verilir; rspamd'da karar oturumun içindedir.
rspamd üç worker'la çalışır ve bunları karıştırmamak kurulumun yarısıdır:
`normal` (11333) — asıl tarama motoru. Sembolleri hesaplar, skoru üretir.
`controller` (11334) — web arayüzü, öğrenme (learn) uç noktaları ve istatistikler. Skoru burada izler, false-positive'leri buradan eğitirsin.
`rspamd_proxy` (11332) — milter uç noktası. self_scan modunda ayrı bir tarayıcıya proxy yapmak yerine tarama işini de kendisi yapar. Postfix bu porta bağlanır.
Arka planda Redis (6379) durur: Bayes istatistikleri, greylist kayıtları, ratelimit sayaçları ve fuzzy hash'ler hep orada tutulur. Redis olmadan rspamd çalışır ama öğrenmez ve hatırlamaz.
Config felsefesi tek cümle: /etc/rspamd/ altındaki base dosyalarına asla dokunma. Her ekleme /etc/rspamd/local.d/ altına gider (base ile birleşir), her ezme /etc/rspamd/override.d/ altına (base'i tamamen değiştirir). Base dosyaları paket güncellemesinde üzerine yazılır; senin local.d dosyaların kalır. En sık yapılan hata bir seçeneği override.d'ye koyup neden local.d'deki komşusunun çalışmadığına şaşırmaktır.
Kurulum: depo, paket, Redis
Distro deposundaki rspamd genelde eskidir; sembol kuralları ve DMARC modülü hızla gelişir. Güncel 3.x dalını almak için resmî depoyu kullan.
Redis'i localhost'a bağlı tut ve bellek politikasını ayarla. Greylist ve ratelimit verisi süreli olduğundan allkeys-lru mantıklı bir seçim, ama Bayes'i kaybetmemek için kalıcılığı (AOF ya da RDB) açık bırak.
Kurulumu iki komutla doğrula: rspamc stat istatistik döndürüyorsa controller ayakta, ss -lntp | grep -E '1133[234]' üç portu da dinliyor gösteriyorsa worker'lar yerinde.
İşin özü burası. rspamd_proxy'yi milter yap ve self-scan aç ki ayrı bir proxy→tarayıcı hattına gerek kalmadan tek worker hem Postfix'in bağlandığı uç hem de tarama motoru olsun.
worker-normal ve controller için de bind adreslerini sabitle. Controller'ı burada 0.0.0.0'a açmak en klasik güvenlik hatası — sadece localhost, dışarıya nginx üzerinden.
systemctl reload rspamd
ss -lntp | grep -E '1133[234]'
Postfix'i milter'a bağlamak
Postfix tarafında dört satır kritik. smtpd_milters gelen postayı 11332'ye yönlendirir; non_smtpd_milters aynı milter'ı giden posta için de devreye alır — bunu atlamak, DKIM imzalamanın çalışmamasının bir numaralı sebebidir, çünkü rspamd imzayı milter aşamasında ekler.
milter_default_action = accept pazarlık konusu değil. rspamd çökerse ya da yanıt vermezse Postfix milter'ı atlar ve postayı akıtmaya devam eder (fail-open). Alternatifi tempfail, ki o zaman rspamd'ın her hıçkırığında meşru posta geri teper. Bir spam filtresi asla mail akışını kesen tek nokta olmamalı.
milter_mail_macros satırı, oturumdaki SASL kimliğini (auth_authen) ve istemci bilgisini rspamd'a taşır. Bu olmadan rspamd, kimliği doğrulanmış kullanıcıların giden postasını anonim trafikten ayıramaz ve ratelimit'i yanlış uygular.
bash
postfix reload
Test için tek satırlık bir mektup gönder ve başlıklara bak; X-Spamd-Result, X-Spam-Level ve X-Rspamd-Server başlıkları belirdiyse milter zinciri kuruldu demektir.
Controller ve web arayüzü: parola, reverse proxy
Controller'ın iki parolası olur: password salt-okunur işlemler (istatistik, history görüntüleme) içindir; enable_password ise öğrenme ve karantina gibi durum değiştiren işlemler içindir. İkisini ayrı tutmak, panele bakan birinin yanlışlıkla Bayes'i eğitmesini engeller. Hash'leri rspamadm pw üretir.
bash
rspamadm pw
# Enter password:
# $2$xic4x...uzun-hash...
Panelde ne izlersin: Throughput grafiği (saatlik action dağılımı), History tablosu (her mesajın skoru, tetiklenen sembolleri ve verilen action'ı satır satır), Symbols sekmesi (hangi kuralın kaç puan taşıdığı) ve canlı Scan / Learn kutuları.
Skoru okumak: action eşikleri ve semboller
rspamd'ın kalbi şu denklem: skor = tetiklenen tüm sembollerin puanlarının toplamı, ve bu skor bir action zincirinden geçer. Varsayılan eşikler:
Skor 4'ü geçerse greylist (geçici erteleme), 6'yı geçerse X-Spam başlığı eklenir, 15'i geçerse mesaj reddedilir. Bu bir bayrak değil, kalibre edilebilir bir kadran.
Semboller iki yönde çalışır. Pozitif olanlar skoru yukarı iter: BAYES_SPAM, MISSING_MID (Message-ID yok), R_SUSPICIOUS_URL, FORGED_SENDER, DMARC_POLICY_REJECT. Negatif olanlar aşağı çeker, yani beyaz listeleme etkisi yapar: BAYES_HAM, R_DKIM_ALLOW, R_SPF_ALLOW, DMARC_POLICY_ALLOW, MAILLIST. Meşru bir kurumsal mektup çoğu zaman DKIM+SPF+DMARC üçlüsünden gelen negatif puanlarla rahatça temiz kalır; imzasız, DMARC'sız bir sahtecilik girişimi ise pozitif sembolleri toplayıp reject bandına tırmanır.
Bir mesajın neden o skoru aldığını görmek için .eml dosyasını doğrudan rspamd'a ver:
bash
rspamc symbols < mesaj.eml
Çıktı her sembolü puanıyla döker; web UI'daki History satırının komut satırı karşılığı budur. Aynı özeti mesaj başlığında da görürsün:
Web arayüzünün asıl değeri burada ortaya çıkar. History'de gerçek postanın nasıl puanlandığını izlersin; bir false-positive gördüğünde satırı seçip Learn ham, kaçmış bir spam gördüğünde Learn spam dersin. Komut satırı karşılığı:
Ölçekli çalışırken tek tek eğitmek yerine kullanıcıların IMAP Junk klasörünü otomatik öğrenmeye bağlamak daha sağlıklıdır. Kritik nokta şu: Bayes sınıflandırıcısı yeterli örnek görmeden hiçbir BAYES_* sembolü basmaz. Varsayılan asgari eşik yaklaşık 200 örnektir (min_learns) ve ham ile spam örneklerini dengeli tutmak gerekir — 500 spam, 10 ham ile eğitirsen sınıflandırıcı yanlı olur. İlerlemeyi rspamc stat ile izle; learned: sayaçlarının ikisi de büyümeli.
Giden postayı imzalamak için dkim_signing modülü devreye girer. non_smtpd_milters satırının doğru olduğundan emin ol, yoksa imza hiç eklenmez.
DNS yayıldıktan sonra kendine bir mektup gönder; R_DKIM_ALLOW sembolünün negatif puanla göründüğünü web UI'da doğrula. O sembol görünüyorsa imza zinciri uçtan uca çalışıyor demektir.
Devreye alma kontrol listesi
Canlıya geçmeden önce şu satırların hepsini tik'le:
ss -lntp | grep -E '1133[234]' üç portu da dinliyor mu?
Ve tekrar tekrar kanayan klasik tuzaklar: base config'i düzenleyip local.d'nin neden çalışmadığına şaşmak; reject eşiğini erkenden 6'ya çekip birkaç meşru bültenle beraber gerçek postayı da kaybetmek; non_smtpd_milters'ı unutup imzasız giden posta yollamak; ve controller'ı 0.0.0.0'a açıp öğrenme uç noktasını internete servis etmek. rspamd'ın gücü kararın senin elinde olmasında — o eli, web arayüzünde gerçek postayı izleyip eşikleri kendi trafiğine göre çekerek kullan.