업데이트로 돌아가기
New releaseAug 20, 2026

numa v0.23.0

Rust로 작성된 휴대용 DNS 리졸버 — .numa 로컬 도메인, 광고 차단, 개발자 오버라이드

공유

Numa

CI crates.io License: MIT

당신이 소유하는 DNS. 어디서나.numa.rs

단일 바이너리로 동작하는 휴대용 DNS 리졸버입니다. 어떤 네트워크에서든 광고를 차단하고, 로컬 서비스에 이름을 부여하며(frontend.numa), 자동 복원(auto-revert) 기능으로 모든 호스트명을 재정의(override)하고, 모든 아웃바운드 질의를 ODoH (RFC 9230) 로 암호화하여 어느 한 당사자도 당신의 신원과 질의 내용을 동시에 알 수 없게 합니다. 노트북만 있으면 되고, 클라우드 계정이나 라즈베리 파이가 필요하지 않습니다.

Rust로 처음부터 직접 만들었습니다. DNS 라이브러리는 전혀 사용하지 않았습니다. 캐싱, 광고 차단, 로컬 서비스 도메인이 기본으로 제공됩니다. 루트 네임서버로부터 선택적 재귀(resolve)가 가능하며, 완전한 DNSSEC 신뢰 체인 검증과 함께 암호화된 클라이언트 연결(iOS Private DNS, systemd-resolved 등)을 위한 DNS-over-TLS 리스너도 지원합니다. numa relay를 실행하면 동일한 바이너리가 공용 ODoH 엔드포인트가 됩니다. 현재 큐레이팅된 DNSCrypt 목록에는 유일하게 살아있는 릴레이가 하나뿐이므로, Numa를 배포할 때마다 생태계가 실질적으로 확장됩니다. 약 8MB의 단일 바이너리에 모든 것이 포함되어 있습니다.

Numa dashboard

빠른 시작

# macOS
brew install razvandimescu/tap/numa

# Linux
curl -fsSL https://raw.githubusercontent.com/razvandimescu/numa/main/install.sh | sh

# Arch Linux
pacman -S numa

# Windows — GitHub Releases에서 다운로드
# 모든 플랫폼
cargo install numa

# Docker
docker run -d --name numa --network host ghcr.io/razvandimescu/numa

# Nix
nix run github:razvandimescu/numa
sudo numa                              # 포그라운드 실행 (포트 53은 root/관리자 권한 필요)

대시보드 열기: http://numa.numa (또는 http://localhost:5380)

시스템 DNS로 설정:

플랫폼설치제거
macOSsudo numa installsudo numa uninstall
Linuxsudo numa installsudo numa uninstall
Windowsnuma install (관리자) + 재부팅numa uninstall (관리자) + 재부팅

macOS와 Linux에서 numa는 시스템 서비스(launchd/systemd)로 실행됩니다. Windows에서는 레지스트리를 통해 로그인 시 자동 시작됩니다. 또한 Windows는 127.0.0.2:53에 바인딩하고(내장 Dnscache가 127.0.0.1:53을 소유), NRPT 규칙을 설치하여 질의를 해당 주소로 라우팅합니다. 따라서 bind_addr/api_bind_addr127.0.0.1이 아닌 127.0.0.2로 설정해야 합니다.

로컬 서비스

포트 번호 대신 개발 서비스에 이름을 부여하세요:

curl -X POST localhost:5380/services \
  -d '{"name":"frontend","target_port":5173}'

이제 브라우저에서 https://frontend.numa가 동작합니다. 녹색 자물쇠, 유효한 인증서, HMR을 위한 WebSocket 패스스루를 제공합니다. mkcert, nginx, /etc/hosts가 필요 없습니다.

경로 기반 라우팅(app.numa/api → :5001)을 추가하고, LAN 검색을 통해 여러 머신 간에 서비스를 공유하거나, numa.toml에서 모든 것을 설정할 수 있습니다.

광고 차단 및 개인정보 보호

Hagezi Pro를 통해 385,000개 이상의 도메인이 차단됩니다. 커피숍, 호텔, 공항 등 어떤 네트워크에서도 동작합니다. 노트북을 가지고 다닐 때 함께 이동합니다.

세 가지 해석 모드(Resolution Modes):

  • forward (기본값) — 기존 시스템 DNS에 대한 투명 프록시입니다. 캐싱과 광고 차단이 추가되었을 뿐, 모든 것이 이전과 동일하게 작동합니다. 캡티브 포털, VPN, 기업 DNS 모두 존중됩니다.
  • recursive — 루트 네임서버에서 직접 해석합니다. 상위 의존성이 없으며, 단일 주체가 전체 질의 패턴을 볼 수 없습니다. 완전한 신뢰 체인 검증을 위해 [dnssec] enabled = true를 추가하세요.
  • auto — 시작 시 루트 서버를 프로브하고, 접근 가능하면 재귀, 차단되면 암호화된 DoH 폴백을 사용합니다.

DNSSEC는 RRSIG 서명, DNSKEY 검증, DS 위임, NSEC/NSEC3 부재 증명을 포함한 전체 신뢰 체인을 검증합니다. 작동 방식 읽기 →

DNS-over-TLS 리스너 (RFC 7858) — iOS Private DNS, systemd-resolved, stubby 같은 엄격한 클라이언트로부터 포트 853에서 암호화된 질의를 수락합니다. 두 가지 모드:

  • 자체 서명 (기본값) — numa가 로컬 CA를 자동으로 생성합니다. numa install은 macOS, Linux(Debian/Ubuntu, Fedora/RHEL/SUSE, Arch) 및 Windows의 시스템 신뢰 저장소에 추가합니다. iOS에서는 numa setup-phone.mobileconfig를 설치합니다. Firefox는 자체 NSS 저장소를 사용하며 시스템 저장소를 무시하므로, Firefox에서 HTTPS를 통해 .numa 서비스를 사용하려면 CA를 수동으로 신뢰해야 합니다.
  • 직접 인증서 가져오기[dot] cert_path / key_path에 공개적으로 신뢰할 수 있는 인증서(예: Let's Encrypt의 DNS-01 챌린지를 통해 numa 인스턴스를 가리키는 도메인)를 지정합니다. 클라이언트는 별도의 신뢰 저장소 설정 없이 연결됩니다. AdGuard Home이나 Cloudflare 1.1.1.1과 동일한 사용자 경험입니다.

ALPN "dot"이 두 모드 모두에서 광고되고 강제됩니다. ALPN이 일치하지 않는 핸드셰이크는 교차 프로토콜 혼동 방어를 위해 거부됩니다.

휴대폰 설정 — 아이폰이나 안드로이드 기기를 Numa에 한 번에 연결:

numa setup-phone

QR 코드가 출력됩니다. 스캔하고 프로필을 설치한 후 인증서 신뢰를 켜면, 휴대폰의 DNS가 TLS를 통해 Numa로 라우팅됩니다. numa.toml에서 [mobile] enabled = true가 필요합니다.

LAN 검색

여러 머신에서 Numa를 실행하면 mDNS를 통해 자동으로 서로를 찾습니다:

Machine A (192.168.1.5)              Machine B (192.168.1.20)
┌──────────────────────┐             ┌──────────────────────┐
│ Numa                 │    mDNS     │ Numa                 │
│  - api (port 8000)   │◄───────────►│  - grafana (3000)    │
│  - frontend (5173)   │  discovery  │                      │
└──────────────────────┘             └──────────────────────┘

Machine B에서 curl http://api.numa → Machine A의 포트 8000으로 프록시됩니다. numa lan on으로 활성화하세요.

허브 모드: 한 인스턴스를 bind_addr = "0.0.0.0:53"으로 실행하고 다른 장치들의 DNS를 이 인스턴스로 지정하면, 설치 없이 광고 차단 및 .numa 해석을 사용할 수 있습니다. bind_addr은 특정 인터페이스 서브셋을 바인딩하기 위한 리스트도 허용합니다.

도커

# 권장 — 호스트 네트워킹 (Linux)
docker run -d --name numa --network host ghcr.io/razvandimescu/numa

# 포트 매핑 (macOS/Windows Docker Desktop)
docker run -d --name numa -p 53:53/udp -p 53:53/tcp -p 5380:5380 ghcr.io/razvandimescu/numa

대시보드: http://localhost:5380. 이미지는 기본적으로 API와 프록시를 0.0.0.0에 바인딩합니다. 사용자 설정 구성으로 재정의:

docker run -d --name numa --network host \
  -v /path/to/numa.toml:/root/.config/numa/numa.toml \
  ghcr.io/razvandimescu/numa

멀티 아키텍처: linux/amd64linux/arm64.

단순한 compose 레시피:

비교 표

Pi-holeAdGuard HomeUnboundNuma
로컬 서비스 프록시 + 자동 TLS.numa 도메인, HTTPS, WebSocket
LAN 서비스 검색mDNS, 설정 불필요
개발자 재정의 (REST API)자동 복원, 스크립팅 가능
재귀 리졸버예 (SRTT 선택 포함)
DNSSEC 검증예 (RSA, ECDSA, Ed25519)
광고 차단385,000개 이상 도메인
웹 관리 UI전체전체대시보드
암호화 상위 전달 (DoH/DoT)cloudflared 필요DoH만DoT만DoH + DoT (tls://)
암호화 클라이언트 (DoT 리스너)stunnel 사이드카 필요네이티브 (RFC 7858)
DoH 서버 엔드포인트예 (RFC 8484)
요청 헤징(Request hedging)모든 프로토콜 (UDP, DoH, DoT)
스테일 응답 제공 + 프리페치TTL 90%에서 프리페치RFC 8767, TTL 90%에서 프리페치
조건부 전달예 (접미사별 규칙)
휴대성 (노트북)아니요 (어플라이언스)아니요 (어플라이언스)서버단일 바이너리, macOS/Linux/Windows
커뮤니티 성숙도56K 별, 10년33K 별20년신규

성능

캐시된 질의 0.1ms — Unbound 및 AdGuard Home과 동급입니다. 와이어 레벨 캐시는 원시 바이트를 저장하면서 제자리 TTL 패칭을 수행합니다. 요청 헤징(Request hedging)은 p99 스파이크를 제거합니다: 콜드 재귀 p99 538ms 대 Unbound 748ms (−28%), σ 4배 더 좁습니다. 벤치마크 →

더 알아보기

로드맵

  • DNS 전달, 캐싱, 광고 차단, 개발자 재정의
  • .numa 로컬 도메인 — 자동 TLS, 경로 라우팅, WebSocket 프록시
  • LAN 서비스 검색 — mDNS, 크로스 머신 DNS + 프록시
  • DNS-over-HTTPS — 암호화된 상위 전달 + 서버 엔드포인트 (RFC 8484)
  • DNS-over-TLS — 암호화된 클라이언트 리스너 (RFC 7858) + 상위 전달 (tls://)
  • Oblivious DoH — 익명 클라이언트 모드 + 공용 릴레이 (numa relay, RFC 9230)
  • 재귀 해석 + DNSSEC — 신뢰 체인, NSEC/NSEC3
  • SRTT 기반 네임서버 선택
  • 다중 전달자 페일오버 — SRTT 순위 및 폴백 풀을 갖춘 여러 상위 전달자
  • 요청 헤징 — 병렬 요청으로 패킷 손실 및 꼬리 지연 시간 복구 (모든 프로토콜)
  • 스테일 응답 제공 + 프리페치 — RFC 8767, TTL 10% 미만 및 스테일 제공 시 백그라운드 새로고침
  • 조건부 전달 — 분할 호라이즌 DNS(Tailscale, VPN)를 위한 접미사별 규칙
  • 캐시 워밍 — 설정된 도메인에 대한 사전 해결
  • 모바일 온보딩 — setup-phone QR 플로우, 모바일 API, 모바일 구성 프로필
  • pkarr 통합 — Mainline DHT를 통한 자주 주권 DNS
  • 글로벌 .numa 이름 — DHT 기반, 등록 기관 불필요

라이선스

MIT

카테고리