Thursday, April 09, 2020

AdGuard Home 을 OpenWRT 공유기에 설치하기


== 우리집 네트워크 장비 구성도 ==


  • 메인 인터넷 공유기는 dd-wrt 를 구동 중 이며 케이블 모뎀을 통해서 인터넷 제공 회사에 연결 되어 있습니다. IP 주소는 192.168.100.1
  • OpenWrt 를 구동 중인 두 번째 공유기는 메인 인터넷 공유기에 유선으로 연결 되어 있으며 액세스 포인트 (Access Point) 로 설정 되어 있습니다. IP 주소는 192.168.100.3



1. 방 구석에 쳐박혀 있던 1 GB USB 메모리 스틱의 귀환


mmap() 이라는 시스템 콜을 지원하지 않는 파일 시스템에서 작동하지 않는 제약이 있습니다. 게다가 프로그램을 장시간 구동 하면서 생성 하게될 백업 파일, 블럭리스트 파일 등등의 크기가 제법 커질 수 있다는 사실을 고려해서 AdGuard Home 을 USB 메모리 스틱에 설치하기로 합니다. 방 구석에 샅샅이 뒤져 USB 메모리 스틱을 찾아 OpenWrt 공유기에 연결 합니다.

설치 과정에서 OpenWrt 공유기의 터미널 연결이 필요합니다. Putty 라는 프로그램을 사용하면 쉽게 OpenWrt 공유기에 터미널 접속을 할 수 있습니다.



OpenWrt 공유기의 IP 주소 192.168.100.3 을 입력하고 터미널 접속을 합니다. 'root' 로 로그인 하고 패스워드를 입력하면 초기 프롬프트가 시작됩니다.



다음의 명령어들을 차례로 입력합니다.


> opkg update && opkg install block-mount e2fsprogs kmod-fs-ext4 kmod-usb-storage kmod-usb2 kmod-usb3
> ls -al /dev/sd*
> mkfs.ext4 /dev/sda


USB 스틱을 설치한 USB 포트 위치에 따라서 USB 메모리 스틱이 '/dev/sda' 이거나 '/dev/sdb' 일 수 있습니다.

터미널 접속은 잠시 뒤로 두고 인터넷 브라우저에서 OpenWrt 에 접속합니다. 여기서 경우 IP 주소는 192.168.100.3 입니다.



메뉴에서 System >> Mount Points 를 선택합니다.



Generate Config 를 클릭하면



아래 쪽 Mount Points 항목에 연결된 USB 메모리 스틱이 보입니다. 오른 쪽 Edit 를 누르고 USB 마운트 정보를 아래와 같이 입력합니다. 여기서는 USB 메모리 스틱을 '/mnt' 라는 마운트 포인트로 사용합니다.





위로 올라가서 Mount attached devices 를 누른 후 맨 아래에 Save & Apply 를 클릭하면 USB 메모리 스틱 설정을 마칩니다.


2. 53 번 포트를 AdGuard Home 에게로...


DNS 서버는 디폴트로 53번 포트를 사용합니다. OpenWrt 나 dd-wrt 같은 리눅스에서 파생된 시스템들은 대부분 dnsmasq 란 DNS 서버를 사용합니다. AdGuard Home 을 DNS 서버로 사용하려면


  1. dnsmasq 를 서비스를 중단하고 53 번 포트를 AdGuard Home에 넘겨 주거나, 또는
  2. AdGuard Home 에서 53 번이 아닌 1024 보다 큰 숫자의 포트를, 예를 들면 5353 번, 사용해야 합니다.


만약 5353 번 처럼 디폴트 53 번이 아닌 포트를 AdGuard Home 에서 사용하게 되면 DNS 서버의 IP 주소를 지정할 때 192.168.100.3:5353 과 같이 포트 숫자를 같이 지정해야 합니다.

우리집 네트워크 구성도에서 AdGuad Home 을 메인 인터넷 공유기가 아닌 액세스 포인트로 사용하는 두 번째 공유기에 설치를 하기 때문에 두 번째 공유기는 dnsmasq 서비스를 사용하지 않습니다. 따라서 53번 포트를 AdGuard Home 이 사용할 수 있도록 dnsmasq 서비스를 중지 시킵니다.



메뉴에서 System >> Startup 을 클릭한 후



dnsmasq 서비스를 찾아서 Stop 시킨 후 Disabled 설정 변경 하여 OpenWrt 공유기 리부트 시 dnsmasq 서비스가 자동으로 시작하지 않도록 합니다.


3. AdGuard Home 설치 하기


위에서 접속한 Putty 터미널 접속을 불러온 후 다음과 같이 명령어를 차례로 입력합니다.


> opkg install curl, wget, libmbedtls12, tar
> cd /mnt
> wget https://static.adguard.com/adguardhome/release/AdGuardHome_linux_armv5.tar.g
> tar -xvf AdGuardHome_linux_armv5.tar.gz


세 번째 wget 명령어의 다운로드 위치 파라미터는 AdGuard Home 사이트에서 자신의 하드웨어/운영체제에 해당하는 파일을 사용해야합니다.

https://github.com/AdguardTeam/AdGuardHome/wiki/Getting-Started#installation



아무런 문제 없이 설치가 끝났으면 터미널 접속에 다음과 같이 AdGuard Home 실행 명령어를 입력하여 AdGuard Home Configuration Wizard 를 실행합니다.

> cd /mnt/AdGuardHome
> ./AdGuardHome

인터넷 브라우저의 주소에 192.168.100.3:3000 을 입력 합니다.



앞서서 dnsmasq 서비스를 강제 종료시켜놨기 때문에 AdGuard Home 이 53 번 포트를 사용할 수 있습니다. Admin Web Interface 는 OpenWrt 의 Luci 사용자 인터페이스와 충돌을 피하기 위해서 8080 번 포트를 사용합니다.



AdGuard Home 관리자의 Username 과 Password 를 설정하면 Configuration Wizard 를 마칩니다.

다음 단계로 OpenWrt 공유기가 새로 시작할 때 마다 AdGuard Home 이 자동으로 실행 될 수 있도록 AdGuard Home 을 OpenWrt 의 Startup 서비스로 등록합니다.

터미널 접속에서는 아직도 AdGuard Home 이 실행되고 있습니다. Control-C 를 눌러서 AdGuard Home을 강제로 종료한 후 다음과 같이 명령어를 입력합니다.

> ./AdguardHome -s install

인터넷 브라우져에서 메뉴의 System >> Startup 을 확인하면 다음과 같이 AdGuardHome 이 서비스로 등록 되어 있는 것을 확인할 수 있습니다.



DNS 블록 리스트 업데이트나 자동 바이너리 업데이트에서 오류가 발생하지 않도록 터미널 접속에 다음 명령을 추가로 입력합니다.

> opkg install ca-bundle, ca-certificates

이제 AdGuard Home의 설치가 끝났습니다.

인터넷 브라우저에 다음과 같이 주소창에 192.168.100.3:8080 을 입력하여 AdGuard Home 대시보드를 시작합니다.




4. 메인 인터넷 공유기에서 DNS 설정 하기


로컬 네트워크에 연결된 모든 장치들이 각각 장치들의 아무런 네트워크 설정 변경 없이도 자동으로 OpenWrt 을 구동하는 두번 째 공유기의 AdGuard Home 을 DNS 서비스로 사용할 수 있도록 메인 공유기의 DNS 설정을 손 봐야 합니다.

처음에는 AdGuard Home 사이트의 메뉴얼에 공유기 설정법에 나온대로 메인 공유기의 설정에서 Gateway = 192.168.100.1, Local DNS = 192.168.100.3, Static DNS 1 = 192.168.100.3 으로 변경한 후 메인 공유기와 두번 째 공유기를 재 시작 합니다.





로컬 네트워크에 연결된 장치들을 재시작 하면 각각의 장치들은 새로 메인 공유기에서 IP 주소를 할당 받으면서 OpenWrt / AdGuard Home 서버가 설치 된 두번 째 공유기의 IP 주소 192.168.100.3 을 DNS 서버 주소로 받아옵니다.

이제 모든게 원하는 대로 동작을 한다고 생각 했었는데 얼마 지나지 않아서 이 방법으로 설정하는 경우 한 가지 문제가 있다는 것을 발견하게 됩니다.

AdGuard Home 의 특화된 기능 중의 하나가 AdGuard Home 서비스를 DNS 서버로 사용하는 로컬 네트워크 연결 된 장치들을 구분하여 각각의 장치마다 다른 설정을 적용(pet host tracking)할 수 있는데 위의 방법으로 설정하면 AdGuard Home 에 접속하는 모든 장치의 IP 주소가 메인 라우터의 IP 주소인 192.168.100.1 로 고정됩니다. 즉 로컬 네트워크에 접속된 각각의 장치들 을 구분할 수 없고 그 결과로 각각의 장치마다 다른 설정을 적용할 수 있는 기능을 사용할 수 없게 됩니다.

경쟁 프로그램인 Pi-Hole 의 FAQ 에서 다음과 같은 방법을 찾아서 적용해 봅니다. "Advertise AdGuard Home's IP address via dnsmasq in the main router (if supported)". 단 이 방법은 메인 공유기에서 dd-wrt, OpenWrt, Tomato 처럼 dnsmasq 옵션을 수정할 수 있는 기능을 제공 하는 경우에만 사용할 수 있습니다.

메인 공유기 dd-wrt 의 IP 주소 192.168.100.1 을 인터넷 브라우저에 입력하고 관리자 계정으로 로그인 후 Services >> Services 메뉴에서 Dnsmasq 의 Additional Dnsmasq Options 에 다음과 같이 dhcp-option=6,192.168.100.3 을 입력한 후 맨 아래에서 Save 한 후 Apply Setting 을 클릭 합니다.

<추가 2020.05.17> OpenDNS / AdGuard Home 서버에 문제가 생겼을 경우, 즉 failover에 대비하여 AdGuard DNS 를 세컨더리 DNS 서버 주소로 지정해줍니다. dhcp-option=6,192.168.100.3,176.103.130.130,176.103.130.131




AdGuard Home 의 IP 주소 192.168.100.3:8080 을 인터넷 브라우저에 입력하고 관리자로 계정으로 로그인 후 Settings >> DNS Settings 메뉴에서 Upstream DNS Servers 에 메인 공유기의 IP 주소 192.168.100.1 을 입력 한 후 바로 아래의 Test upstreams 버튼을 눌러 확인 후 Save 를 클릭하여 저장합니다.





공유기들을 모두 재시작 한 후 AdGuard Home IP 주소 192.168.100.3:8080 을 인터넷 브라우저에 입력하고 관리자 계정으로 로그인 후 데시보드에서 Top clients for the last 24 hours 를 확인 해보면 로컬 네트워크에 접속하여 AdGuard Home 서비스를 DNS Server 로 사용하기 시작한 장비들의 목록을 확인할 수 있으며 각각의 디바이스를 개별적으로 관리할 수 있게 되었음을 알 수 있습니다.


Settings >> Client Settings >> Add Client






5. luci_app_adguardhome (https://github.com/rufengsuixing/luci-app-adguardhome)


AdGuard Home 을 쉽게 관리할 수 있게 해주는 OpenWrt 의 Luci 인터페이스 애드온이 있습니다. 사용해도 되고 안해도 됩니다만 간단하게 설치하는 방법을 알아봅니다.

AdGuard Home 설치되어 있는 OpenWrt 공유기에 터미널 접속을 다시 불러온 후 다음과 같이 명령어를 입력 합니다.

> wget https://github.com/rufengsuixing/luci-app-adguardhome/releases/download/1.8-11/luci-app-adguardhome_1.8-11_all.ipk
> opkg install luci-compat luci-app-adguardhome_1.8-11_all.ipk

 


일단 '/etc/AdGuardHome/AdGuardHome.yaml' 이 없다는 오류 메세지는 무시해도 됩니다.

인터넷 브라우저에 OpenWrt 의 IP 주소 192.168.100.3 입력하고 관리자 로그인 후 Services >> AdGuard Home 을 선택 합니다. Browser management port = 8080, Bin Path = /mnt/AdGuardHome/AdGuardHome, Config Path = /mnt/AdGuardHome/AdGuardHome.yaml, Work dir = /mnt/AdGuardHome 로 설정 변경 합니다.




6. 커스텀 필터링 규칙


실은 이 모든 쓸데없는 작업을 처음 시작한 이유는 광고/피싱사이트 블록이라는 AdGuard Home의 궁극적인 목적 보다도 개인적으로 보기 싫은 사이트들을 블록하는 방법을 찾기 위해서 였습니다. AdGuard for Android 를 휴대폰에 설치하여 사용하면서 로컬 네트워크의 메인 공유기에서 자동으로 DNS 서버 레벨에서 블록 서비스를 해주는 방법을 찾다보니 Pi-Hole을 찾을 수 있었고 AdGuard Home이 개발되기 시작했고 최근에 OpenWrt 에 설치하는 방법을 지원하기 시작했다는 것을 알 수 있었습니다. [HowTo] Running Adguard Home on OpenWrt.

이제 보기 싫은 웹사이트를 AdGuard Home 서버에서 블록 하는 방법을 확인해 봅니다. 메뉴에서 Filters >> Custom filtering rule 을 선택 합니다.



다음과 같은 규칙 문법을 사용할 수 있습니다.



예를 들어 adc.naver.com 이라고 하는 네이버의 광고 주소를 블록하고 싶으면


127.0.0.1 adc.naver.com


라는 규칙을 추가해 주면 됩니다. 우리가 잘 알고 있는 hosts 파일에서 사용하는 규칙을 그대로 사용할 수 있습니다.

다른 예를 들어 www.joins.com, joins.com, jtbc.joins.com 등등 과 같이 joins.com 과 모든 서브 도메인 주소를 블록 하려면 모든 서브 도메인을 일일이 규칙에 추가 해주는 대신에 간단하게


||joins.com^


이라는 규칙을 추가해 주면 됩니다. 그 외에 정규식(regular expression)을 이용한 블록 규칙( 예를 들면 /([a-z0-9]+[.])*joins.com/ )도 사용이 가능합니다.

각설하고 여러 사이트에서 찾아 온, 한국 사이트들 중에서 광고사이트/피싱사이트/기레기신문사/혐오사이트를 블록 할 수 있는 다음과 같은 필터링 규칙 목록을 짜집기해 보았습니다. 아래 블록 사이트 리스트를 복사한 후 붙이기 하시고 필요에 따라서 수정해서 사용 할 수 있습니다.




# block news
||chosun.com^
||donga.com^
||hani.co.kr^
||joins.com^
||khan.co.kr^
||mediawatch.kr^
||mt.co.kr^
||newscj.com^
||ohmynews.com^
# prohibited grounds of discrimination
||megalian.com^
||womad.life^
||ilbe.com^
# news ad site
127.0.0.1 mp.mmnneo.com
127.0.0.1 adc.ohmynews.com
127.0.0.1 ra.ntwoad.co.kr
127.0.0.1 ad.adinc.kr
127.0.0.1 ad2.mediatoday.co.kr
127.0.0.1 rlwvqnd4s.cdn.toastcloud.com
127.0.0.1 cdnprism.pandora.tv
127.0.0.1 nad.cbs.co.kr
||realclick.co.kr^
127.0.0.1 ad2.segye.com
127.0.0.1 nd-adimage.newdaily.co.kr
127.0.0.1 nd-adkpf.newdaily.co.kr
127.0.0.1 ad.cache.newdaily.co.kr
127.0.0.1 mymyad.co.kr
127.0.0.1 cloudfront.net
#jtbc ad
127.0.0.1 mlink-cdn.netinsight.co.kr
127.0.0.1 api.wecandeo.com
127.0.0.1 adgrp1.ad4989.co.kr
# portal naver ad
# 127.0.0.1 ad.naver.com
# 127.0.0.1 adcr.naver.com
||ad.naver.com^
||dn.naver.com^
||nbms.naver.com^
||nmv.naver.com^
||rmcnmv.naver.com^
||veta.naver.com^
127.0.0.1 ad.news.naver.com
127.0.0.1 adc.naver.com
127.0.0.1 adcreative.naver.com
127.0.0.1 castbox.shopping.naver.com
127.0.0.1 ia.www.naver.com
127.0.0.1 l.m.naver.com
127.0.0.1 saedu.naver.com
127.0.0.1 searchad.naver.com
127.0.0.1 syndication.openapi.naver.com
127.0.0.1 wrd.naver.com
# portal daum ad
||ad.daum.net^
||videofarm.daum.net^
||adtc.daum.net^
127.0.0.1 adclix.daum.net
127.0.0.1 adclixad.daum.net
127.0.0.1 alea.adam.daum.net
127.0.0.1 amsv1.daum.net
127.0.0.1 amsv2.daum.net
127.0.0.1 clix.bizshop.daum.net
127.0.0.1 clixad.daum.net
127.0.0.1 daumkakao-smr.smartmediarep.com
127.0.0.1 dawinvad.fms.wecandeo.com
127.0.0.1 dis.jp.as.criteo.com
127.0.0.1 gomtv-smr.smartmediarep.com
127.0.0.1 image.bizshop.daum.net
127.0.0.1 log.inside.daum.net
127.0.0.1 mobile.biz.daum.net
#127.0.0.1 naver-smr.smartmediarep.com
127.0.0.1 smr.tvpot.daum.net
#127.0.0.1 smrmembers-smr.smartmediarep.com
127.0.0.1 tracker.mobile.biz.daum.net
#127.0.0.1 vads-api.daumkakao.com
#127.0.0.1 redcdn.contentsfeed.com
# kakao channel
#127.0.0.1 channel.kakao.com
#127.0.0.1 lg-talk.kakao.com
127.0.0.1 sh-talk.kakao.com
127.0.0.1 apihub.daum.net

끝....

5 comments:

kwwwwon said...

소중한 정보 잘 보았습니다. 안그래도 찾고 있었는데...감사합니다.

butterflow said...

AdGuard Luci 인터페이가 에러ㅣ 나는 경우,

> opkg update
> opkg install luci-compat

We review the software to build your online business said...

Muy buen artículo, sugerí los siguientes dos sitios web similares a este artículo.
VPN软件推荐
and
VPN台灣

GearVPN said...

Are router VPNs safe? It is very important to choose an easy-to-use VPN, and it is recommended to 科学上网

WallVPN said...

Great article, thank you for sharing and also sharing a really great site. 翻墙软件

CBOE Put/Call Ratio