WireGuard에서 DNS 누출 방지와 설정 방법
WireGuard 연결 시 발생하는 DNS 누출 원인과 검증 절차, wg-quick DNS 구성 예시 및 systemd-resolved·resolvconf 연동 대응을 정리한 지침
목차
개요
VPN으로 트래픽을 보호하더라도 DNS가 올바르게 구성되지 않으면 실제로는 누출이 발생한다. 이 글은 WireGuard에서 흔히 발생하는 DNS 누출 유형을 설명하고, WireGuard DNS 누출 방지를 위한 실무적인 WireGuard DNS 설정 방법과 wg-quick DNS 구성 예시를 제공한다. 초보자도 이해할 수 있도록 단계별로 정리한다.
DNS 누출이 발생하는 이유
운영체제 레졸버 충돌
Linux 배포판마다 systemd-resolved, resolvconf, NetworkManager 등 서로 다른 레졸버가 동작한다. WireGuard 인터페이스 생성 시 클라이언트의 DNS가 제대로 갱신되지 않거나 우선순위가 잘못 설정되면 로컬 ISP의 DNS로 쿼리가 나가 DNS 누출이 발생한다.
wg-quick의 기본 동작과 한계
wg-quick는 인터페이스를 빠르게 설정해 주지만, 모든 시스템에서 DNS 레졸버와 자동으로 완벽히 통합되지는 않는다. 특히 systemd-resolved가 활성화된 환경에서는 /etc/resolv.conf가 심볼릭 링크로 연결되어 있어 단순한 파일 덮어쓰기만으로는 동작하지 않는다.
검증 방법
누출 여부 확인은 외부 서비스와 로컬 패킷 캡처를 통해 가능하다. 다음 항목들이 유용하다.
- 웹 기반 테스트: "DNS leak test" 사이트에서 VPN 연결 중 쿼리 소스를 확인
- 로컬 도구: dig, nslookup으로 쿼리 응답의 이름 서버 확인
- 패킷 캡처: tcpdump로 WireGuard 인터페이스 외부로 나가는 DNS(UDP/53) 패킷 확인
예: 간단한 확인 명령
dig @resolver.example.com +short whoami.akamai.net TXT
wg-quick로 DNS 설정하기
wg-quick 파일의 Peer 섹션이나 Interface 섹션에 DNS 항목을 추가하면 일부 환경에서 resolv.conf를 자동으로 갱신한다. 그러나 systemd-resolved나 NetworkManager와의 연동을 고려해야 한다.
기본 wg-quick 구성 예
[Interface]
Address = 10.0.0.2/24
PrivateKey =
DNS = 1.1.1.1, 1.0.0.1
[Peer]
PublicKey =
Endpoint = vpn.example.com:51820
AllowedIPs = 0.0.0.0/0, ::/0
위 구성에서는 wg-quick가 인터페이스 업 시 resolv.conf를 갱신하도록 시도한다. 다만 systemd-resolved가 활성화되어 있으면 별도 조치가 필요하다.
systemd-resolved 환경 대응
systemd-resolved가 있을 경우 /etc/resolv.conf가 /run/systemd/resolve/stub-resolv.conf나 /run/systemd/resolve/resolv.conf로 연결되어 있다. 이때는 wg-quick가 직접 수정하지 못하므로, 다음과 같은 선택지가 있다.
- systemd-resolved의 링크를 /run/systemd/resolve/resolv.conf로 바꾸고 resolv.conf를 관리
- systemd-resolved에 대해 per-link DNS 설정을 적용
- resolvconf 도구를 사용하여 우선순위로 DNS를 설정
systemd-resolved에 대한 예시(링크 방식)
# /etc/wireguard/wg0.conf 내 DNS 항목이 동작하지 않을 때
# systemd-resolved를 통해 DNS를 우선화하는 방법 설명 예시
# 실제 명령은 시스템별로 다름
중요한 점은 네트워크 매니저나 다른 서비스가 /etc/resolv.conf를 덮어쓰지 않도록 조정하는 것이다. 이를 위해 NetworkManager의 DNS 설정을 수동으로 변경하거나, wg-quick가 실행될 때 후크 스크립트를 사용해 우선 DNS를 강제 설정하는 방법이 있다.
wg-quick 후크로 DNS 우선순위 적용
wg-quick은 up/down 스크립트를 지원한다. 이를 통해 인터페이스가 올라갈 때 레졸버를 적절히 갱신할 수 있다.
예: up/down 스크립트 구조
# /etc/wireguard/wg0.up
#!/bin/sh
# DNS 강제 설정 예시
echo 'nameserver 1.1.1.1' > /etc/resolv.conf
# /etc/wireguard/wg0.down
#!/bin/sh
# 복원 로직 예시
echo 'nameserver 8.8.8.8' > /etc/resolv.conf
위 예는 단순화된 방식이며, 운영체제의 레졸버 방식에 맞게 수정해야 한다. systemd-resolved를 사용 중이면 해당 서비스의 API나 resolvectl을 활용한 설정 적용이 더 적절하다.
로컬 DNS 캐시(예: dnsmasq)와의 통합
로컬 DNS 캐시를 운영하면 퍼포먼스와 프라이버시 모두에 도움이 된다. 로컬 캐시에 WireGuard가 제공하는 상위 DNS를 포워딩하도록 설정하면 누출 가능성을 줄일 수 있다.
구성 요약
- wg-quick의 DNS 항목을 사용해 원격 DNS를 지정
- systemd-resolved, NetworkManager, resolvconf의 동작을 이해하고 우선순위를 조정
- wg-quick up/down 후크로 레졸버를 제어
- dnsmasq 같은 로컬 캐시를 도입해 로컬 포워딩 처리
문제 해결 체크리스트
- vpn 연결 후 /etc/resolv.conf의 내용 확인
- dig/nameserver 테스트로 실제 쿼리 경로 확인
- tcpdump로 interface 외부의 UDP 53 트래픽 여부 확인
- 다중 네트워크(예: Wi‑Fi + Ethernet) 환경에서 우선순위 확인
결론
WireGuard 자체는 안전하지만 DNS 설정이 올바르지 않으면 개인정보가 유출될 수 있다. wg-quick의 DNS 기능을 이해하고, 시스템 레졸버와의 연동을 적절히 처리하면 WireGuard DNS 누출 방지가 가능하다. 설정 후에는 항상 외부 도구와 패킷 캡처로 검증하는 절차가 필요하다.