[Docker] AdGuard Home으로 광고를 막아보자

[Docker] AdGuard Home으로 광고를 막아보자
나만의 DNS서버 구축으로 광고 차단과 보안을 동시에 해결.

Adguard Home는 DNS서버로 DNS쿼리를 필터하여 연결된 내부 망 클라이언트들의 광고·트래킹을 차단합니다.
이번 포스팅 에서는 Docker를 이용해 AdGuard Home를 설치 해 보겠습니다.

설치 환경:
Ubuntu24.04 / Docker version 28.4.0 / Docker Compose version v2.39.1
docker, docker-compose 설치는 여기로

Docker, Docker-compose 설치
Docker 설치 1. 패키지 업데이트, 의존성 패키지 설치 sudo apt-get update sudo apt-get install ca-certificates curl 2. Docker 공식 GPG key 등록 sudo install -m 0755 -d /etc/apt/keyrings sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc sudo chmod a+r

docker-compose.yml 작성

services:
  adguardhome:
    image: adguard/adguardhome:v0.107.65
    restart: unless-stopped
    ports:
      #DHCP
      # - '67:67/tcp'
      # - '67:67/udp'
      # - '68:68/udp'
      #Web Console
      - '3000:3000/tcp'
      #DNS
      - '53:53/tcp'
      - '53:53/udp'
      #DNS over HTTPS
      - '80:80/tcp'
      - '443:443/tcp'
      - '443:443/udp'
      #DNS over TLS
      - '853:853/tcp'
      #DNS over QUIC
      - '784:784/udp'
      - '853:853/udp'
      - '8853:8853/udp'
      #DNSCrypt
      - '5443:5443/tcp'
      - '5443:5443/udp'
    volumes:
      - './work:/opt/adguardhome/work'
      - './conf:/opt/adguardhome/conf'

Adguard Home은 DNS 암호화 프로토콜로 DNS over HTTPS, DNS over TLS, DNS over QUIC, DNSCrypt를 지원 합니다. DNS 암호화를 사용하고자 한다면 해당 포트를 모두 열어두면 됩니다.

Adguard Home은 자체 DHCP서버도 지원합니다. 대부분 가정에서 사용하는 공유기에서 DHCP서버가 구동되고 있기에 DHCP서버는 사용 포트는 주석 처리 하겠습니다.

systemd-resolved 53번 포트 충돌

resolved데몬이 이미 53번 포트를 사용 중이므로 resolved데몬 설정을 먼저 수정하겠습니다.

DNSStubListener 비활성화 및 DNS서버 주소 변경

  1. /etc/systemd/resolved.conf.d/adguardhome.conf 생성 및 편집
sudo mkdir /etc/systemd/resolved.conf.d
sudo nano /etc/systemd/resolved.conf.d/adguardhome.conf

nano 편집기가 열리면 아래 설정을 붙여넣습니다.

[Resolve]
DNS=127.0.0.1 1.1.1.1
DNSStubListener=no
  1. 기존 설정 파일 백업 및 새로운 설정 파일 적용
sudo mv /etc/resolv.conf /etc/resolv.conf.backup
sudo ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf
  1. DNSStubListener 중지
systemctl reload-or-restart systemd-resolved

설치 시 문제가 생길 수 있기에 DNS 주소에 1.1.1.1(cloudflare dns)를 추가 해두었습니다. 1.1.1.1은 설치 후 다시 제거 하겠습니다.

초기 설정

docker compose up -d

컨테이너를 up 한 뒤 http://[본인 서버 ip]:3000 으로 접속하면 아래 초기 설정 화면이 나옵니다.

adguard 초기설정

관리자 사이트 포트는 docker-compose.yml에서 80:80으로 설정 해 두었으므로 80번 포트를 사용하겠습니다.
공식 DNS 포트는 53번 입니다. docker-compose.yml에서 53번 또한 포트포워딩 해 두었으므로 53번 그대로 사용하겠습니다.

adguard 초기설정

관리자 인터페이스 접속시 사용 할 아이디/비밀번호를 설정합니다.

adguard 초기설정

Docker를 통해 설치 했으므로 위 주소는 docker에서 생성한 network내부의 주소입니다. 추후 설정 시에 사용할 주소는 아래 주소가 아닌 호스트의 주소입니다.

대시보드 열기를 클릭하면 htttp://[호스트ip주소]:[지정 포트]로 자동으로 연결 됩니다.
설정한 아이디/비밀번호를 통해 웹 콘솔에 로그인 합니다.

라우터 설정

사용하고 있는 라우터의 DNS주소를 바꿉니다. 내부 네트워크 구조에 따라 다르지만, 일반적으로 사용하는 공유기가 라우터의 역할을 같이 합니다.

공유기의 관리 페이지에 접속합니다. 일반적으로 192.168.0.1(iptime), 192.168.1.1(tplink), 192.168.45.1(sk) 의 주소를 사용합니다. 사용하는 공유기에 따른 관리자 페이지를 찾고, 해당 주소로 접속합니다.
이번 포스팅 에서는 iptime공유기를 사용하겠습니다.

공유기 dns주소 설정

DNS 주소 수동 입력을 체크한 후 호스트 주소를 입력합니다.
보조 DNS를 비워두지 않으면 해당 DNS서버로 광고의 주소를 찾을 수 있기 때문에 비워둡니다.

연결 확인

라우터의 DNS 주소를 바꾼 후 인터넷에 접속하면 DNS 요청이 들어오며 대쉬보드에 요청들이 나타나기 시작합니다.

adguard 대시보드

systemd-resolved 설정 수정

sudo nano /etc/systemd/resolved.conf.d/adguardhome.conf

nano 편집기가 열리면

[Resolve]
DNS=127.0.0.1
DNSStubListener=no

기존에 DNS에 있던 1.1.1.1을 지우고, ctrl + x -> Enter 로 저장하여 나옵니다.

systemctl reload-or-restart systemd-resolved

데몬을 재시작하여 변경사항을 적용합니다.

추천 설정

업스트림 DNS서버

설정 -> DNS설정 -> 업스트림 DNS서버

#Quad9
https://dns10.quad9.net/dns-query
#Cloudflare
https://dns.cloudflare.com/dns-query
tls://one.one.one.one
#Google
https://dns.google/dns-query
tls://dns.google

https로 시작하는 주소는 DoH, tls로 시작하는 주소는 DoT를 사용하는 주소입니다. 혹시 모를 DNS서버 다운과, 빠른 속도를 위해 서버를 더 추가해 두는 게 좋습니다.

사용할 수 있는 DNS 주소는 아래와 같습니다.

알려진 DNS 공급자 | AdGuard DNS Knowledge Base
이 글에서는 신뢰할 수 있는 DNS 제공업체 목록을 확인할 수 있습니다. 이를 사용하려면 먼저 기기에 AdGuard 광고 차단기 또는 AdGuard VPN을 설치하세요. 그런 다음 동일한 기기에서 이 글에 언급된 제공업체 링크를 클릭합니다.

내부 DNS서버

설정 -> 필터 -> DNS변경 -> DNS 변환 정보를 추가합니다

내부 DNS서버를 사용하면 홈랩 서비스들을 웹에 노출 시키지 않고도 내부망에서 특정 도메인으로 서비스에 접속할 수 있습니다.

.internal, .lan 도메인을 주로 내부 망에서 사용합니다.
특히 .internal 은 IETF(국제 인터넷 표준화 기구)에서 내부용으로 공식 지정한 TLD입니다.

.local은 과거에 종종 사용되었지만, Apple의 Bonjour나 mDNS에서 사용하는 이름으로 사용하지 않는 것이 좋습니다.

Reference :
Adguard Home 공식 Docker Hub