· kaynak Hacker News – Front Page (native)
ESP32-C3 DNS ad-blocker, 2 dolarlık kartta flash üzerinden 537 bin domaini susturuyor
Açık kaynak bir proje, 2 dolarlık bir ESP32-C3'ü Pi-hole tarzı bir DNS sinkhole'a dönüştürüyor; blocklist domainlerini flash'ta 40-bit hash olarak saklayarak yaklaşık 50 KB RAM kullanıyor.
Bir geliştirici, hiç PSRAM'i olmayan 2 dolarlık bir ESP32-C3 kartında çalışan bir DNS ad-blocker'ı açık kaynak yaptı ve bir fincan kahve fiyatındaki bu donanımdan Pi-hole tarzı ağ geneli filtreleme sunuyor. M-Abozaid'in geliştirdiği esp32-c3-adblock projesi Hacker News'in ana sayfasına kadar yükseldi; README'sine göre Tom's Hardware, XDA Developers ve Korben tarafından da ele alındı.
Blocklist flash'a nasıl sığıyor
Depoya göre, ESP32 tabanlı DNS sinkhole'larının çoğu blocklist'i RAM'de domain stringleri olarak tutuyor ve bu da onları PSRAM'li kartlara itiyor. Bu proje farklı bir yol izliyor: her domain 40-bit bir FNV-1a hash'ine indiriliyor, hash'ler sıralanarak flash'ta saklanıyor ve gelen sorgular bu tablo üzerinde binary search ile çözülüyor. Bir eşleşme 0.0.0.0 ile — yani bir sinkhole ile — yanıtlanırken, diğer her şey upstream bir resolver'a iletiliyor ve yanıt istemciye aktarılıyor.
README'nin verdiği rakamlar: yaklaşık 141.000 domain flash'ın yaklaşık 0,67 MB'ını kaplıyor, bir arama yaklaşık 18 flash okuması sürüyor — WiFi gidiş-dönüşü dahil yaklaşık 10 ms — ve toplam RAM kullanımı 50 KB civarında. Karşılaştırılabilir bir string-RAM'de tasarım, 8 dolarlık bir PSRAM kartında yaklaşık 2,5 MB bellek gerektirirdi.
40-bit genişlik bilinçli bir tercih. Çakışmalar birthday bound'a uyduğu için 141k domainde fiilen hiç çakışma olmuyor, buna karşılık 537.000 girişlik tam listede yaklaşık bir tane oluşuyor — yani tek bir masum domain yanlışlıkla engelleniyor. README, 32-bit hash'lerin flash'ın yüzde 20'sini kurtaracağını ama 250k girişte yaklaşık yedi çakışmaya yol açacağını, 64-bit hash'lerin ise var olmayan bir sorunu çözmek için domain başına üç ekstra bayt harcayacağını savunuyor. Teknik, C3'ün ötesine de ölçekleniyor: 16 MB'lık bir ESP32-S3'te flash'taki hash'ler yaklaşık 2,7 milyon domain tutarken, stringler 8 MB PSRAM'de yaklaşık 466.000 domain tutuyor.
Derleme ve çalıştırma
Test edilen hedef, 4 MB flash'a sahip herhangi bir ESP32-C3 kartı; geliştirme için bir C3 SuperMini kullanıldı. Klasik bir ESP32 DevKit de derleniyor, ancak bu yapılandırma topluluk tarafından katkılmış ve yalnızca derleme testinden geçmiş durumda. Tek bir USB flash, firmware'i ve blocklist dosya sistemini kuruyor; ondan sonra her şey WiFi üzerinden gerçekleşiyor: c3adblock.local adresindeki web paneli blocklist yüklemelerini, firmware güncellemelerini ve ağ yapılandırmasını yönetiyor, ilk WiFi kurulumu için cihaz üzerinde bir captive portal sunuluyor. Güncel bir varsayılan blocklist her hafta GitHub Actions tarafından yeniden oluşturulup kararlı bir URL'de yayımlanıyor, böylece cihaz listesini kendi başına güncel tutabiliyor.
Blocklist'ler; hosts dosyalarını, düz domain listelerini ve @@ istisna kuralları dahil temel AdGuard/Adblock sözdizimini kabul eden bir Python build script'i tarafından üretiliyor; @@ kuralları tam bir girişi kaldırıyor. Varsayılan liste, StevenBlack temel listesiyle Hagezi Light'ı birleştirerek README'nin WhatsApp ve sosyal platformlar için güvenli diye nitelediği yaklaşık 100.000 girişe ulaşıyor. Bir DNS hash listesinin ifade edemediği kural türleri — regex'ler, wildcard'lar, kozmetik filtreler — atlanıyor ve sayılıyor. 4 MB flash'ta bir bölümleme dengesi var: firmware OTA için iki app slotu tutmak listeye yaklaşık 1,3 MB bırakıyor ve listeyi 250k domainde sınırlarken, 537k'lık "ultimate" liste firmware OTA'dan vazgeçen tek-app düzeni gerektiriyor. Güç, bir router'ın boştaki USB portundan sağlanabilir; ancak README, ucuz USB-C adaptörlerinin iletim sırasında radyoyu brown-out'a uğratabileceği konusunda uyarıyor. 3D yazdırılabilir bir kutu da dahil.
Güvenlik dengeleri
README, cihazın sınırları konusunda alışılmadık derecede açık sözlü. /ban, /upload ve OTA route'ları gibi durumu değiştiren panel uç noktaları artık HTTP Basic Auth gerektiriyor ve ağ üzerinden OTA ayrı bir şifre istiyor; daha önce bunlara hiçbir kimlik bilgisi olmadan erişilebiliyordu ve bu, ağdaki her DNS sorgusunun yolunda duran bir kutu için gerçek bir endişeydi. Özel domain adları üzerinden bir stored-XSS yolu HTML kaçış karakterleriyle kapatıldı. Yine de her şey 80 numaralı portta düz HTTP üzerinden çalışıyor — çip bir TLS sunucusu için gerçekçi bir bütçeye sahip değil — kimlik bilgileri yalnızca base64 ile kodlanıyor ve bunları önbelleğe alan tarayıcılar, alakasız sayfalar tarafından kimlik doğrulamalı istekler göndermeye ikna edilebiliyor.
Neden önemli
Reklam engellemenin ötesinde, bu bir veri temsili dersi. Sabit genişlikli hash'ler, sıralı flash depolama ve binary search seçimi, iki dolarlık silikona normalde bir Raspberry Pi'ye emanet edilen bir işi yaptırıyor ve hash'i boyutlandırmak için kullanılan çakışma matematiği, herhangi bir gömülü geliştiricinin ödünç alabileceği bir kalıp. Hobici için ise, tam olarak tek kartlık bir parça listesiyle sahip, kendini güncelleyen, ağ geneli bir filtre.
- #open-source
- #esp32
- #dns
- #ad-blocking
- #embedded
İlgili yazılar
- Strands Agents, milisaniyeler içinde yerel olarak çalışan 2B karar modelini açık kaynak yaptı
- Penguin Mail 1.0.0, takvim ve isteğe bağlı yerel yapay zekâ ile açık kaynak Linux e-posta yazılımı olarak yayımlandı
- AnyPS5, PS5 çalıştırılabilir dosyalarını Windows ve Linux'ta doğal olarak çalışacak şekilde yeniden bağlıyor