오픈 리졸버, 그리고 일주일 뒤의 널 라우팅
방화벽 규칙 하나가 지나치게 많이 열려 있거나, access-control 줄이 allow로 남아 있는 경우입니다. 스캐너가 몇 시간 안에 포트를 찾아내고, 증폭 트래픽이 시작되고, 남용 신고가 도착하고, IP가 먹통이 됩니다. 기본적으로 거부하고, 터널만 허용하고, 네트워크 밖에서 테스트하십시오.

여러분의 기기가 조회하는 모든 도메인은 남의 파일 속 타임스탬프가 찍힌 한 줄입니다 — ISP의 파일이거나, 무료 공개 리졸버의 파일입니다. 그 파일을 여러분 소유의 머신으로 옮기는 여섯 단계: 루트부터 응답하는 Unbound, 앞단에서 필터링하는 AdGuard Home, 실제 인증서 위의 암호화된 DNS, 그리고 인터넷과 절대 마주치지 않는 53번 포트. 서버 비용은 월 $3.90입니다. Debian 12에서 테스트했습니다.
형태
재귀 방식, 포워딩이 아니라
닫기
53번 포트, 열리기 전에
해석
Unbound, 검증하는
필터링
AdGuard Home, DoH, DoT
접속
터널을 먼저, 클라이언트는 그다음
검증
누출, DNSSEC, 가동 시간
디스크를 암호화하고, 트래픽을 터널링하고, Monero로 결제하고, 이메일 없이 가입하십시오 — 그러고 나서는 정작 한 번도 생각해 본 적 없는 리졸버에게 노트북이 하루 종일, 건드리는 모든 호스트 이름을 한 번에 하나씩, 평문으로 물어보게 놔둡니다. 이름 조회는 사람들이 가장 나중에 보안을 강화하는 스택의 일부이며, 동시에 누군가가 실제로 무엇을 하는지에 대한 가장 깨끗한 기록을 만들어내는 부분이기도 합니다.
그 기록에 정확히 무엇이 담기는지 짚어볼 가치가 있습니다. "DNS는 여러분의 브라우징을 유출한다"는 말은 사실이면서도 게으른 말이기 때문입니다. 쿼리 로그는 물어본 IP 주소에 귀속된, 타임스탬프가 찍힌 도메인 이름들의 목록입니다. 여러분이 읽은 페이지가 아니며, 대개는 정확한 URL도 아닙니다. 그보다 더 조용하면서도, 프로파일링에는 오히려 더 유용한 무언가입니다: 삶의 형태입니다. 은행. 직장. 4분마다 확인하는 데이팅 앱. 새벽 2시에 딱 한 번 방문한 의료 사이트. 같은 메시징 클라이언트에 속해 있기 때문에 언제나 함께 나타나는 세 개의 도메인. 색인이 이 정도로 좋으면 아무도 내용물까지는 필요하지 않습니다.
그 색인을 쥘 수 있는 당사자는 네 종류이며, 직접 호스팅은 그것을 처음 둘에서 네 번째로 옮깁니다:
| 설정 | 여러분의 모든 쿼리를 누가 보는가 | 네트워크상에서 보이는 것 | 익명 집합 |
|---|---|---|---|
| ISP 리졸버, 평문 (기본값) | 여러분의 ISP, 이름과 계정으로 | 경로상의 누구에게나, 모든 것 | 그들의 가입자 전체 |
| 공개 리졸버, 암호화 (DoH/DoT) | 그 회사 한 곳, 여러분의 IP와 연결되어 | 목적지 말고는 아무것도 | 수백만 명 |
| 직접 운영하는 리졸버, 업스트림으로 포워딩 | 여러분이 고른 업스트림 — 그대로 | 목적지 말고는 아무것도 | 1명 |
| 직접 운영하는 리졸버, 루트부터 재귀 | 아무도 없음 — 각 존은 자신의 이름만 봅니다 | 목적지 말고는 아무것도 | 1명, 그것도 여러분이 아닌 IP에서 |
세 번째 행이 사람들을 함정에 빠뜨리는 행입니다. 자신의 서버에 리졸버를 설치하고 모든 것을 1.1.1.1로 포워딩하도록 설정하면 딱 한 가지만 바뀝니다: 이제 여러분의 쿼리가 다른 IP 주소에서 Cloudflare에 도착한다는 것뿐입니다. 로그는 여전히 존재하고, 여전히 남의 것이며, 여러분은 아무 대가도 없이 유지보수할 머신 하나만 더 늘린 셈입니다.
마지막 열이 정직한 대가이며, 이 가이드는 두 번 이 이야기로 돌아옵니다. 한 가정만 쓰는 리졸버는 그 쿼리가 명백히 그 가정의 것임을 드러내는 리졸버입니다. 그럼에도 이 거래가 할 만한 이유는 물어보는 쪽의 IP가 신분증명서가 뒤에 없는 임대한 노르딕 서버이기 때문입니다 — 가입자 이름이 달린 가정용 회선도 아니고, 카드 정보가 등록된 하이퍼스케일러 계정도 아닙니다. 익명 집합은 줄어들지만, 실제로 끊어지는 것은 특정 개인으로의 연결입니다.
"나만의 DNS 서버"라는 문구 뒤에는 완전히 다른 두 종류의 머신이 숨어 있고, 거의 모든 튜토리얼은 잘못된 쪽을 만듭니다. 무엇이든 설치하기 전에 이것부터 결정하십시오. 프라이버시 도구와 남의 프라이버시 정책을 위한 프록시의 차이가 여기서 갈리기 때문입니다.
포워더 는 여러분의 쿼리를 받아 다른 리졸버 — 보통 Cloudflare, Google, Quad9 또는 여러분의 ISP — 로 넘긴 뒤, 돌아오는 것을 캐시합니다. 단순하고 빠르지만, 여러분의 쿼리 스트림 전체를 단일 제3자에게 넘겨줍니다. "이제 업스트림을 1.1.1.1로 설정하십시오"로 끝나는 가이드는 모두 이런 것을 만든 것입니다.
재귀 리졸버 는 그 일을 직접 합니다. mail.example.com을 찾기 위해 루트 서버에게 .com을 누가 운영하는지 묻고, .com 서버에게 example.com을 누가 운영하는지 물은 다음, example.com 자신의 네임서버에게 레코드를 묻습니다. 서로 다른 서너 곳의 운영자와 나누는 서너 번의 짧은 대화이며, 그 누구도 다른 곳에 대해서는 아무것도 듣지 못합니다. QNAME 최소화를 켜면 한 발 더 나아갑니다: 루트에게는 .com에 대해서만 묻고, .com 서버에게는 example.com에 대해서만 묻습니다. 전체 이름이 드러나는 대상은 정확히 한 당사자뿐입니다 — 그 이름을 호스팅하는 곳이며, 어차피 30밀리초 뒤에는 여러분의 연결을 받게 될 곳입니다.
| 속성 | Unbound, 재귀 | 포워더 전반 | AdGuard Home 단독 |
|---|---|---|---|
| 단일 당사자가 모든 쿼리를 봄 | 아니오 | 예 | 예 — 그 업스트림이 |
| DNSSEC를 로컬에서 검증 | 예 | 업스트림에서 받은 것을 신뢰 | 업스트림에서 받은 것을 신뢰 |
| 차단 목록과 기기별 규칙 | 로컬 존을 통해서만 | 데몬에 따라 다름 | 예, 웹 인터페이스 포함 |
| 클라이언트용 DoH / DoT 리스너 | DoT는 네이티브로, DoH는 프록시를 통해 | 데몬에 따라 다름 | 둘 다 내장 |
| 콜드 스타트 지연 | 3~4회 왕복 | 1회 왕복 | 1회 왕복 |
| 옳은 답 | 스택 중 프라이버시를 담당하는 절반 | 의도적인 대체 수단으로만 | 필터링을 담당하는 절반, 앞단에 |
오른쪽 두 열은 경쟁 관계가 아니라 — 같은 구성의 두 절반입니다. AdGuard Home이 53번 포트를 소유하고, 차단 목록을 적용하며, 암호화된 전송을 종단합니다. Unbound는 그 뒤 루프백에 앉아 실제 해석을 담당합니다. 어느 쪽도 상대의 일을 잘 해내지는 못하며, 이 체인 전체가 소비하는 RAM은 대략 100메가바이트 정도입니다.
이 페이지에서 딱 하나만 가져간다면 이것을 가져가십시오: 공개 DNS 제공업체로 포워딩하는 리졸버는 여러분의 DNS를 프라이빗하게 만든 것이 아닙니다. 로그를 한 홉 옮기고, 유지보수 목록에 서버 하나를 추가했을 뿐입니다. 재귀가 요점의 전부입니다.
먼저 서버부터 주문하십시오. 패널에서: Order → VPS → Sentinel, 이미지는 Debian 12, 이를 쓸 기기들과 가장 가까운 요새로 — Helsinki, Stockholm, Oslo 또는 Reykjavík 중에서. 계정을 열기 위해 이메일 주소는 필요 없으며 청구서는 Monero, Bitcoin, Lightning 또는 다른 지원되는 자산으로 결제됩니다. 이는 평소보다 여기서 더 중요합니다: 개인 리졸버의 가치 전부가 물어보는 쪽의 IP 주소가 어떤 이름으로도 추적되지 않는다는 사실에 달려 있기 때문입니다.
그런 다음 첫 시간 보안 강화 체크리스트를 실행하십시오 — SSH 키만 사용, 비밀번호 로그인 금지, 무인 업그레이드 — 아래의 모든 내용은 아직 침해되지 않은 서버를 전제로 하기 때문입니다.
인터넷 전체에 응답하는 재귀 리졸버는 오픈 리졸버라고 불리며, 포트가 열린 지 몇 시간 안에 인터넷 전역을 훑는 스캐너에게 발견됩니다. DNS는 UDP로 동작하고, UDP 발신지 주소는 위조하기 쉬우며, 60바이트짜리 쿼리가 그보다 수십 배 큰 응답을 만들어낼 수 있습니다 — 그래서 오픈 리졸버는 제3자를 향한 서비스 거부 공격을 위한 공짜 증폭기가 됩니다. 그 뒤에 이어지는 순서는 언제나 같습니다: 트래픽이 시작되고, 남용 신고가 들어오고, 그 IP는 널 라우팅됩니다. 첫 DNS 서버가 끝나는 가장 흔한 방식이 바로 이것입니다. 두 가지 규칙이면 이를 완전히 막을 수 있습니다: 리졸버 설정에서 기본적으로 거부할 것, 그리고 방화벽에서 0.0.0.0/0발 53/udp를 절대 허용하지 말 것.
그래서 아직 아무것도 대기하고 있지 않은 지금, 방화벽이 먼저입니다. 아래 규칙은 10.8.0.0/24 대역의 WireGuard 터널을 전제로 합니다 — 아직 만들지 않았다면, 이 페이지 하단에 링크된 WireGuard 가이드가 15분짜리 우회로가 되어 줄 것이며, 이 설계 전체가 가장 편안하게 작동하는 전송 방식이기도 합니다.
ufw default deny incoming
ufw allow 22/tcp # or your moved SSH port
ufw allow 51820/udp # WireGuard
ufw allow in on wg0 to any port 53 proto udp
ufw allow in on wg0 to any port 53 proto tcp
ufw enable
# DNS is NOT opened to the world. Confirm it:
ufw status numbered | grep 53
무엇이 일부러 빠져 있는지 눈여겨보십시오: 공인 인터페이스에서 53번을 여는 규칙은 없습니다. 53번 포트는 오직 wg0과 루프백에만 존재합니다. 나중에 DNS-over-TLS나 DNS-over-HTTPS를 추가하더라도, 이들은 TCP 853과 TCP 443이며, 인증서로 인증되고, 5단계에서 자신만의 규칙을 따로 받습니다 — 평문 UDP 포트는 그와 무관하게 계속 닫혀 있습니다.
이제 포트를 비우십시오. Ubuntu에서는 — 그리고 누군가 활성화해 둔 어떤 Debian에서든 — systemd-resolved가 이미 127.0.0.53:53에서 대기 중이며, Unbound는 사람들이 20분 동안 헤매며 잘못 해석하게 되는 바인드 오류와 함께 시작을 거부합니다. 먼저 확인한 다음, systemd-resolved는 로컬 클라이언트 측 인터페이스로 남겨둔 채 스텁 리스너만 비활성화하십시오:
ss -lunp 'sport = :53' # who owns UDP/53 right now?
mkdir -p /etc/systemd/resolved.conf.d
cat > /etc/systemd/resolved.conf.d/no-stub.conf <<'EOF'
[Resolve]
DNSStubListener=no
EOF
systemctl restart systemd-resolved
ss -lunp 'sport = :53' # should now be empty
깨끗한 Debian 12에서는 첫 번째 명령이 아무것도 출력하지 않으며 딱히 할 일도 없습니다. 그래도 실행해 두십시오 — 1초면 끝나며, 그렇지 않으면 여러분이 돌아가는지도 몰랐던 서비스를 상대로 "address already in use" 오류를 진단해야 하는 상황을 맞게 됩니다.
Unbound는 NLnet Labs가 만든, 검증하고 재귀하며 캐시하는 리졸버입니다. 어디에나 패키지로 존재하며, 이미 인터넷의 상당 부분이 쓰고 있는 소프트웨어이고, 기본 상태에서 재귀 방식으로 동작합니다 — 이를 포워더로 바꾸려면 오히려 일부러 손을 대야 합니다. 어디서도 목록을 따로 받아오지 않고도 루트 서버의 위치를 알 수 있도록 루트 힌트 패키지와 함께 설치하십시오:
apt update && apt install -y unbound dns-root-data
unbound -V | head -2
dns-root-data 패키지는 루트 힌트를 /usr/share/dns/root.hints에, DNSSEC 루트 신뢰 앵커를 /usr/share/dns/root.key에 설치하고, 일반적인 패키지 채널을 통해 둘 다 계속 최신 상태로 유지합니다. 지루하지만 이것이 이들을 얻는 올바른 방법입니다. cron 작업으로 URL에서 root.hints를 내려받는 방식은 결국 조용히 실패하는 방법입니다.
/etc/unbound/unbound.conf.d/nb-resolver.conf
server:
# ---- Who may ask. Deny first, allow narrowly.
interface: 127.0.0.1@5335
interface: 10.8.0.1
access-control: 0.0.0.0/0 refuse
access-control: ::0/0 refuse
access-control: 127.0.0.0/8 allow
access-control: 10.8.0.0/24 allow
# ---- Privacy of the recursion itself.
qname-minimisation: yes
qname-minimisation-strict: no
hide-identity: yes
hide-version: yes
rrset-roundrobin: yes
# ---- DNSSEC. The anchor is maintained by the dns-root-data package.
auto-trust-anchor-file: "/var/lib/unbound/root.key"
root-hints: "/usr/share/dns/root.hints"
harden-dnssec-stripped: yes
harden-glue: yes
harden-below-nxdomain: yes
harden-large-queries: yes
harden-short-bufsize: yes
aggressive-nsec: yes
val-clean-additional: yes
# ---- Do not be a reflector, even by accident.
refuse-any: yes
ratelimit: 1000
ip-ratelimit: 200
edns-buffer-size: 1232
# ---- Cache. This is where the 4 GB actually earns its keep.
msg-cache-size: 128m
rrset-cache-size: 256m
cache-min-ttl: 60
cache-max-ttl: 86400
prefetch: yes
prefetch-key: yes
serve-expired: yes
serve-expired-ttl: 3600
# ---- Never chase a name that has no business being on the internet.
private-address: 10.0.0.0/8
private-address: 172.16.0.0/12
private-address: 192.168.0.0/16
private-address: 169.254.0.0/16
private-address: fd00::/8
private-address: fe80::/10
num-threads: 2
so-reuseport: yes
verbosity: 0
logfile: ""
remote-control:
control-enable: yes
control-interface: /run/unbound.ctl
그 줄들 중 네 개가 진짜 일을 하고 있으며, 각각 한 문장씩 설명할 가치가 있습니다.
두 개의 리스너를 눈여겨보십시오. 5335번 포트의 루프백은 다음 단계에서 AdGuard Home이 쓸 것이고, 10.8.0.1은 터널 주소로, 필터링 계층을 건너뛰기로 한다면 VPN상의 클라이언트가 Unbound에 직접 쿼리할 수 있게 해줍니다. 아직 WireGuard를 운영하고 있지 않다면 지금은 두 번째 인터페이스 줄을 빼두십시오 — Unbound는 서버에 존재하지 않는 주소로는 시작되지 않습니다.
시작한 뒤 제대로 동작하는지 증명하십시오:
unbound-checkconf
systemctl restart unbound && systemctl enable unbound
apt install -y dnsutils
dig @127.0.0.1 -p 5335 nordbastion.com +short
# DNSSEC: the first must come back with the "ad" flag set,
# the second must FAIL — its signatures are deliberately broken.
dig @127.0.0.1 -p 5335 dnssec-tools.org +dnssec | grep -E 'flags:|status:'
dig @127.0.0.1 -p 5335 dnssec-failed.org | grep 'status:'
첫 번째 답의 ad 플래그는 Unbound가 루트부터 레코드까지 서명 체인을 확인했고 그것이 유효했다는 뜻입니다. 두 번째 답의 SERVFAIL은 검증이 위변조된 답을 그대로 넘기지 않고 거부했다는 뜻입니다. 두 번째 쿼리가 주소를 반환한다면 검증이 켜져 있지 않은 것이므로 가장 먼저 신뢰 앵커를 확인해야 합니다.
엄밀히 말하면 이 단계는 선택 사항입니다 — Unbound 단독으로도 이미 프라이빗한 리졸버이기 때문입니다 — 그럼에도 거의 모두가 이를 원합니다. AdGuard Home은 차단 목록, 클라이언트별 정책, 디버깅 중에 읽기 편한 쿼리 로그를 제공하며, 가장 유용하게는 네이티브 DNS-over-TLS와 DNS-over-HTTPS 리스너를 제공해 VPN이 여의치 않은 네트워크에서도 휴대폰과 브라우저가 여러분의 리졸버와 통신할 수 있게 해줍니다.
이 구성은 하나의 체인이며, 핵심 요령은 포트를 제대로 맞추는 것입니다: AdGuard Home이 53번을 소유하고 클라이언트를 마주하며, Unbound는 127.0.0.1:5335에 앉아 인터넷을 마주합니다. 서버 안의 그 무엇도 53번에서 대기하지 않습니다.
curl -fsSL https://raw.githubusercontent.com/AdguardTeam/AdGuardHome/master/scripts/install.sh | sh -s -- -v
# Web interface: http://<vps>:3000 — reach it over the SSH tunnel below,
# never by opening 3000 to the internet.
ssh -N -L 3000:127.0.0.1:3000 root@<vps>
그 터널을 통해 최초 실행 마법사를 진행하십시오. 관리자 리스너는 127.0.0.1이나 터널 주소로 설정하고 절대 0.0.0.0으로 두지 마십시오. 그리고 긴 비밀번호를 설정하십시오 — 이 인터페이스는 여러분의 네트워크가 해석하는 모든 이름을 바꿔 쓸 수 있어, 리졸버 자체만큼이나 민감합니다.
그런 다음 업스트림을 정확히 하나만 설정하십시오: Settings → DNS settings에서 기본 목록을 지우고 여러분의 Unbound 인스턴스를 입력하십시오. 한 줄, 그게 전부입니다. 그 칸에 공개 리졸버가 남아 있다면 1단계에서 한 모든 일이 도로 무효가 됩니다.
127.0.0.1:5335
"Parallel requests"는 꺼 두십시오 — 업스트림이 하나뿐이면 트래픽만 중복시킬 뿐 아무 효과가 없습니다 — 그리고 실제로 내부 존을 운영하지 않는 한 "Use private reverse DNS resolvers"도 꺼 두십시오. 부트스트랩 서버는 신뢰할 수 있는 곳으로 설정하십시오. 이들은 오직 업스트림 서버의 호스트 이름을 해석하는 데만 쓰이며, 업스트림을 평범한 IP로 설정했다면 애초에 전혀 참조되지 않습니다.
차단 목록: 좁게 시작하십시오. 목록 페이지의 모든 것을 켜고 카운터가 올라가는 걸 즐기고 싶은 게 본능입니다. 그 충동을 참으십시오. 모든 목록은 여러분의 기기가 어디에 접근할 수 있는지에 대해 남이 내린 일련의 판단이며, 그 실패는 조용하고 헷갈립니다 — 페이지가 반쯤만 로드되거나, 버튼이 아무 반응이 없거나, 은행 앱이 열리기를 거부하는 식입니다. 기본 AdGuard DNS 필터로, 또는 OISD처럼 잘 관리되는 단일 통합 목록으로 시작해서, 2주 정도 그대로 지내본 뒤에야 더 추가하십시오. 허용 목록을 유지하며 죄책감 없이 쓰십시오.
여러분은 방금 다른 누군가가 여러분 기기가 해석하는 모든 이름의 목록을 갖지 못하게 막기 위한 목적의 머신을 만들었습니다 — 그런데 AdGuard Home이 가장 먼저 하는 일은 바로 그 목록을, 기본값으로, 90일 동안 보관하는 것입니다. 차단 목록을 조정하는 동안에는 정말로 유용하지만, 서버에서 가장 민감한 파일이기도 합니다. 신중하게 결정하십시오: "그 기기가 방금 무엇을 요청했는가"에 답하기에는 24시간이면 충분하고, 조정이 끝난 뒤라면 0이 정직한 설정이며, 90일은 기본값을 그대로 둔 채 아무도 내려서는 안 될 결정입니다. Settings → General → Query log에서, 그 김에 통계 보존 기간도 설정하십시오.
방화벽을 새 구성에 맞추십시오 — 이제 AdGuard Home이 터널 인터페이스에서 53번 포트를 소유하고, Unbound는 루프백에서만 접근할 수 있습니다. 공인 인터페이스에 관해서는 아무것도 바뀌지 않습니다: 여전히 DNS는 전혀 열려 있지 않습니다.
아무도 닿을 수 없는 리졸버는 쓸모가 없고, 누구나 닿을 수 있는 리졸버는 2단계에서 다룬 실패 상태입니다. 좋은 답은 정확히 두 가지이며, 대부분의 사람은 결국 둘 다 씁니다 — 집과 노트북에서는 터널을, 휴대폰과 UDP가 막힌 네트워크에서는 암호화된 DNS를.
옵션 A — WireGuard를 통해. 둘 중 더 나은 쪽이며, 이 가이드가 계속 WireGuard 가이드를 가리키는 이유이기도 합니다. 53번 포트는 인터넷에 계속 보이지 않고, 쿼리 자체가 어떤 형태로도 신뢰할 수 없는 네트워크를 건너는 일이 없으며, 갱신할 인증서도 없습니다. VPS가 이미 여러분의 VPN 출구라면, 각 피어의 설정에 한 줄만 추가하면 됩니다:
# On the client, in the [Interface] section of the peer config:
DNS = 10.8.0.1
사람들을 무는 미묘한 함정 하나: Linux에서 wg-quick은 resolvconf나 systemd-resolved를 통해 그 주소를 설정하는데, 둘 다 설치되어 있지 않으면 터널은 멀쩡히 올라오는데도 조용히 아무 일도 하지 않습니다. 터널이 올라온 뒤 resolvectl status로 확인하거나 /etc/resolv.conf를 직접 읽어 보십시오 — 터널은 멀쩡히 동작하는데 예전 리졸버가 여전히 설정되어 있는 상태야말로 이 작업 전체가 막으려던 바로 그 누출입니다.
옵션 B — DNS-over-TLS와 DNS-over-HTTPS. 기기가 항상 터널에 있을 수 없을 때 필요합니다. 둘 다 인증서로 인증되며, 이는 곧 호스트 이름이 필요하다는 뜻입니다: A 레코드를 VPS로 향하게 한 다음, AdGuard Home이 직접 인증서를 들고 있게 하거나 이미 TLS를 종단해 주는 리버스 프록시 뒤에 두십시오. 리스너는 DoT용 853/tcp와 DoH용 443/tcp입니다.
ufw allow 853/tcp # DNS-over-TLS
ufw allow 443/tcp # DNS-over-HTTPS
# 53/udp is still NOT open on the public interface. It never will be.
ufw status
DoH 엔드포인트에는 추측할 수 없는 경로를 부여하십시오 — AdGuard Home에서는 이를 /dns-query/<random> 아래에서 제공할 수 있으며, 사람마다 다른 경로를 쓰면 다른 모두의 것은 그대로 둔 채 한 사람씩 접근을 취소할 수 있습니다. 엄밀한 의미의 인증은 아니지만, 공개 리스너가 몇 단계만 더 거친 오픈 리졸버가 되는 것은 막아줍니다.
| 클라이언트 | 설정 위치 | 사용하는 전송 방식 |
|---|---|---|
| Android 9 이상 | 설정 → 네트워크 → 비공개 DNS → 호스트 이름 | DNS-over-TLS만 |
| iOS와 macOS | 서명된 .mobileconfig DNS 프로필 | DoH 또는 DoT, 시스템 전체 |
| Windows 11 | 설정 → 네트워크 → DNS 서버 할당 | DoH, 어댑터별 |
| Firefox | 설정 → 개인정보 보호 → DNS over HTTPS → 사용자 지정 | DoH, 브라우저 한정 |
| 라우터 (네트워크 전체) | WAN DNS 또는 DHCP 옵션 6 | 평문 DNS — 그러니 터널로 |
곰곰이 생각해 볼 것은 라우터 행입니다. DHCP로 리졸버를 나눠주면 설정 화면조차 없는 기기를 포함해 집 안의 모든 기기를 한 번에 커버할 수 있습니다 — 하지만 그러면 라우터에서 VPS까지의 구간은 열린 인터넷을 가로지르는 평문 DNS가 되는데, 이는 애초에 여러분이 막으려던 바로 그것입니다. 라우터 자체에서 터널을 돌리거나, 마지막 구간이 암호화되지 않는다는 점을 받아들이고 재귀만으로도 얻는 이득이 있다고 여기십시오.
알아둘 만한 마지막 설정 하나: DNS-over-HTTPS가 켜진 브라우저는 터널 여부와 상관없이 자신만의 리졸버를 쓰고 시스템 설정을 조용히 무시합니다. Firefox와 Chrome 모두 일부 지역에서는 이를 기본으로 켜서 배포합니다. 브라우저도 여러분의 엔드포인트를 가리키도록 설정하거나, 운영체제를 따르도록 DoH를 꺼두십시오.
1. 인터넷에 열려 있는가? 터널에 있지 않은 머신에서 실행하십시오 — 모바일 데이터를 쓰는 휴대폰, 다른 VPS, 무엇이든 좋습니다. 타임아웃이 올바르고 바람직한 답입니다. 실제 응답이 온다면 인터넷의 모든 스캐너도 이를 찾아낼 것이라는 뜻이므로, 즉시 2단계로 돌아가야 합니다.
dig @<public-ip-of-vps> +timeout=3 example.com
# Expected: ";; connection timed out; no servers could be reached"
2. 기기가 정말로 이를 쓰고 있는가? 이것이 가장 자주 실패하는 점검이며, 그 실패는 눈에 보이지 않습니다: 터널은 올라와 있고, 설정도 맞아 보이는데, 운영체제는 여전히 카페가 DHCP로 건네준 리졸버에게 묻고 있습니다. 리졸버 자신에게 여러분을 누구라고 생각하는지 물어본 다음, 반대편에서 확인하십시오.
# On the client — which resolver is the system actually using?
resolvectl status | grep -A2 'Current DNS' # Linux
scutil --dns | grep nameserver # macOS
# On the server — does the query actually arrive?
tail -f /var/log/syslog | grep -i unbound &
unbound-control stats_noreset | grep total.num.queries
그런 다음 그 기기에서 공개된 DNS 누출 테스트 페이지 중 하나를 열어 결과를 읽으십시오. VPS 제공업체의 이름이 나오면 경로가 맞는 것입니다. ISP나 대형 공개 리졸버의 이름이 나온다면 터널 앞단의 무언가가 여전히 대신 응답하고 있는 것입니다.
3. 검증이 실제로 켜져 있는가? 3단계에서 썼던 두 dig 명령을 이번에는 Unbound에 직접 대신 클라이언트, AdGuard Home, Unbound로 이어지는 전체 체인을 통해 반복하십시오. 서명이 깨진 이름은 여기서도 반드시 실패해야 합니다. AdGuard Home 설정 어딘가에 두 번째 업스트림이 남아 있다면 바로 여기서 드러납니다.
4. 캐시가 제 역할을 하고 있는가? 일반적으로 하루 정도 쓰고 나면 히트율은 70~90% 사이 어딘가에 있어야 합니다. 이보다 훨씬 낮다면 대개 캐시가 너무 작거나, 업스트림의 모든 것이 TTL이 매우 짧아서 cache-min-ttl이 무시되고 있다는 뜻입니다. 트래픽이 많은 네트워크에서 훨씬 높다면 prefetch가 잘 작동하고 있다는 반가운 신호입니다.
unbound-control stats_noreset | grep -E 'total.num.(queries|cachehits)'
# hit rate = cachehits / queries
그다음은 두 가지 운영상의 결정입니다. 첫째: 이 서버가 재부팅되면 무슨 일이 일어나는가. 이를 가리키는 모든 기기가 이름 해석을 잃고, 가정의 모두는 이를 인터넷이 고장 났다고 이야기할 것입니다. 서비스가 실패 시 재시작되고 부팅 시 시작되도록 설정한 다음, 일부러 한 번 VPS를 재부팅해 다시 돌아오는 것을 지켜보십시오. 둘째: 대체 수단입니다. 클라이언트에 공개 리졸버를 보조로 등록해 두고 장애 중에는 그 쿼리들이 여러분의 통제를 벗어난다는 점을 받아들이거나, 다른 요새의 두 번째 VPS에서 두 번째 인스턴스를 돌리십시오. 둘 다 정당한 선택입니다. 일요일 밤 11시에야 이 질문을 처음 마주하는 것은 정당하지 않습니다.
systemctl enable unbound AdGuardHome
systemctl show unbound -p Restart -p RestartUSec
reboot # then, from a client: dig nordbastion.com +short
프라이빗 리졸버는 실질적인 개선이지, 망토가 아닙니다. 이를 망토처럼 파는 사람이 있다면 무언가를 팔고 있는 것입니다. 위의 모든 것을 마친 뒤에도 여전히 드러나는 것들의 목록은 다음과 같습니다. 남아 있는 노출의 형태를 아는 것이야말로 진짜 방어와 마음의 위안용 담요를 가르는 차이이기 때문입니다.
연결은 여전히 일어납니다. 조회 1밀리초 뒤, 여러분의 기기는 방금 알아낸 주소로 TCP 연결을 엽니다. 여러분의 회선을 지켜보는 누구든 그 주소를 보게 됩니다. 자신만의 IP를 쓰는 사이트라면 그 주소가 곧 그 사이트입니다. 암호화된 DNS는 질문을 없애 줄 뿐, 답까지 없애 주지는 않습니다.
TLS 핸드셰이크는 대개 그 사이트의 이름을 밝힙니다. Server Name Indication은 거의 모든 HTTPS 연결이 시작될 때 평문으로 전송되므로, 수동적 관찰자는 어차피 호스트 이름을 읽어낼 수 있습니다. Encrypted Client Hello가 이를 해결하지만 배포 상황은 고르지 않습니다 — 브라우저와 사이트 양쪽 모두 이를 지원하는 곳에서는 이름이 숨겨지고, 그렇지 않은 곳에서는 숨겨지지 않습니다. 켜져 있다고 지레짐작하지 마십시오.
이제 리졸버 운영자는 여러분이며, 여러분은 단 한 사람입니다. 여러분의 리졸버가 대화하는 모든 권위 서버는 자신의 존에 대해 묻는 단일 IP 주소를 보게 됩니다. 여러 존에 걸쳐, 그 IP는 뚜렷한 패턴을 가지게 되고, 그 패턴은 곧 한 가정입니다. 이것이 첫 장에서 다룬 익명 집합의 대가이며, 이를 무디게 하는 유일한 방법은 그 IP가 어떤 이름으로도 추적되지 않는 것 — 즉 KYC 없이 암호화폐로 결제한 VPS — 이며, 이상적으로는 여러분의 트래픽이 이미 나가고 있는 것과 같은 IP인 것입니다.
제공업체는 언제나처럼 패킷을 볼 수 있습니다. VPS는 누군가의 데이터센터 안, 누군가의 하드웨어 위에서 돌아갑니다. NordBastion은 고객 트래픽을 들여다보지 않으며 투명성 보고서와 워런트 카나리가 요청받았을 때 무슨 일이 일어날지를 설명해 주지만 — 그럼에도 정직한 구조적 사실은 여러분이 임대한 머신은 다른 누군가가 물리적으로 접근할 수 있는 머신이라는 것입니다. 직접 호스팅이 바꾸는 것은 제품 차원의 쿼리 로그도, 분석 파이프라인도, 개정될 수 있는 프라이버시 정책도 없다는 점입니다. 오직 여러분이 설정하고, 여러분이 일부러 고른 관할권에서, RAM에 캐시를 쥐고 있는 프로세스 하나가 있을 뿐입니다.
여러분이 실제로 산 것은, 정확히 말하면: 여러분에 대한 행동 데이터의 가장 풍부하고 가장 값싼 원천 하나가, 그것을 수집하는 것이 비즈니스 모델인 당사자에 의해 더 이상 수집되지 않는다는 것입니다. 좁은 주장이지만, 진짜입니다. 위협 모델이 Tor를 요구하는 상황에서는 이 페이지의 그 무엇도 Tor를 대신하지 못합니다 — 그리고 그럴 때는 아래의 어니언 서비스 가이드가 정직한 다음 읽을거리입니다.
| 티어 | 월별 | 리소스 | 여유 있게 돌아가는 것 |
|---|---|---|---|
| Sentinel | $3.90 | 2 vCPU · 4 GB · 120 GB | 가정용 리졸버 + WireGuard. 옳은 답. |
| Garrison | $7.90 | 4 vCPU · 8 GB · 240 GB | 같은 구성에 Vaultwarden, SearXNG, 백업 대상까지 추가 |
| Ravelin | $16.90 | 8 vCPU · 16 GB · 480 GB | 소규모 팀, 25개의 터널 피어, 그 밖의 서비스들 |
| 두 번째 Sentinel | $3.90 | 다른 요새에 | 대체 리졸버, 장애가 곧 인터넷 장애가 되지 않도록 |
이 표에서 DNS를 기준으로 고른 항목은 하나도 없습니다. 기기 30대를 위한 리졸버는 캐시로 수백 메가바이트, 코어 하나의 일부만 쓰며, 한 달에 트래픽 수백 메가바이트 정도만 움직입니다. 티어는 WireGuard 피어, 그 밖의 서비스, 디스크를 기준으로 고르십시오 — 리졸버는 공짜로 얹혀 갑니다.
방화벽 규칙 하나가 지나치게 많이 열려 있거나, access-control 줄이 allow로 남아 있는 경우입니다. 스캐너가 몇 시간 안에 포트를 찾아내고, 증폭 트래픽이 시작되고, 남용 신고가 도착하고, IP가 먹통이 됩니다. 기본적으로 거부하고, 터널만 허용하고, 네트워크 밖에서 테스트하십시오.
AdGuard Home을 설치하고, 업스트림은 기본 목록에 그대로 두고, 모든 게 아름답게 돌아갑니다 — 그런데 쿼리 로그는 설정 칸에 이름이 적힌 그 회사에 여전히 쌓이고 있습니다. 업스트림을 하나만 설정하고, 그것을 여러분의 Unbound로 만드십시오.
resolvconf가 설치되어 있지 않아 wg-quick이 DNS 설정을 밀어 넣지 못했거나, 브라우저가 자체적으로 DNS-over-HTTPS를 쓰고 있는 경우입니다. 모든 게 맞아 보이지만 모든 조회는 여전히 여러분이 앉아 있는 그 네트워크로 갑니다. 클라이언트의 설정 화면이 아니라 리졸버 쪽에서 확인하십시오.
그 무엇도 스스로를 DNS 문제라고 밝히지 않습니다 — 페이지가 반쯤만 로드되거나, 버튼이 아무 반응이 없습니다. 첫날부터 공격적인 목록 여섯 개를 켜두면 원인을 추적할 수 없게 됩니다. 하나로 시작해서 천천히 추가하고, 허용 목록을 유지하고, 그 질문에 답할 수 있을 만큼 쿼리 로그를 남겨두십시오.
이 전체 구성은 누군가가 이 목록을 갖지 못하게 막기 위해 존재하는데, 필터링 계층은 기본값 그대로 이를 디스크에 석 달이나 보관합니다. 보존 기간을 의도적으로 설정하십시오 — 조정 중에는 24시간, 끝난 뒤에는 0으로 — 그리고 이것이 여러분뿐 아니라 네트워크의 모두를 대상으로 한다는 점을 기억하십시오.
다른 사람들이 의존하는 순간, 리졸버는 곧 인프라가 됩니다. 두 서비스 모두 부팅 시 활성화하고, Restart=on-failure를 설정하고, 이를 증명하기 위해 일부러 한 번 재부팅하고, 대체 수단은 필요해진 도중이 아니라 필요해지기 전에 정해두십시오.
이를 구축하는 동안 떠오르는 열한 가지 질문 — 애초에 만들 가치가 있는지를 가르는 두 가지도 포함해서.
다르며, 가장 중요한 지점에서는 더 낫습니다 — 다만 정직한 답에는 두 측면이 있습니다. 얻는 것: 재귀 리졸버를 쓰면 여러분의 전체 쿼리 스트림을 한 당사자가 전부 보는 일이 없습니다. 루트 서버는 누군가 .com에 대해 물었다는 것만 알고, .com 서버는 누군가 example.com에 대해 물었다는 것만 알며, example.com을 운영하는 곳만이 전체 이름을 알게 됩니다 — 그리고 그중 어느 쪽도 여러분이 다음에 조회할 수천 개의 이름은 보지 못합니다. 반면 공개 리졸버는 모든 조회를 순서대로, 타임스탬프와 함께, 영구히 보게 되며, 그 목록과 타인 사이를 가로막는 것은 오직 그 회사의 프라이버시 정책뿐입니다. 잃는 것: 개인 리졸버의 익명 집합은 1입니다. 대형 공개 리졸버를 떠나는 쿼리는 수백만 명의 쿼리와 뒤섞이지만, 여러분의 리졸버를 떠나는 쿼리는 명백히 여러분의 것입니다. 이 거래가 할 만한 가치가 있으려면 리졸버의 IP가 여러분의 신원과 연결되어 있지 않아야 합니다 — 이는 KYC 없이 암호화폐로 결제하는 VPS가 정확히 제공하는 것이며, 카드 정보가 등록된 하이퍼스케일러는 결코 줄 수 없는 것입니다. 리졸버를 이미 VPN이 나가는 것과 같은 VPS 뒤에 두면 익명 집합은 전혀 줄어들지 않습니다. 그 IP는 이미 여러분의 브라우징을 하고 있었기 때문입니다.
이름을 처음 조회할 때는 약간 느리고, 반복 조회할 때마다 눈에 띄게 빨라지며, 전체적으로는 대체로 비슷합니다. 콜드 스타트 상태의 재귀 리졸버는 위임 체인을 따라가야 합니다 — 루트, TLD, 권위 서버 순으로 — 이는 이미 다른 누군가의 쿼리로 답을 캐시해 둔 공개 리졸버의 왕복 1회 대신 3~4회의 왕복을 뜻합니다. 캐시가 데워지면 — 가정에서는 보통 하루 정도 걸립니다 — 자주 쓰는 이름들은 1밀리초도 안 되는 시간에 RAM에서 응답되며, 이때부터는 여러분이 앞섭니다. prefetch를 켜두면 인기 레코드가 만료되기 전에 미리 갱신되어 콜드 스타트 상황이 대부분 사라집니다. 실제로 성능을 잃을 수 있는 유일한 지점은 CDN 지오로케이션입니다: 대형 공개 리졸버는 여러분 네트워크 위치를 축약한 정보를 권위 서버에 전달해서(EDNS Client Subnet) CDN이 가까운 엣지를 골라주게 합니다. Unbound는 설계상 이 정보를 보내지 않습니다. 리졸버가 여러분과 같은 지역에 있다면 이는 측정 가능한 차이를 만들지 않습니다. 리졸버가 Reykjavík에 있고 여러분이 싱가포르에 있다면, 일부 CDN은 유럽 엣지를 배정할 것이고 그 차이를 체감하게 될 것입니다.
암호화된 전송을 쓸 때만 필요합니다. WireGuard 터널 위의 평문 DNS는 도메인도, 인증서도, 어떤 공개 노출도 필요 없습니다 — 리졸버는 10.8.0.1 같은 사설 주소에서 대기하며 터널상의 피어에게만 응답합니다. 이 구성이 이 가이드에서 가장 단순하면서도 가장 프라이빗합니다. DNS-over-TLS나 DNS-over-HTTPS를 쓰고 싶은 순간부터는 도메인이 필요합니다. 둘 다 인증서로 인증되고, 인증서는 이름 앞으로 발급되기 때문입니다. 이는 기기가 항상 VPN에 있을 수 없을 때 — 회사 노트북, UDP를 막는 네트워크의 휴대폰, 터널을 유지하지 않을 가족 구성원 — 선택할 구성입니다. 도메인을 등록한다면, 다른 곳에서 신경 썼던 것과 같은 신원 확인을 요구하지 않는 곳에서 등록하고 WHOIS 프라이버시를 켜 두십시오.
둘은 서로 다른 문제를 해결하며, 이 조합은 중복이 아닙니다. Unbound는 리졸버입니다: 루트부터 DNS를 따라가고, DNSSEC 서명을 검증하고, 결과를 캐시합니다. AdGuard Home은 리졸버가 전혀 아닙니다 — 웹 인터페이스와 암호화된 리스너를 갖춘 필터링 프런트엔드로, 차단하지 않은 모든 요청을 업스트림으로 전달합니다. AdGuard Home만 단독으로 쓰면 그 업스트림은 공개 리졸버가 되어, 여러분의 전체 쿼리 스트림이 결국 다시 남의 로그에 남게 됩니다. Unbound만 단독으로 쓰면 차단 목록도, 기기별 규칙도, 인터페이스도 없는 진짜 프라이빗한 리졸버를 얻게 됩니다. 둘을 연결하면 — AdGuard가 53번 포트를, Unbound가 127.0.0.1:5335를 유일한 업스트림으로 — 루트부터 응답하는 리졸버 앞에 필터링과 암호화된 전송을 두게 됩니다. 가능한 한 작은 공격 표면을 원하고 광고 차단에는 관심이 없다면, Unbound 단독도 완전히 훌륭한 답이며, 실제로 프라이버시를 만들어내는 절반은 바로 이쪽입니다.
오픈 리졸버란 인터넷상의 어떤 발신지 주소에서 온 쿼리에도 응답하는 재귀 리졸버입니다. 이것이 큰 문제인 이유는 DNS가 UDP로 동작하고, UDP 발신지 주소는 손쉽게 위조할 수 있으며, 작은 쿼리가 큰 응답을 만들어낼 수 있기 때문입니다. 공격자는 피해자의 주소를 발신지로 위조한 60바이트짜리 쿼리를 여러분의 서버로 보내고, 서버는 성실하게 그보다 수십 배 큰 응답을 피해자에게 보냅니다. 이를 수천 개의 오픈 리졸버로 곱하면 반사·증폭 DDoS가 되며, 여러분의 서버는 그 총 중 하나가 됩니다. 실제로는 순서가 빠르고 예측 가능합니다: 인터넷 전역을 훑는 스캐너가 몇 시간 안에 새로 열린 53번 포트를 찾아내고, 트래픽이 시작되고, 남용 신고가 들어오고, 제공업체는 자사 네트워크를 지키기 위해 그 IP를 널 라우팅 처리합니다. 이는 가정이 아니며 드문 일도 아닙니다 — 첫 DNS 서버가 잘못되는 가장 흔한 방식이 바로 이것입니다. 해결책은 방화벽 규칙 하나와 설정 한 줄이면 충분합니다: 기본적으로 거부하고, 여러분의 터널만 허용하십시오.
조회는 숨기지만 방문 자체는 숨기지 못합니다. DNS-over-TLS와 DNS-over-HTTPS는 ISP가 더 이상 example.com이라고 적힌 평문 질문을 보지 못한다는 뜻입니다. 그래도 여전히 보이는 것은 1밀리초 뒤에 여러분이 맺는 연결입니다: 목적지 IP 주소, 그리고 — 양쪽 모두 Encrypted Client Hello를 지원하지 않는 한 — TLS 핸드셰이크 속의 서버 이름이 평문으로 보입니다. 전용 IP를 쓰는 사이트라면 그 주소만으로도 사이트가 특정되고, 대형 CDN 뒤에 있는 사이트라면 주소는 공유되지만 SNI가 정체를 드러냅니다. 그래서 암호화된 DNS는 수동적 로깅의 비용을 높이고 가장 쉽고 값싼 감시 표면을 없애주지만, 여러분의 브라우징을 보이지 않게 만들지는 못합니다. 위협 모델이 ISP나 모든 것을 들여다보는 적대적 네트워크라면, 그에 맞는 도구는 터널입니다 — 운영체제가 터널 밖에서 계속 ISP 리졸버를 쓸 때 VPN만으로는 남을 수 있는 누출을 암호화된 DNS가 막아줍니다.
사람들이 예상하는 것보다 훨씬 작아도 됩니다. DNS 응답은 수백 바이트에 불과하고 쿼리당 작업은 해시 조회 정도이므로, 가정이나 소규모 팀을 위한 리졸버는 거의 항상 유휴 상태입니다. Sentinel — 2 vCPU, 4 GB, 월 $3.90 — 이면 로드 애버리지가 0을 벗어나지도 않은 채로 수십 대의 기기를 감당하며, 그 4 GB 대부분은 캐시에 쓸 수 있는데, 캐시야말로 실제로 체감 성능을 좌우하는 유일한 자원입니다. Unbound에 메시지 캐시와 RRset 캐시로 수백 메가바이트를 내어주면 히트율은 80~90% 범위에 자리 잡을 것입니다. 사양을 올려야 하는 이유는 DNS 때문인 적이 없습니다: 같은 서버가 동시에 WireGuard 터널을 종단하거나, Vaultwarden을 돌리거나, 백업 저장소를 담고 있기 때문입니다. 대역폭은 문제가 되지 않습니다 — 바쁜 가정용 리졸버도 한 달에 수백 메가바이트 정도만 움직입니다.
그것을 쓰도록 설정된 모든 기기가 이름 해석을 멈추고, 그걸 쓰는 사람들은 이를 "인터넷이 끊겼다"고 표현할 것입니다. 이것이 DNS를 직접 호스팅할 때 치러야 하는 실제 운영 비용이며, 우연히 발견할 일이 아니라 미리 결정해 둘 일입니다. 노력이 커지는 순서로 세 가지 방어책이 있습니다. 클라이언트에 보조 리졸버를 설정하십시오 — Quad9나 dns0.eu 같은 공개 리졸버를 — 그리고 장애 중에는 그 쿼리들이 여러분의 통제를 벗어난다는 점을 받아들이십시오. 대부분의 사람에게는 이 방법이 맞습니다. 아니면 다른 요새의 두 번째 VPS에서 두 번째 인스턴스를 돌리고 두 개를 모두 등록해서, $3.90짜리 서버 하나를 더 두는 값으로 모든 것을 자체적으로 유지하십시오. 아니면 터널 위에서 각 클라이언트에 작은 로컬 캐시를 두어 짧은 장애가 눈에 띄지 않게 하십시오. 무엇을 고르든 해당 유닛에 Restart=on-failure를 설정하고, 부팅 시 활성화하고, 일부러 한 번 재부팅을 시험해 보십시오 — 스스로 돌아오지 않는 리졸버는 반드시 최악의 순간을 골라 그 사실을 증명할 것입니다.
가끔은 그렇습니다. 그리고 그것을 어떻게 다루느냐가 오래가는 구성과 2주 만에 뜯어내 버리는 구성의 차이를 만듭니다. 차단 목록은 사람이 내린 판단으로 관리되며, 이따금 그 판단이 여러분에게 필요한 것을 걸러내 버립니다: 은행의 사기 탐지 엔드포인트, 배송 추적 위젯, 분석 도메인을 거쳐 리다이렉트되는 로그인 흐름 같은 것들입니다. 이런 장애는 DNS 문제처럼 보이지 않기 때문에 헷갈립니다 — 페이지가 반쯤만 로드되거나 버튼이 아무 반응을 하지 않습니다. 세 가지 습관이 이를 해결합니다. 공격적인 목록 여섯 개보다는 보수적인 목록 하나로 시작하십시오. 허용 목록을 유지하며 죄책감 없이 추가하십시오. 그리고 "이 기기가 방금 무엇을 요청했고, 우리는 무엇을 거부했는가"에 답할 수 있을 만큼 쿼리 로그를 충분히 켜 두십시오 — 그 순간 여러분은 필터링 리졸버 자체가 모든 것을 기록하는 기기이며, 그 보존 기간 설정이 네트워크의 모두를 위해 여러분이 내리는 프라이버시 결정임을 깨닫게 됩니다.
됩니다. 그리고 이것이야말로 이걸 구축할 만한 가장 좋은 이유 중 하나입니다 — $3.90짜리 서버 하나로 가정 전체나 친구 몇 명의 DNS를 깔끔하게 정리할 수 있습니다. 두 가지 규칙이 이를 안전하게 만듭니다. 첫째, 절대 53번 포트를 세상에 열어서가 아니라 터널이나 인증된 암호화 엔드포인트를 통해 공유하십시오. DNS-over-HTTPS를 쓰면 사람마다 다른 경로를 줄 수 있어 접근을 개별적으로 취소할 수 있고, AdGuard Home은 클라이언트별로 다른 필터링을 적용할 수 있습니다. 둘째, 여러분이 떠안는 것이 무엇인지 스스로 분명히 하십시오: 이제 여러분은 그것을 쓰는 모든 사람의 쿼리 로그를 쥐고 있습니다. 보존 기간을 0이나 하루로 설정하고, 그 설정이 무엇인지 알려주고, 만약 언젠가 지키고 싶은 것이 여러분 자신의 프라이버시라면, 다섯 명이 함께 쓰는 리졸버는 곧 그중 누구의 것인지 특정하기 더 어려운 쿼리를 만드는 리졸버이기도 하다는 점을 기억하십시오.
전혀 아닙니다 — 프라이빗하고 접근이 통제된 리졸버는 정상적인 워크로드이며, 허용 사용 정책은 이에 대해 아무런 문제도 제기하지 않습니다. 정책이 신경 쓰는 것, 그리고 진지한 모든 네트워크가 신경 쓰는 것은 오픈 리졸버가 제3자를 향한 증폭 반사체로 악용되는 상황입니다. 공격 트래픽이 우리 네트워크를 떠나 다른 누군가의 네트워크에 떨어지기 때문입니다. 2단계를 따르면 그런 일은 결코 일어나지 않습니다: 기본적으로 거부하고, 터널만 허용하고, 나머지는 속도를 제한하십시오. 다른 사람들을 위한 서비스로 의도적으로 공개 리졸버를 운영하고 싶다면, 그것은 첫 남용 신고를 받은 뒤가 아니라 미리 나눌 만한 대화입니다 — 기술적 요건(응답 속도 제한, ANY 금지, 모니터링)은 잘 알려져 있으며, 문제가 되는 것은 의도치 않게 하나를 운영하는 것이지 의도적으로 운영하는 것이 아닙니다.
Sentinel — 2 vCPU와 4 GB, 월 $3.90, Helsinki, Stockholm, Oslo 또는 Reykjavík에서. 리졸버와 그 뒤에 자리해야 할 WireGuard 터널, 그리고 더 이상 남의 것을 빌리지 않기로 한 그 밖의 무엇이든 감당하기에 충분합니다. 가입 시 이메일도, 신분증명서도 필요 없고, 여러분이 조회하는 그 무엇에 대해서도 제품 차원의 로그가 남지 않습니다.
마지막 검토일 · 2026-10-12 · 출처 · Unbound와 AdGuard Home 문서, RFC 9156 (QNAME 최소화), RFC 7858 (DNS-over-TLS), RFC 8484 (DNS-over-HTTPS), systemd-resolved(8) · 주기 · 연간
This guide is one spoke of a larger series. The pillar walks the three privacy layers end to end — the sibling spokes below dive into the specifics.
Three independent layers — signup, payment, network — explained, legal context included, common mistakes flagged.
Your own WireGuard tunnel — server config, peer keys, kill-switch.
A v3 .onion address that survives reboots and IP changes.
나만의 Tailscale 컨트롤 서버 — ACL, MagicDNS, 엑시트 노드, 나만의 DERP.
Deploy your own MCP server on a no-KYC VPS — TLS, streamable HTTP, OAuth.
북유럽에서 구축한 프라이빗 호스팅.