집에서 사용하는 스마트폰, PC, 태블릿, 스마트 TV, 게임기에는 생각보다 많은 광고와 추적 요청이 발생합니다. 웹사이트 광고뿐 아니라 앱 내부 광고, 스마트 TV의 추천 콘텐츠, IoT 기기의 분석 서버 연결도 DNS 요청 단계에서 시작되는 경우가 많습니다. Pi-hole은 이러한 도메인 요청을 차단 목록과 비교해 광고·추적 서버로의 접속을 막아 주는 DNS 필터링 도구입니다.
Pi-hole을 공유기 또는 개별 기기의 기본 DNS 서버로 설정하면, 같은 네트워크에 연결된 여러 기기에 일괄적으로 광고 차단 정책을 적용할 수 있습니다. 브라우저 확장 프로그램처럼 기기마다 설치할 필요가 없고, 스마트 TV나 게임기처럼 별도 광고 차단 앱을 설치하기 어려운 장치에도 적용할 수 있다는 점이 큰 장점입니다.
다만 Pi-hole이 “모든 광고”를 완벽히 없애 주는 것은 아닙니다. YouTube 광고처럼 영상 콘텐츠와 광고가 같은 도메인 또는 CDN을 사용하는 서비스는 DNS 차단만으로 처리하기 어렵습니다. 또한 일부 앱은 광고 차단 도메인과 정상 서비스 도메인을 함께 사용하기 때문에, 지나치게 공격적인 차단 목록을 적용하면 앱 기능이 제대로 동작하지 않을 수 있습니다.
이 글에서는 Docker Compose를 이용해 Pi-hole을 구축하고, 공유기 DNS 설정을 통해 집 안 전체 기기에 적용하는 과정을 다룹니다. 설치 과정뿐 아니라 DNS 포트 충돌, 관리자 비밀번호, 광고 차단 예외 처리, 백업과 유지보수 방법까지 함께 살펴보겠습니다.
1. Pi-hole과 Docker를 위한 사전 준비
Pi-hole은 항상 켜져 있는 DNS 서버 역할을 하므로, 가능한 한 안정적으로 동작하는 장비에 설치하는 것이 좋습니다. 저전력 미니 PC, NAS, 홈 서버, Raspberry Pi, 오래된 노트북, Ubuntu 서버 등이 대표적인 선택지입니다. Docker를 사용할 수 있다면 운영체제 환경 차이와 의존성 문제를 줄일 수 있어 관리가 편리합니다.
설치 전에는 Docker와 Docker Compose가 준비되어 있어야 합니다. Ubuntu 기준으로는 Docker Engine과 Docker Compose 플러그인을 설치한 뒤 docker compose version 명령으로 정상 동작 여부를 확인할 수 있습니다. NAS를 사용한다면 제조사 패키지 센터 또는 컨테이너 관리 앱에서 Docker 기능을 제공하는지 확인하면 됩니다.
Pi-hole은 기본적으로 DNS 통신에 TCP/UDP 53번 포트를 사용하고, 관리 화면에 HTTP 80번 포트를 사용합니다. 따라서 Docker 호스트에서 이미 53번 포트를 사용하는 서비스가 있는지 확인해야 합니다. 특히 Ubuntu 계열 시스템에서는 systemd-resolved가 로컬 DNS 스텁 리스너로 53번 포트를 점유하는 경우가 있어 사전 확인이 필요합니다.
서버에는 가능하면 고정 IP 주소를 할당하는 것이 좋습니다. 공유기의 DHCP 예약 기능을 사용해 서버 MAC 주소에 특정 IP를 항상 배정하면 가장 편리합니다. 예를 들어 Pi-hole 서버를 192.168.0.10으로 고정해 두면, 나중에 공유기 DNS 설정이나 클라이언트 설정에서 해당 주소를 안정적으로 사용할 수 있습니다.
2. Docker Compose로 Pi-hole 컨테이너 생성하기
먼저 Pi-hole 설정 파일을 보관할 디렉터리를 만듭니다. 컨테이너를 삭제하거나 업데이트하더라도 설정, 차단 목록, 통계 데이터를 유지하려면 볼륨 마운트가 필요합니다. 아래 예시는 홈 디렉터리 아래에 pihole 폴더를 생성하는 방식입니다.
mkdir -p ~/pihole/etc-pihole
mkdir -p ~/pihole/etc-dnsmasq.d
cd ~/pihole
이제 같은 디렉터리에 docker-compose.yml 파일을 생성합니다. 아래 설정은 일반적인 가정용 네트워크에서 사용할 수 있는 기본 예시입니다. TZ에는 자신의 시간대를 넣고, 관리자 비밀번호는 충분히 긴 값으로 변경해야 합니다.
services:
pihole:
container_name: pihole
image: pihole/pihole:latest
restart: unless-stopped
environment:
TZ: Asia/Seoul
FTLCONF_webserver_api_password: "강력한-관리자-비밀번호"
FTLCONF_dns_listeningMode: "all"
volumes:
- ./etc-pihole:/etc/pihole
- ./etc-dnsmasq.d:/etc/dnsmasq.d
ports:
- "53:53/tcp"
- "53:53/udp"
- "8080:80/tcp"
cap_add:
- NET_ADMIN
관리 화면 포트는 호스트의 80번 포트 충돌을 피하기 위해 예시에서 8080:80으로 설정했습니다. 따라서 설치 후 브라우저에서 http://서버IP:8080/admin으로 접속하면 됩니다. 서버에서 이미 웹 서버나 NAS 관리 페이지가 8080 포트를 사용 중이라면 8081:80처럼 다른 포트로 바꿔도 됩니다.
파일 저장 후 아래 명령으로 컨테이너를 실행합니다. 이미지 다운로드가 처음에는 다소 시간이 걸릴 수 있으며, 이후에는 백그라운드에서 Pi-hole 서비스가 실행됩니다.
docker compose up -d
docker compose ps
3. 관리자 화면 접속과 DNS 동작 확인
컨테이너가 정상 실행되었다면 웹 브라우저에서 http://192.168.0.10:8080/admin과 같은 주소로 접속합니다. 여기서 192.168.0.10은 실제 Pi-hole 서버의 내부 IP 주소로 바꿔야 합니다. 로그인 화면이 나타나면 Compose 파일에 설정한 관리자 비밀번호를 입력합니다.
관리자 대시보드에서는 전체 DNS 요청 수, 차단된 쿼리 수, 상위 요청 도메인, 요청을 보낸 클라이언트 등을 확인할 수 있습니다. 처음 설치한 직후에는 데이터가 거의 없지만, 공유기나 기기의 DNS를 Pi-hole로 변경하면 몇 분 안에 요청 통계가 쌓이기 시작합니다. 이를 통해 어떤 기기가 어떤 외부 도메인에 자주 접속하는지도 대략적으로 파악할 수 있습니다.
Pi-hole은 기본적으로 DNS 질의를 외부 업스트림 DNS 서버로 전달합니다. 관리자 페이지의 Settings → DNS 메뉴에서 Cloudflare, Google, Quad9 등의 업스트림 DNS를 선택할 수 있습니다. 개인정보 보호를 중시한다면 광고·악성 도메인 차단 정책을 제공하는 Quad9 또는 암호화 DNS 구성을 별도로 고려할 수 있습니다.
서버 터미널에서는 아래 명령으로 Pi-hole 로그를 실시간 확인할 수 있습니다. 광고 도메인 요청이 blocked 또는 유사한 상태로 표시된다면 DNS 차단 기능이 정상 동작하는 것입니다.
docker logs -f pihole
DNS 응답 자체를 확인하려면 다른 PC에서 nslookup 명령을 사용할 수 있습니다. 예를 들어 Pi-hole 서버가 192.168.0.10이라면 아래처럼 테스트할 수 있습니다.
nslookup doubleclick.net 192.168.0.10
4. 공유기에 Pi-hole DNS를 설정해 집 전체에 적용하기
Pi-hole의 가장 큰 장점은 공유기 DHCP 설정에 DNS 서버 주소를 등록하면 집 안의 여러 기기에 자동 적용된다는 점입니다. 공유기 관리자 페이지에 접속한 뒤 DHCP 서버 설정 또는 LAN 설정 메뉴를 찾습니다. 제조사에 따라 “DNS 서버”, “DHCP DNS”, “로컬 DNS”, “네임서버” 등의 이름으로 표시될 수 있습니다.
기본 DNS 서버 항목에는 Pi-hole 서버의 내부 IP를 입력합니다. 예를 들어 Pi-hole 서버 IP가 192.168.0.10이라면, 기본 DNS에 192.168.0.10을 지정합니다. 보조 DNS에 공용 DNS인 8.8.8.8이나 1.1.1.1을 함께 넣으면 일부 기기가 Pi-hole을 우회할 수 있으므로, 광고 차단을 일관되게 적용하려면 보조 DNS도 신중하게 설정해야 합니다.
일반적으로 보조 DNS도 비워 두거나 Pi-hole 서버 주소를 동일하게 입력하는 방식이 많이 사용됩니다. 다만 Pi-hole 서버가 꺼졌을 때 인터넷 이름 해석이 실패할 수 있으므로, 가정에서 인터넷 연결 안정성이 매우 중요하다면 Pi-hole을 두 대 운영하거나 공유기 수준의 장애 대응 방안을 고려하는 것이 좋습니다. 단일 Pi-hole 구성은 간단하지만 단일 장애 지점이 될 수 있습니다.
공유기 설정을 변경한 뒤에는 기존 기기가 이전 DNS 정보를 계속 사용하고 있을 수 있습니다. Wi-Fi를 껐다 켜거나, 기기를 재부팅하거나, DHCP 임대 갱신을 수행하면 새 DNS 설정을 빠르게 받을 수 있습니다. Windows에서는 ipconfig /renew, macOS와 Linux에서는 네트워크 연결을 다시 설정하는 방식으로 갱신할 수 있습니다.
공유기에서 DNS 배포 설정을 찾기 어렵다면 개별 기기에서 DNS를 직접 Pi-hole 서버로 지정할 수도 있습니다. PC, 스마트폰, 태블릿에서 Wi-Fi 네트워크의 DNS 항목을 수동으로 변경하면 됩니다. 다만 이 방식은 기기마다 설정해야 하고, 모바일 데이터 환경에서는 적용되지 않으므로 집 전체 적용에는 공유기 설정이 더 적합합니다.
5. 차단 목록 관리와 오탐지 해결 방법
Pi-hole은 여러 광고·추적 도메인을 포함한 기본 차단 목록을 제공하지만, 필요에 따라 추가 목록을 등록할 수 있습니다. 관리자 페이지의 Adlists 메뉴에서 공개 차단 목록 URL을 추가하고, 이후 Gravity 업데이트를 실행하면 새로운 목록이 적용됩니다. 다만 차단 목록을 무작정 많이 추가하면 정상 서비스가 오작동할 가능성도 함께 커집니다.
처음에는 기본 목록만 사용하면서 차단 효과와 문제 발생 여부를 관찰하는 것이 좋습니다. 특정 앱, 쇼핑몰, 은행 서비스, 스마트 TV 기능 등이 정상 동작하지 않는다면 Pi-hole의 Query Log를 확인합니다. 해당 기기가 요청한 도메인 중 차단된 항목을 찾으면, 문제가 되는 도메인을 식별하는 데 도움이 됩니다.
정상 서비스에 필요한 도메인이 차단되었다면 Allowlist에 추가해 예외 처리할 수 있습니다. 예를 들어 특정 기기의 업데이트 서버나 회사 VPN 인증 도메인이 차단된 경우, 전체 차단 정책을 끄는 대신 해당 도메인만 허용하는 방식이 더 안전합니다. 예외 등록 후에는 해당 기기의 DNS 캐시를 갱신하거나 앱을 다시 실행해야 변경 사항이 반영될 수 있습니다.
반대로 광고가 계속 표시되는 경우에도 Pi-hole이 고장 난 것은 아닐 수 있습니다. 앱이 자체 DNS를 사용하거나, DNS over HTTPS(DoH) 또는 DNS over TLS(DoT)를 통해 외부 DNS 서버에 직접 연결하면 Pi-hole을 우회할 수 있습니다. 또한 광고 서버와 일반 콘텐츠 서버가 같은 도메인을 공유하는 서비스는 DNS 차단만으로 분리하기 어렵습니다.
Pi-hole 관리자 페이지에는 일정 시간 동안 차단을 비활성화하는 기능도 있습니다. 특정 서비스 오류가 Pi-hole 때문인지 확인하고 싶다면 잠시 차단을 끈 뒤 기능이 정상화되는지 비교해 볼 수 있습니다. 이 기능은 문제 원인을 빠르게 확인하는 데 유용하지만, 장기간 비활성화 상태로 두지 않도록 주의해야 합니다.
6. 업데이트, 백업, 보안 관리
Docker 기반 Pi-hole은 이미지 업데이트가 비교적 간단합니다. 먼저 현재 컨테이너와 설정을 백업한 뒤, 최신 이미지를 내려받고 컨테이너를 다시 생성하면 됩니다. 볼륨 마운트를 올바르게 설정했다면 /etc/pihole 관련 데이터는 유지됩니다.
cd ~/pihole
docker compose pull
docker compose up -d
업데이트 전에는 설정 디렉터리를 별도로 백업하는 습관을 들이는 것이 좋습니다. 특히 차단 목록, 허용 목록, 사용자 정의 DNS 레코드, DHCP 설정 등을 변경했다면 백업이 중요합니다. 가장 단순한 방법은 ~/pihole 디렉터리 전체를 압축하거나 NAS, 외장 디스크, 다른 서버로 복사하는 것입니다.
tar -czvf pihole-backup.tar.gz ~/pihole
Pi-hole 관리자 페이지는 내부 네트워크에서만 접근하도록 운영하는 것이 안전합니다. 인터넷에 직접 포트 포워딩을 설정해 외부에 노출하는 것은 권장하지 않습니다. 외부에서 관리해야 한다면 VPN을 통해 집 네트워크에 접속한 후 관리자 페이지를 여는 방식이 더 안전합니다.
관리자 비밀번호는 추측하기 어려운 값으로 설정하고, Docker Compose 파일을 GitHub 같은 공개 저장소에 올릴 때는 비밀번호가 포함되지 않도록 주의해야 합니다. 필요하다면 비밀번호를 .env 파일로 분리하거나 Docker Secret, 비밀 관리 도구를 사용할 수 있습니다. 또한 NAS나 홈 서버의 운영체제, Docker 엔진, 공유기 펌웨어도 주기적으로 업데이트하는 것이 좋습니다.
Pi-hole은 단순한 광고 차단기를 넘어 집 안 네트워크의 DNS 흐름을 관리하는 도구입니다. 너무 강한 차단 정책보다는 안정성과 편의성의 균형을 맞추고, Query Log와 통계를 주기적으로 확인하면서 필요한 예외만 추가하는 방식이 가장 실용적입니다. Docker Compose로 구성해 두면 이전, 복구, 업데이트도 쉬워 장기적으로 관리하기 좋은 홈 네트워크 서비스가 됩니다.