Hacker News하드웨어 · 시스템오늘의 주요

$2 ESP32-C3로 PSRAM 없이 Pi-hole 수준의 광고 차단

원제 ESP32-C3 Adblock

189 포인트댓글 82
Key Point

값싼 마이크로컨트롤러로 PSRAM 비용 없이 대규모 차단 목록을 관리하는 해시 기반 최적화 기법이 실제로 작동하며, 가정용 DNS 차단 서버의 진입장벽을 크게 낮춤.

핵심 요약

  • 14만 개 이상의 도메인을 0.7MB 플래시 저장소에 40비트 해시로 저장하고 이진 검색으로 ~10ms에 매칭하는 DNS 광고 차단 프로젝트.
  • 기존 ESP32 광고 차단기는 차단 목록을 RAM에 올려야 해서 비싼 PSRAM이 필요하지만, 이 프로젝트는 도메인 문자열 대신 5바이트 고정 길이 해시를 플래시에 저장해 ~50KB RAM만 사용.
  • 40비트 크기는 목표 플래시 용량에서 충돌을 최소화하는 최적값으로, 14만 도메인에서 충돌 거의 없고 53만 7천 도메인에서도 1건만 발생.
  • ESP32-C3 SuperMini 보드에 USB-C 어댑터로 전원을 공급하면 라우터나 별도 박스 없이 작동하며, 인쇄 가능한 3D 케이스 제공.
  • PlatformIO로 한 번 USB 플래시하면 이후 펌웨어와 차단 목록 모두 WiFi로 업데이트되며, 웹 대시보드에서 커스텀 차단 도메인 추가 가능.
  • hosts 파일, 일반 도메인 목록, AdGuard/Adblock 형식의 blocklist 소스들을 혼합해 build_blocklist.py로 해시 테이블 생성.
  • 4MB 플래시의 트레이드오프: 펌웨어 OTA 업데이트를 위해 두 개 앱 슬롯이 필요해 차단 목록은 최대 25만 도메인 (1.3MB) 제한.
  • HTTP Basic Auth(WEB_USER/WEB_PASS)로 대시보드의 상태 변경 엔드포인트(/ban, /addblock, /upload 등) 보호하고, 네트워크 OTA는 OTA_PASS로 추가 보호.
  • CSRF 공격 방지를 위해 모든 변경 엔드포인트가 커스텀 X-Requested-With: c3-adblock 헤더 요구, 저장된 XSS 경로 차단을 위해 도메인명 HTML 이스케이프 처리.
  • 기본 인증은 평문 HTTP (:80)으로만 작동하고 credentials가 base64로만 인코딩되므로, LAN 신뢰 경계 제어일 뿐 암호화 보안이 아님.
  • secrets.h에 기본값(CHANGE_ME_WEB_PASSWORD 등)이 남으면 공개 패스워드로 부팅되며, 이 경우 펌웨어가 경고 로그와 대시보드 배너로 알림.
  • 디바이스 DNS를 C3 IP로 지정하거나 보조 resolver로 추가하면 작동하며, 매주 월요일 GitHub Actions로 기본 차단 목록 빌드해 안정적인 URL에서 배포.
  • ES32-S3의 16MB 플래시에서는 같은 해시 방식으로 270만 도메인 저장 가능하며, PSRAM의 46만 6천 도메인과 비교해 더 효율적.
AI 요약 안내

AI가 한국어로 정리한 내용입니다. 정확한 정보는 원문을 확인해 주세요.

요약 원칙 ↗