광고 차단 로컬 DNS – technitium dns

technitium dns 는 DNS 수준의 애드블록 입니다. 흔히 DNS 싱크홀이라 부르죠. WebUI 를 가지고 있어서 설정이 편리하고, 그래프로 현재 상태와 통계 자료를 보여 주기 때문에 관리하기도 쉽습니다. 광고 차단 뿐만 아니라, 특정 zone (도메인) 의 레코드를 직접 설정할 수도 있어서 로컬 네트워크에서 nas.lan 와 같은 도매인을 만들 수도 있고, 또한, dns-over-https 와 같은 dns 암호화 프로토콜을 지원하기 때문에 개인 정보 보호와 보안에도 좋습니다. 마지막으로, .net 기반이라서 freebsd 에서도 mono를 이용해 실행할 수 있습니다.

technitium dns 이 광고를 차단하는 원리는 이러합니다.

  1. 어떠한 사이트에 접속할 때, advertise.example.com 에서 광고를 보여 줍니다 .
  2. 이 때, technitium dns 를 주 DNS 로 사용할 경우, 클라이언트가 advertise.example.com 의 주소를 요청했을 때, 0.0.0.0 이라는 주소를 응답합니다.
  3. 그러면 클라이언트는 advertise.example.com 의 주소를 찾지 못한 셈이 됨으로, 광고를 받아 올 수가 없어서 광고가 차단됩니다.

Jail 만들기

jail 의 이름은 technitium_dns

네트워크 설정 잡아주시고 자동 시작 설정 해 주세요.

설치 과정

iocage console technitium_dns

감옥으로 들어가 줍니다.

레포 최신으로 변경

pkg 와 port – 레포 바꾸기‘ 를 참고하여 레포를 최신으로 바꿔 주세요.

패키지 설치

pkg install mono

mono를 설치합니다.

technitium dns 설치

mkdir -p /usr/local/technitiumdns

technitium dns 가 설치될 디렉토리를 만들었습니다.

fetch https://download.technitium.com/dns/DnsServerPortable.zip -o /tmp/technitiumdnsdns.zip

technitium dns 를 /tmp/technitiumdnsdns.zip 라는 이름으로 다운로드 받습니다. technitium dns 홈페이지 에서 다운로드 받으시려면 Windows (Standalone) 버전을 받으시면 됩니다.

unzip /tmp/technitiumdnsdns.zip -d /usr/local/technitiumdns

technitium dns 의 압축을 /usr/local/technitiumdns 아래에 풉니다.

rm /tmp/technitiumdnsdns.zip

다운로드 받은 압축 파일은 지워 줍니다.

시작 스크립트 만들기

20191208 수정
technitium-dns 서비스를 종료했을 때 서비스가 종료되지 않고 좀비 프로세스로 남아 있는 경우가 종종 있음을 발견했습니다. rc 스크립트를 수정해 종료되지 않았을 경우, kill -9 으로 강제 종료 하도록 수정했습니다.

mkdir -p /usr/local/etc/rc.d

rc.d 디렉토리를 만들고

vi /usr/local/etc/rc.d/technitiumdns

technitium dns 실행 스크립트를 만듭니다.

#!/bin/sh
#
# Author : Admion!
# https://admion.net/
#

# PROVIDE: technitiumdns
# REQUIRE: DAEMON
# KEYWORD: shutdown

. /etc/rc.subr

name=technitiumdns
rcvar="${name}_enable"
stop_precmd=${name}_stop_precmd
stop_postcmd=${name}_stop_postcmd

: ${technitiumdns_enable="NO"}

load_rc_config $name

pidfile="/usr/local/technitiumdns/dns.pid"
procname="/usr/local/bin/mono"
command="/usr/sbin/daemon"
command_args="-f -p ${pidfile} ${procname} /usr/local/technitiumdns/DnsServerApp.exe"

technitiumdns_stop_precmd()
{
    if [ -r ${pidfile} ]; then
        export _DNSPID=$(check_pidfile ${pidfile} ${procname})
    fi
}

technitiumdns_stop_postcmd()
{
    _DNS_CHILDREN=$(pgrep -g ${_DNSPID})
    if [ -n "${_DNS_CHILDREN}" ];then
        echo "Cleaning up leftover processes."
        kill -9 ${_DNS_CHILDREN}
    fi
    wait_for_pids ${_DNS_CHILDREN}
}

run_rc_command "$1"

저장하고 나온 다음

chmod 555 /usr/local/etc/rc.d/technitiumdns

스크립트를 실행 가능하게 만들어 줍니다.

technitium dns 실행

sysrc technitiumdns_enable="YES"

jail 시작시 자동 시작되도록 해 준 다음

service technitiumdns start

technitium dns 을 시작합니다.

technitium dns 의 web ui 는 http://jail.ip:5380 입니다.

technitium dns WebUI

아래는 필자가 굴리고 있는 technitium dns 의 WebUI를 캡쳐한 것입니다.

WebUI 참 깔쌈합니다.

Dashboard

대시보드는 현재 서버의 상태나 dns 쿼리의 통계 등을 보여줍니다. 통계의 경우 1년 단위까지 저장됩니다.

Zones

존은 도메인 이름 영역을 뜻합니다. 여기서 도메인을 추가할 수 있습니다.

예를 들어 lan 이라는 영역을 추가하고, nas 라는 도메인의 A 레코드가 192.168.1.1 을  가르키도록 추가하면 Technitium DNS 을 사용하는 클라이언트는 http://nas.lan 이라는 도메인으로 192.168.1.1 으로 접속할 수 있습니다.

Cache

캐시는 쿼리를 캐시한 것을 보여 주는 공간입니다. 현재 어떤 쿼리가 캐시되어 있는지 표시합니다.

Allowed Zone

특정 도메인을 허용하는 것입니다. 만약 어떠한 블랙리스트 목록에 의해 example.com 이 차단되었다면, Aloowed Zone 에 example.com 을 추가해 차단을 해제할 수 있습니다.

Blocked Zone

현재 차단되어 있는 도메인을 보여 주고, 차단할 도메인을 추가할 수 있습니다. 와일드카드 도메인도 지원하기 때문에 *.example.com 을 추가하게 되면 example.com과 그 서브 도메인이 모두 차단됩니다.

DNS Client

DNS 클라이언트에서는 dns 쿼리를 테스트 해 볼 수 있습니다. dig 명령을 WebUI로 할 수 있다고 생각하시면 됩니다.

Setting

이곳에서 technitium dns 의 설정을 할 수 있습니다.

DHCP

technitium dns 는 DHCP 서버의 역할을 할 수 있습니다.

Log

로그 파일의 목록을 확인하고 열어 볼 수 있습니다.

technitium dns 설정

Settings

Settings 탭으로 들어가 technitium dns 의 설정을 해 주도록 하겠습니다.

DNS Server Domain 은 이 technitium dns 의 이름을 의미합니다. 기본값은 Jail 의 이름 (Hostname) 입니다. 원하는 대로 설정해 주시면 됩니다.

Dns Server Local Adresses 는 어떤 주소를 청취할 지 설정하는 것입니다. 0.0.0.0 은 모든 주소를 청취하겠다는 의미입니다. DNS 서버로 쓰기 위해서는 기본값으로 두거나, Jail 의 IP 로 설정해 주시면 됩니다.

Web Service Port 는 WebUI 의 포트입니다.

Optional DNS Server Protocols 는 이 서버가 DOH 와 같은 프로토콜을 청취할지 설정하는 것입니다. 만약 technitium dns가 DoH 서버로 동작하길 원한다면 옵션을 활성화하고, 인증서를 입력하면 됩니다.

IPv6 Support 는 IPv6 지원입니다. IPv6를 사용하시려면 켜 주시면 됩니다.

Logging 에서 Log All Queries 를 선택하게 되면 쿼리가 로그 파일에 기록됩니다. 로그 파일의 크기가 커지게 됨으로 필요하지 않다면 꺼 두시는게 좋습니다.

Recursive Resolver 는 재귀를 허용할지 설정하는 것입니다. 기본값으로 두시면 됩니다.

Prefetch 섹션은 캐싱에 관한 것입니다. 값을 변경한 경우 테스트를 해 주시길 바랍니다.

Block List URLs 는 블랙리스트의 목록이 저장된 URL입니다. 필자의 경우는 아래 주소를 사용합니다.

https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts
https://mirror1.malwaredomains.com/files/justdomains
http://sysctl.org/cameleon/hosts
https://zeustracker.abuse.ch/blocklist.php?download=domainblocklist
https://s3.amazonaws.com/lists.disconnect.me/simple_tracking.txt
https://s3.amazonaws.com/lists.disconnect.me/simple_ad.txt
https://hosts-file.net/ad_servers.txt
https://adaway.org/hosts.txt
https://pgl.yoyo.org/adservers/serverlist.php?hostformat=hosts&showintro=0&mimetype=plaintext

Quick Add 를 눌러 미리 구성된 목록을 추가할 수도 있습니다.

Network Proxy 는 technitium dns 서버가 프록시를 사용할 경우 설정해 주시면 됩니다.

Forwarder 는 어떤 DNS 서버를 사용할지 설정하는 것입니다. 아래 Quick Select 를 이용해 빠르게 추가할 수 있습니다. 예를 들어, https://cloudflare-dns.com/dns-query 를 Forwarder 로 사용하고, Forwarder ProtocolDNS-over-HTTPS 로 설정하게 되면 Cloudflare DNS 와 DoH를 통해 통신하게 됩니다.

Quick Select 을 통해 미리 구성된 전달자를 추가할 수 있습니다.

여러 개의 전달자를 설정해 줄 수도 있습니다. https://cloudflare-dns.com/dns-query 와 https://dns.google/dns-query 를 추가해 주면, 둘 다 사용하게 됩니다.

Zone 설정

Blocked Zones

검색창에 검색하고자 하는 도메인을 입력한 후, Browse 을 누르면, 해당 도메인이 블락된 상태일 경우 검색 결과가 표시됩니다.

Block 을 누르게 되면 해당 도메인을 차단할 수 있습니다.

와일드카드 도메인을 지원함으로 *.example.com 을 입력하면 example.com서브 도메인이 모두 차단됩니다.

필자는 아래 도메인을 차단하였습니다.

ads.moot.us
*.widerplanet.com
*.nrb.footprintdns.com
*.keywordsconnect.com
www.googleadservices.com
ad.danawa.com
naver-smr.smartmediarep.com
*.trafficsan.com
adc.naver.com
adcreative.naver.com
lcs.naver.com
castbox.shopping.naver.com
ams.rmcnmv.naver.com
*.ad.naver.com
ia.www.naver.com
wrd.naver.com
nv.veta.naver.com
ad.news.naver.com
*.googlesyndication.com
tpc.googlesyndication.com
analytics.ad.daum.net
vads-api.ad.daum.net
kyson.ad.daum.net
smr.tvpot.daum.net
g-plug.pstatic.net
*.dreamsearch.or.kr
adservice.google.co.kr
click.clickmon.co.kr
*.clickmon.co.kr
realdmp.realclick.co.kr
*.realclick.co.kr
*.mapy.co.kr

일일히 하나씩 입력하셔야 합니다.

Allowed Zones

Blocked Zones 과 사용방법이 동일합니다. 이건 허용이라는 점만 다를 뿐이죠. 어떠한 블랙리스트 목록으로 인해 example.com 이라는 도메인이 차단되었다면 이곳에 입력하여 허용해 줄 수 있습니다. 당연히 와일드카드 도메인도 지원합니다.

Zones

도메인 이름 영역을 추가하고 관리할 수 있습니다.

Add Zone 을 눌러 영역을 추가할 수 있습니다.

직접 해보겠습니다. lan 을 추가합니다.

lan 이라는 영역이 추가되었습니다.

수정하고자 하는 영역의 Edit 을 누르면 레코드를 수정할 수 있습니다.

lan 영역을 수정하도록 하겠습니다.

Add Record 를 눌러 레코드를 추가할 수 있습니다. nas.lan 을 추가해 보도록 하겠습니다.

  • Namenas
  • TypeA
  • TTL 은 기본값 (3600) 으로 놔두고
  • 값 (IPv4 Address) 에는 192.168.1.1 을 입력합니다.

그리고 Save 를 눌러 저장하면 nas라는 레코드가 등록됩니다.

technitium dns 을 이용하는 클라이언트는 nas.lan 이라는 도메인으로 192.168.1.1 에 접속할 수 있습니다.

←Back 버튼을 누르면 Zone 목록으로 돌아갑니다.

technitium dns 를 메인 DNS 로 설정

technitium dns 을 메인 DNS 로 쓰기 위해선 라우터 (공유기) 의 DHCP 서버 메뉴로 이동하여 주 DNS 와 보조 DNS 를 모두 technitium dns 의 주소로 설정해 줍니다.

아수스 라우터의 경우는 위와 같습니다.

주기적 재시작

20191208 수정
technitium-dns 가 오랫동안 실행될 경우 오류가 발생하는 것을 확인하였습니다. 매일 새벽마다 재시작하도록 설정하겠습니다.

vi /etc/crontab

맨 아래에 다음과 같이 입력합니다.

0 4 * * * root service technitiumdns restart

매일 새벽 4시에 technitium-dns 가 재시작 됩니다.

만약 jail 내부 cron 에 등록한 작업이 정상적으로 실행되지 않는다면, FreeNAS WebUI 의 cron 에

iocage exec technitium_dns service technitiumdns restart

명령을 등록해도 동일하게 작동합니다.

업데이트 하기

technitium dns 를 업데이트 하기 위해선 technitium dns 의 최신 버전을 받아와서 설치하면 됩니다.

service technitiumdns stop

technitium dns 서버를 중지하고

cp -r /usr/local/technitiumdns/config /tmp/

설정 파일을 백업하고

fetch https://download.technitium.com/dns/DnsServerPortable.zip -o /tmp/technitiumdnsdns.zip

최신 파일을 받은 다음

unzip /tmp/technitiumdnsdns.zip -o -d /usr/local/technitiumdns

압축을 풀어 줍니다.

service technitiumdns start

다시 서비스를 시작해 줍니다.

DNS 서버가 정상적으로 업데이트 되었다면 백업한 설정 파일과 다운로드 받은 파일을 삭제합니다.

rm -r /tmp/config/ /tmp/technitiumdnsdns.zip

마치면서

Technitium DNS 서버의 도움말 페이지가 있으니 한번 읽어 보시길 바랍니다.

https://technitium.com/dns/help.html

technitium dns 를 설치하고 설정하는 방법과 업데이트 하는 방법을 알아보았습니다. 또한, nas.lan 이라는 도메인이 FreeNAS 를 가리키도록 설정하였습니다.

다음 포스팅에서는 사설 인증서 발급 방법을 다룰 것입니다.

시리즈 네비게이션<< DDNS – DDclient사설 인증서 발급하기 >>

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다