Szóval a következő projektem egy DNSBL szeretne lenni C/C++ -ban írt DNS szerverrel amit összekötnék azzal az adatbázissal ami generálódik a centralizált spam védelemből ami szépen teszi a dolgát, tehát a SPAM -ek 90% -a el sem jut a mail szerverekig ezzel nem kevés CPU, RAM és áramszámlát megspórolva (de komolyan).
Na van pár szar "örökölt" szerver is a képletbe ami még hírből se ismeri a MILTER -t amit én használok és arra gondoltam megoldom multszázadi eszközzel, nade ha már ilyet csinálok akkor miért ne profitálhatna belőle más is...
Ugyhogy kvázi itt hagyom a TODO -t magamnak és természetesen ingyen ötletekért jöttem és brainstormokra ^^
- 724 megtekintés
Hozzászólások
Nem akarsz. :) Nem kell C++-ban DNS-t sem írnod, mert ott a powerdns, ami remekül táplálkozik MySQL-ből (vagy azzal kompatibils népszerűvel).
Azon gondolkodj inkább, hogy milyen pontozás és matchelés alapján kerül be egyáltalán egy IP cím a reputációs listádba vagy DNSBL-edbe. Hány hit kell egy IP címről? Olyanokat mint a nagy felhős megoldások, vagy csak a hazai levelezők pikkpakk ki tudod tiltani, pedig mondjuk a leveleik alig náhány század ezreléke spam/phising/vírus, ami hozzád jönne.
Mit csinálsz azokkal a 0day (0hour, lásd a hazai nagyobb szolgáltatásokat célzó dolgok) spam/phising cuccokkal, amik a mindennel felhergelt Spamassassin (a csoda új TLD-k felpontozva, mert 90%+-ban spammelnek) és ClamAV (unofficial signatures, meg néhány fizetős db) pároson is átjönnek, mint kés a vajon?
Ha itt a HUP-on keresel, akkor elvileg megtalálod a multi DNSBL-es Exim szabálylistás történetem. Nálam több szerveren az vált be. A kézzel etetés esélytelen, bár néhány pontozásra érdemes dologra lehetne figyelni, de ez azért nem olyan egyszerű.
- A hozzászóláshoz be kell jelentkezni
> Mit csinálsz azokkal a 0day
neuralis halo? (deepspam)
amugy az automata blacklistek altalaban csapda email cimekrol tanulnak, ahova normal levelforgalom nem mehet.
> kézzel etetés esélytelen
altalaban igen, de van nehany spammer aki 1-2 hetente valt domaint, azokat en is kezzel rakom sajat bl-be, illetve implementaltam a from_ip (a felado cimenek domainje ip-re feloldva) dns lookupot is, az is hasznos.
masreszt csinaltam olyat is, hogy egy kozponti (cloud:)) szerverre bekuldom a metadatat minden szerverrol, ahol statisztikat keszit belole (sender es from cim/domain) es ami gyanus forgalmat bonyolit azokrol kuld riasztast emailben nekem, amiben van egy link amivel egybol blacklistre teheto a cim. amikor a szerverek bekuldik a "kozpontba" akkor valaszul megkapjak blacklisten van-e mar, igy ha igen akkor megy a levesbe/karantenba egybol. igy nem kell minden szerveren kulon figyelni vagy szurni...
- A hozzászóláshoz be kell jelentkezni
"Azon gondolkodj inkább, hogy milyen pontozás és matchelés alapján kerül be egyáltalán egy IP cím a reputációs listádba vagy DNSBL-edbe." - ezen túl vagyok, van DB és bevállt, nagyon jó, nincs rá panasz.
Azért kell saját DNS szerver, hogy on-the-fly is tároljam a HIT -eket DB -be amit a PDNS nem tud csak taknyolva.
Running on FreeBSD/Bhyve
- A hozzászóláshoz be kell jelentkezni
A Powerdns remekül működik, mint DNS. A hiteket nem biztos, hogy ott akarod tárolni, mert ha megtalálják a DNSBL-ed, vagy csak megőrül egy kliensed, akkor egy bajos lehet az adatbázis mérete és a lekérdezések összetettsége. Nem jobb 5-10 percenként legyártani a rekordokat a powerdns-nek? Eleve van egy TTL a rekordokon, azt sem szerencsés 0-ra állítani, mert sok névszerver eleve figyelmen kívül fogja hagyni.
- A hozzászóláshoz be kell jelentkezni
Én is nagyon szeretem a PDNS -t, 2009 -től azt használom.
Na mondom, hogy én hogyan gondoltam.
Van egy MILTER SPAM szűrőm amit használ sok-sok szerver több országban az bonus/malusként gyűjti az infót a DB -be, tehát ez kiindulásnak jó, ami szar besorolást kap az már bukik is egy egyszerű lekérdezésnél, viszont ami nincs benne azt felkéne vigye a DNSBL DNS szervere maga és a szűrő meg rácsekkol direktbe, ami kb. 3-4 perc, ha elbukik akkor csak az első 10-20 SPAM levél jött be.
Tehát van egy WORKER a háttérbe ami végzi a piszkos munkát + van egy DB ami adott.
DNS Szerver:
TCP + UDP szerver (53) (EDNS0) (KQUEUE, ACCF_FILTER) non-blocking, async + thread-pool = tehát elvileg gyors
Akkor beépítve egy QUEUE a DB kéréseknek, hogy tranzakcióba tudjon futni a SELECT és külön QUEUE arra az esetre ha nincs rekord a DB -be ott meg az INSERT, harmadik QUEUE a statisztika az pedig szintén a DB felé, hogy tranzakcióba menjen egy UPDATE. + CACHE
Na így nem lesz túlterhelve a DB se és nem is lehet majd KIDOSOLNI a nem létező rekordok is bekerülnek amire meg ráfut a háttérfolyamat és ha nem stimmel a küldő SMTP akkor flageli is és lehet szépen grafikonozni is és odamerem adni a világnak használatra és mint OSS.
<table name="acl_hosts">
<column name="ID">675</column>
<column name="ip">93.88.198.131</column>
<column name="ptr">mail.hasznoscuccok.eu</column>
<column name="soa_domain">hasznoscuccok.eu</column>
<column name="location">Europe / Hungary</column>
<column name="asn">197248</column>
<column name="asc">Dravanet Co Ltd.</column>
<column name="ehlo">mail.hasznoscuccok.eu</column>
<column name="reject">a:0:{}</column>
<column name="rbl"></column>
<column name="no_mx">0</column>
<column name="no_smtp">1</column>
<column name="invalid_net">0</column>
<column name="rbl_listed">0</column>
<column name="checked">1</column>
<column name="active">1</column>
<column name="last_activity">1635607030</column>
<column name="maintenance_time">1635387453</column>
<column name="fail_count">0</column>
<column name="temp_fail">0</column>
<column name="lock">0</column>
<column name="clean">0</column>
<column name="bonus">0</column>
<column name="malus">2</column>
<column name="whitelist">0</column>
</table>
<table name="acl_hosts">
<column name="ID">902</column>
<column name="ip">114.237.109.72</column>
<column name="ptr">114.237.109.72</column>
<column name="soa_domain">outlook.com</column>
<column name="location">Asia / China</column>
<column name="asn">4134</column>
<column name="asc">Chinanet</column>
<column name="ehlo">gs1-se.mail.protection.outlook.com</column>
<column name="reject">a:1:{i:0;s:16:"ptr_not_loopback";}</column>
<column name="rbl">"http://www.barracudanetworks.com/reputation/?pr=1&ip=114.237.109.72"</column>
<column name="no_mx">0</column>
<column name="no_smtp">0</column>
<column name="invalid_net">1</column>
<column name="rbl_listed">1</column>
<column name="checked">1</column>
<column name="active">1</column>
<column name="last_activity">1628048507</column>
<column name="maintenance_time">1628052203</column>
<column name="fail_count">0</column>
<column name="temp_fail">0</column>
<column name="lock">0</column>
<column name="clean">0</column>
<column name="bonus">0</column>
<column name="malus">2</column>
<column name="whitelist">0</column>
</table>
Running on FreeBSD/Bhyve
- A hozzászóláshoz be kell jelentkezni
A pontgyűjtést én nem raknám össze a rekordokkal, a DNS legyen DNS, végezze a dolgát. Ebből kifolyólag lehet a megfelelő logikával a DNS rekordokat előállítani. Ha más DNSBL-t alapul veszel, akkor miért nem használod eleve őket (is) akár úgy, hogy ha többön listázott egy IP akkor van reject, ha 1 -en akkor temp reject vagy greylist? Egy szem találat alapján rögtön rejectelni elég bátor szerintem, ezért írtam, hogy az SQL-ezésre vigyázni kéne. Ha pusztán szimpla selectjeid vannak az egy dolog, de valszin elég hamar elég brutál táblaméret jön össze, és például a powerdns remekül cache-eli a magában is a lekérdezési eredményeket.
A "ptr_not_loopback"-et nem értem pontosan, de elég elől van a szűrésben, hogy PTR nélküli, nemlétező helo hosztnéves küldőt eleve elhajtunk.
Az első példában lévő feladót nagyon "szeretem" én is, de ennél és a hasonlóknál előfordulhat, hogy tényleg a kedves felhasználó iratkozott fel valaha egyszer.
A terhelés és DoS vonalon az a gond, hogy elég nehéz kiszámolni, hogy épp hol mivel próbálkoznak. Ráadásul ha elrontják spammerék a scriptet, akkor ledöntik a spammelendő szerver, és persze akkor rögtön kiderül, hogy mi van. Volt már ilyen... :) Nem 1 levél jött mp-enként...
A néhány perces közzel gyártott DNS rekord tábla egyik előnye, hogy akár memória típusú is lehet, hiszen az tényleg bazigyors lesz minden szempontból. Mivel eleve előállított adatok, ezért különösebben izgulni sem kell miatta.
- A hozzászóláshoz be kell jelentkezni
Írtam egy nagyon szép hosszú választ erre bezártam az ablakot, na én se 16 vagyok már sajnos.
Köszönöm az észrevételeket én is úgy gondolom, hogy a DNS csak egy közbenső szereplő az adatbázis és a levelező szerver között, ugyanakkor a még nem tesztelt domaineket vegye fel, hogy a scannerem rátudjon mozdulni addig defer és íme egy "smart greylist".
A memória alapú tábla az jó ha a PDNS -t nézzük, de még jobb mikor C++ native std::map vagy std::vector szerializálva időközönként ezért is akarok saját DNS -t írni.
Alapvetőn a meglévő SPAM szűrő szoftver csak a levelek fejlécét kapja meg, tehát a levéltörzset nem az nem érdekel, azzal foglalkozzon az amavisd meg a clamav és társai, így a levelek 90% -át megszűröm a maradék 10% -ból 9% -ot a spamass, nagyon kellemes, illetve kifelé küldőket is megfgoja ha a megszokottól többet küld, 3 éve már nem kellett semelyik IP -met lekunyerálnom blacklistekről.
A DNS szerintem kb 60-70% -os hatékonysággal fog működni és csak befelé, de itt arra kell gondolni, hogy ha a levelek 60-70% -át eldobom, mennyivel kevesebb lesz az áramszámla azok a szerverek után amik ugyanezt tennék csak közben felzabálják az összes erőforrást, mert ezek a python és perlben írt csodák, na hát ezeket tényleg rommá lehet dosolni.
Különben még anno írtam egy DOS -t SMTP -re belső használatra, de túl jó lett, a komplett gépet elvitte. Viszont, jó hogy mondod a DDOS -ra figyelni kell, tehát egy bizonyos req/s esetén nem szabad replyzni mert akkor amplification nem tud létrejönni, így nem leszel target se.
ptr_not_loopback = PTR not loopback to itself, itt se a SOA domain se a PTR nem stimmel sőt kimondottan különbözőek, ha csak a te általad írt feltételt ilyen egyszerűséggel használnám akkor az EHLO és PTR névnél ugrik a szamlazz.hu és a NAV is (tapasztalat). Egyszerűnek tűnik, de kurva nehéz volt a korrekt megvalósítás mert rekurzív keresgélni kell MX -et és a SOA rekord alapján meghatározni a root domaint, ezt mind parallel asyncba mert 1-1 DNS lekérdezés akár 3-4 msáodperc is lehet hála az UDP -nek és jelenleg is van kb. 50,000 hoszt melyből kb 200 -at most is vizsgál a rendszer, ezért többször kell próbálni teljes sikertelenség esetén is, mert különben olyanok mennek SPAM -re akiknek éppen akkor nem volt elérhető a hálózatuk és az nem volna helyes.
Kézzel szabályokat felvinni nem annyira mókás, összesen eddig egy orosz és egy magyar spammer érdemelte ki manuális tiszteletemet, ráadásul a magyar még valahol ügyfél minősítésbe is lehetne ha szigorúan nézzük, de igazából minden általam üzemeltett szerverről egy gombnyomással távoztak, ugyhogy leszarom ő bajuk.
Running on FreeBSD/Bhyve
- A hozzászóláshoz be kell jelentkezni
Ezt a PTR_not_loopback -et így értem, de felém ez Exim-nél egyáltalán nem probléma, eleve így csinálja. Nem akadnak fenn se számlázós, se kormányzatos emailek. A naaagy felhősökre viszont kifejezettem whitelist-et kell felvenni, mert őket hiába DNSBL-ezem.
Az eredeti posztodban olyan szervereken akarod használni, ahol nincs közbülső szűrőd. Jóhány év és szerver utána azért ezek a központi cuccok jellemzően elég problémásak, mert ha jön a fals pozitív, akkor szétszórod mindenhova.
- A hozzászóláshoz be kell jelentkezni
Na nálam 2017 óta jól működik most csak annyi lesz, hogy lesz egy DNSBL is mellé, nem lesz annyira hatékony mint a MILTER de jó lesz reményeim szerint.
Running on FreeBSD/Bhyve
- A hozzászóláshoz be kell jelentkezni
Na már van egy félkész DNS szerverem, soha nem csináltam UDP szervert azt hittem nehezebb lesz.
Viszont a Network Byte order megviccelt csúnyán.
2021/11/03 02:01:50 | NOTICE | DNSBL DNS Cache-Server v1.0
2021/11/03 02:01:50 | NOTICE | Software is Starting Up ...
2021/11/03 02:01:50 | DEBUG | CDEBUG Macro Enabled, advanced debugging mode on
2021/11/03 02:01:50 | NOTICE | CDEBUG Macro Enabled, advanced debugging mode on
2021/11/03 02:01:50 | WARNING | CDEBUG Macro Enabled, advanced debugging mode on
2021/11/03 02:01:50 | ERROR | CDEBUG Macro Enabled, advanced debugging mode on
2021/11/03 02:01:50 | FATAL | CDEBUG Macro Enabled, advanced debugging mode on
2021/11/03 02:01:50 | NOTICE | DDoS Protection Worker Thread Started
2021/11/03 02:01:50 | NOTICE | DNS Resolver Worker Thread Started
2021/11/03 02:01:51 | NOTICE | [0.0.0.0] Listening on: 0.0.0.0:53
2021/11/03 02:01:51 | NOTICE | [::] Listening on: [::]:53
2021/11/03 02:01:54 | NOTICE | Incoming Message From: 2a01:36d:114:9e9:14db:2cbc:f6fe:986a:53874, len:36
2021/11/03 02:01:54 | DEBUG | Captured RTS Signal
02021/11/03 02:01:54 | DEBUG | DNS DEBUG:
-- ID -- [e32] --
-- RD: 1, TC: 0, AA: 0, OP: 0, QR: 0
-- RC: 0, CD: 0, AD: 0, Z: 0, RA: 0
-- QC: 1, AC: 0, AU: 0, A2: 0
2021/11/03 02:01:54 | DEBUG | Released RTS Signal
2021/11/03 02:01:54 | DEBUG | IQueue Counter reset to 0 from: 1
2021/11/03 02:01:55 | NOTICE | Incoming Message From: 87.97.25.107:53875, len:36
2021/11/03 02:01:55 | DEBUG | Captured RTS Signal
02021/11/03 02:01:55 | DEBUG | DNS DEBUG:
-- ID -- [e32] --
-- RD: 1, TC: 0, AA: 0, OP: 0, QR: 0
-- RC: 0, CD: 0, AD: 0, Z: 0, RA: 0
-- QC: 1, AC: 0, AU: 0, A2: 0
2021/11/03 02:01:55 | DEBUG | Released RTS Signal
2021/11/03 02:01:55 | DEBUG | IQueue Counter reset to 0 from: 1
^C2021/11/03 02:03:13 | NOTICE | SIGNAL CAPTURED: SIGINT
2021/11/03 02:03:13 | NOTICE | Waiting for threads exit ..., remaining: 2
2021/11/03 02:03:13 | NOTICE | DNS Resolver Worker Thread Finished
^C2021/11/03 02:03:13 | NOTICE | SIGNAL CAPTURED: SIGINT
2021/11/03 02:03:13 | NOTICE | Waiting for threads exit ..., remaining: 1
2021/11/03 02:03:14 | NOTICE | DDoS Protection Worker Thread Finished
2021/11/03 02:03:14 | NOTICE | Safe Cleanup Done
Running on FreeBSD/Bhyve
- A hozzászóláshoz be kell jelentkezni
- A hozzászóláshoz be kell jelentkezni
DNSBL keves manapsag, javaslom nezd meg az Rspamd-t!
- A hozzászóláshoz be kell jelentkezni
Igazad van én speciel miltert használok és saját implementácót, de DNSBL szolgáltatást akarok nyújtani nyilván (RHSBL) -el és akár hasonlóan mint az rspamd dedikált SPAM védelmet.
Én nem kliensben hanem hosztban gondolkodom, de értem amit mondassz.
Running on FreeBSD/Bhyve
- A hozzászóláshoz be kell jelentkezni
En is igy hasznalom az Rspamd-t, be van kotve 4 mailszerver, megfeleloen szeparalva.
- A hozzászóláshoz be kell jelentkezni
Mi ezt implementáltuk: https://rbldnsd.io/
- A hozzászóláshoz be kell jelentkezni
fasza akkor mondod, mikor már majdnem elkészültem egy sajáttal ^^, nem baj, legalább lesz összehasonlítási alap.
Mivel lehetne megbenchelni ezeket? már csak így kiváncsi lennék mennyivel lesz lassabb a C++ implementációm, mert úgy olvasom, hogy ez is extrém gyors.
Running on FreeBSD/Bhyve
- A hozzászóláshoz be kell jelentkezni
Követem, nagyon kellene csinálni. Csináltam már egyszer PowerDNS alapon, csak lusta voltam újra írni egy PHP frontot hozzá.
- A hozzászóláshoz be kell jelentkezni
Mint kiderült a PDNS -t is ki lehet nyírni DNS lekérdezésekkel, csináltam egy DNS Benchet és DoS lett belőle, ezt lehet nem kéne publikálni ^^
A DOS és DDOS protection működik szépen, DNS Refuse (5) parancsot 10 ms alatt ada garantáltan akár 32 szálon, szóval jön az adatbázis thing.
Running on FreeBSD/Bhyve
- A hozzászóláshoz be kell jelentkezni