2달러 ESP32-C3로 13만 도메인 차단, 플래시 1MB·RAM 40KB DNS 싱크홀
- $2짜리 ESP32-C3에서 블록리스트를 정렬된 64비트 FNV-1a 해시로 LittleFS 플래시에 저장하고 이진 탐색함. 도메인 13만 개 이상을 플래시 약 1MB, RAM 약 40KB에 담으며 PSRAM이 필요 없음.
- UDP DNS 서버가 차단 도메인에 0.0.0.0을 응답하고 나머지 질의는 업스트림 리졸버로 넘기는 DNS 싱크홀 방식임.
- docs/ 아래 ESP Web Tools 설치기를 두어 Chrome이나 Edge에서 PlatformIO와 툴체인 없이 클릭 한 번으로 플래시할 수 있음. 펌웨어, 부트로더, 파티션, 141k 블록리스트 LittleFS 이미지를 함께 내려받음.
- ESP32-C3 SuperMini용 3D 프린팅 케이스 STL을 제공해 USB-A to C 동글을 거쳐 공유기의 남는 USB 포트에 바로 꽂을 수 있음. README에 안테나 이격 거리와 프린트 설정을 적어둠.
- 커밋 35개이며 GitHub Actions로 단위 테스트를 push와 PR마다 실행함. 커밋 상당수에 Claude가 공동 작성자로 들어가 있음.
Hacker News 의견들
아이디어는 좋은데 지연이 너무 클 듯. 유선이면 로컬 DNS가 1ms 아래인데 WiFi만 타도 8ms는 기본이고, 패킷 손실 한 번 나면 50~100ms가 확 붙음. DNS는 거의 모든 요청마다 이 비용을 내는 구조라 좀 아픔.
사용자 한 명한테도 느릴 텐데 여러 명 붙으면 더 심하겠지.
해시 충돌 설명이 좀 거꾸로인 듯. 차단 도메인 두 개가 같은 해시여도 둘 다 막으면 그만이고, 진짜 문제는 google.com 해시가 adserver.com 해시랑 같아서 멀쩡한 도메인이 막히는 false positive임. 웹 대시보드랑 /unblock API가 있으니 풀 방법은 있어 보임.
화이트리스트가 훨씬 쉬움. 크기도 작고 매일 새 사이트를 도는 사람이라도 14만 개까지는 안 감. 내가 쓰는 DNS 매핑은 거의 정적이라 프록시 메모리에 넣어두면 DNS 질의 자체를 안 함.
나는 목록 모으는 걸 좋아해서 PiHole에 1400만~1600만 개 차단 도메인을 넣어둠. 이 프로젝트는 캐주얼 차단엔 좋은데 요즘은 오히려 허용 목록 쪽으로 마음이 기울어서, 좋은 인터넷만 추려도 14만 개에 들어갈지 궁금함.
ESP32-C3 성능을 생각하면 허용 목록이 RAM도 CPU도 아낄 듯.
프로젝트 이름은 진짜 최악인데 작동은 신기함.
PiHole 왜 쓰는지 모르겠음. 그냥 제대로 된 DNS 쓰면 되고 로컬이면 unbound 돌리면 됨.
둘은 같이 쓰는 거임. PiHole은 좋은 DNS 서버가 아니라 좋은 광고차단 DNS 서버고, 사람들은 UI랑 문서, 커뮤니티 때문에 씀.
10ms면 느린 거 아님?
그래도 원격 리졸버보단 빠름. dnsperf.com 보면 됨.
ESP32에 PlatformIO 쓸 이유가 없음. ESP-IDF 네이티브 확장이 훨씬 낫고 PlatformIO는 아두이노 IDE 대용으로만 추천함.
할 수 있는지에만 꽂혀서 해야 하는지는 안 물었다는 밈이 딱인데, 어쨌든 동작하는 게 대단함.
README 첫 문장은 직접 써줬으면. '아무도 모르는 트릭' 어쩌고 하면서 해시 충돌로 도메인 하나 더 막는 걸 공간 낭비라며 잘라버리는 게, LLM이 자기 확신을 쏟아내는 그 말투라 짜증남.
ESP32-C3 살 거면 외장 안테나 붙일 수 있는 버전으로 사라. 기본 내장 안테나가 너무 약해서 계획했던 용도로는 못 씀.
Bloom filter 같은 걸 쓰면 도메인을 더 넣을 수 있을 듯. false positive가 생기겠지만 이 프로젝트는 이미 그런 트레이드오프를 하고 있음.