M-Abozaid/esp32-c3-adblock
$2 ESP32-C3로 만드는 광고 차단 DNS 서버
원제 M-Abozaid/esp32-c3-adblock
스타 1,331당일 +196C++
Key Point
저가 마이크로컨트롤러로 대규모 광고 차단 서버를 만드는 방식이 근본적으로 다르므로, 자체 DNS 서버 구축을 고려하는 개발자와 홈랩 운영자에게 참고할 만한 기술이다.
핵심 요약
- Pi-hole 같은 DNS 광고 차단기를 $2짜리 ESP32-C3 마이크로컨트롤러에 구현한 프로젝트로, PSRAM 없이도 동작한다.
- 핵심 아이디어는 도메인 문자열을 RAM에 올리지 말고 40비트 FNV-1a 해시를 플래시에 저장한 후 이진 탐색으로 검색하는 것이다.
- 537,000개 도메인을 약 50KB의 RAM만 사용해 저장할 수 있으며, 조회는 10ms 정도에 완료된다.
- 40비트 해시는 최적의 충돌률(141k 도메인에서 0건, 537k에서 약 1건)과 플래시 사용량의 균형점이다.
- 기존 문자열 기반 접근(2.5MB RAM 필요)과 달리 이 방식은 단 0.67MB 플래시로 141k 도메인을 처리한다.
- ESP32-C3 SuperMini 보드에 USB 케이블과 전원 공급만으로 라우터 뒤에 플러그인할 수 있는 기기 형태로 동작한다.
- 웹 대시보드(http://c3adblock.local)에서 차단 통계 조회, 클라이언트별 통계, 커스텀 도메인 추가/제거가 가능하다.
- WiFi 설정이 없으면 자동으로 캡티브 포털(`C3-AdBlock-XXXX`)을 열어 스마트폰에서 네트워크 정보를 입력할 수 있다.
- 펌웨어와 차단 목록 모두 USB 초기 플래싱 후 WiFi를 통해 OTA 업데이트되며, GitHub Actions로 매주 월요일 기본 차단 목록을 업데이트한다.
- HTTP Basic Auth로 보호되는 상태 변경 엔드포인트(차단/해제, OTA 업로드)는 `secrets.h`의 `WEB_USER`/`WEB_PASS`로 인증되며, CSRF 공격 방지를 위해 `X-Requested-With: c3-adblock` 헤더를 요구한다.
- 4MB 플래시 제약으로 펌웨어 OTA를 활용하려면 약 250k 도메인 크기의 차단 목록만 가능하고, 537k 도메인의 전체 목록은 단일 파티션 구성(OTA 미지원)을 선택해야 한다.
- hosts 파일, 평문 도메인 목록, AdGuard/Adblock 규칙 형식의 혼합 소스를 `build_blocklist.py`로 처리할 수 있으며, 서브도메인 자동 차단을 지원한다.
- 이 해시 기반 최적화 기법은 C3뿐 아니라 더 큰 칩(예: 16MB ESP32-S3)에도 적용 가능해 2.7M 도메인까지 수용할 수 있다.
- MIT 라이선스로 공개되며 Tom's Hardware, XDA Developers, Korben 등 주요 기술 매체에 소개되었다.
저장소 보기 ↗github.com