포고플러그, 광고차단 DNS(pi-hole) 설치하기

SBC 2017. 9. 12. 12:11 Posted by juvenile

철지난 포고플러그 V4를 딱히 쓸 곳이 없어서 광고차단용 DNS인 pi-hole을 설치해 보았습니다.

포고플러그의 CPU와 RAM 제한 때문에 성능이 안나오는게 아닐까 싶었는데, 가정용 DNS로는 아주 충분하네요. 먼저 사용 중이던 오드로이드 C2 (ARMv8 1.5Ghz quad core CPU, 2GB DDR3 SDRAM, Gigabit Ethernet, eMMC5.0)에 구축한 pi-hole 대비 DNS 속도는 전혀 느리지 않습니다. Whitelist, Blocklist를 추가할 때 가끔 사용하는 Web-UI의 속도는 차이가 좀 납니다만, 사용 상 전혀 지장이 없습니다.



0. pi-hole

pi-hole은 인터넷 광고 서버의 도메인을 localhost로 연결하여 광고를 아예 받아오지 않도록 만드는 개인용 DNS 서비스입니다.

chrome / firefox용 애드블럭 플러그인의 기능 중 일부에 해당하는데, 애드블럭 플러그인은 광고 서버의 도메인주소 뿐 아니라 html 코드를 분석해서 광고를 차단하는 반면, pi-hole은 도메인 주소만을 이용하기 때문에 다소 기능은 떨어집니다.

그러나 광고 파일을 아예 받아오지 않아서 데이터 사용량이 절감되고, 애드블럭 플러그인을 지원하지 않는 웹브라우저에도 적용된다는 것이 장점입니다. 예를들면 스마트폰용 브라우저에서도 광고가 차단되고 인앱광고도 함께 제거되는 것도 장점이네요. 스마트폰에서는 pi-hole이 아주 제격입니다.

데스크탑의 경우에도 애드블럭 플러그인이 무겁기도 하고 광고를 싸그리 제거하는 것을 그리 좋아하지 않아서, 애드블럭 플러그인에서는 모든 필터를 비황성화한 후 custom 필터에 */ad/* 만 달랑 넣어두고 사용합니다. pi-hole과 조합하면 딱 적당한 것 같습니다.



1. 설치 전 준비

curl은 기본 패키지에 가깝지만 pogoplug용 debian rootfs는 극단적인 경량 버전이라서 빠져있습니다. 아래 명령으로 curl 패키지를 설치해줍니다.

1
sudo apt-get install curl
cs


그리고 curl이 https 프로토콜을 사용하려면 openssl과 ca-certificate가 필요합니다. ca-certificate 패키지가 openssl에 의존적이므로 ca-certificate만 설치해주면 openssl도 함께 설치되네요.

1
sudo apt-get install ca-certificates
cs


마지막으로 ifconfig 또는 ip addr 명령어로 network interface의 이름을 미리 확인해둡니다.

1
2
3
4
5
6
7
8
ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
  inet 192.168.xxx.xxx  netmask 255.255.255.0  broadcast 192.168.xxx.xxx
  - 이하 생략 -
 
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
  inet 127.0.0.1  netmask 255.0.0.0
  - 이하 생략 -
cs

여기서는 eth0 이 바로 network interface name입니다.


이 단계에서 공유기에서 포고플러그에 고정IP를 부여해둡니다. 만약 현재 할당된 IP가 아닌 다른 IP를 할당하고 싶을 경우 공유기 설정을 완료한 후 포고플러그를 재시작하여 IP를 미리 갱신해두면 나중에 편합니다.


2. pi-hole 설치


공식 홈페이지 첫 화면에 나와있는 명령어 한 줄이면 충분합니다.

1
curl -sSL https://install.pi-hole.net | bash
cs


비록 투박하지만 아래처럼 단계별로 안내하면서 설치/초기설정이 진행됩니다.


- 의존성 패키지 설치


- Welcome


- Network Interface 초기화

pi-hole은 서버이기 때문에 고정IP를 사용해야 한다고 합니다. 다음 화면에서 DCHP를 계속 사용할지, 고정IP로 설정할지 선택할 수 있다고 하네요. 제 경우엔 이미 고정IP로 설정되어 있는데도 이런 메시지가 뜨네요.


- 상위 DNS 서버 선택

광고 데이터베이스에 포함되지 않은 도메인을 검색할 상위 DNS를 선택합니다. 구글 DNS를 포함해서 다양한 공개 DNS를 선택할 수 있지만, 저는 속도를 위해서 통신사 DNS를 사용하기 때문에 Custom을 선택했습니다.


- Custom DNS 설정

투박하지요? 콤마로 구분해서 기본 DNS, 보조 DNS의 IP주소를 입력합니다. 아래는 국내 통신사 DNS의 IP주소입니다.

1
2
3
4
5
6
7
8
- SK 브로드밴드
기본 DNS : 210.220.163.82     보조 DNS : 219.250.36.130
 
- KT
기본 DNS : 168.126.63.1       보조 DNS : 168.126.63.2
 
- LG U+
기본 DNS : 164.124.107.9      보조 DNS : 203.248.242.2
cs


- 프로토콜

IPv4와 IPv6의 활성화 여부를 선택할 수 있습니다. 아직은 IPv4는 필수겠지요? IPv6는 현재 과연 의미가 있는지 잘 모르겠습니다만 일단 활성화는 해두었습니다.


- 고정IP 설정

현재 IP를 항상 사용하도록 고정IP로 설정하겠냐는 의미입니다. YES를 선택하면 화면에 표기된 IP를 공유기에 요청하도록 설정됩니다. 공유기에서 고정IP를 할당하고 포고플러그는 DHCP로 설정해도 됩니다만, 그냥 YES 하시지요. 


- IP충돌 주의 안내

공유기에서도 포고플러그에 고정된 IP를 할당하도록(DHCP reservation) 설정하지 않으면 IP충돌이 발생할 수 있다는 친절한 안내입니다. 우리는 사전 준비 단계에서 공유기 설정도 이미 완료했지요.


- Web UI 설치여부 확인

Web UI 설치여부입니다. Web UI 없이도 DNS는 잘 작동하고, SSH 접속해서 모든 조작이 가능합니다만, 처음에는 매우 빈번하게 Web UI를 사용할껍니다. php와 웹서버가 추가로 설치되고, 소중한 램을 잡아먹는 백그라운드 프로세스가 분명히 늘기는 합니다. 그러나 포고플러그를 pi-hole 전용으로 사용할 경우 Web UI를 설치하고도 램이 차고 넘칩니다.


- DNS 조회 이력 로깅

DNS 조회 이력 저장여부를 확인합니다. Web UI의 각종 모니터링 기능을 활용하기 위해서는 로깅을 활성화해야 합니다. pi-hole에 익숙해질 때 까지는 활성화해둡니다. 


- Web UI 구성요소 설치

Web UI 구성요소 설치의 진행율을 나타내는 화면일 뿐 특별한 것은 없습니다.


- 설치 완료

pi-hole을 DNS로 사용할 기기에서 기본 DNS 주소로 192.168.0.26을 입력하라고 하네요. 물론 192.168.0.26은 제 포고플러그의 ip주소일 뿐 절대적인 것이 아닙니다. IPv6는 설정이 안되었네요. 실은 제가 공유기에서 IPv6를 설정할줄 모릅니다. :)

pi-hole의 Web UI는 웹브라우저에서 http://pi.hole/admin 또는 http://ip주소/admin 으로 접속할 수 있으며, 임의의 암호가 부여됩니다. 위 스샷에 검은색으로 반전시킨 부분이 암호입니다. 다음 단계에서 바로 암호를 변경할 것이기 때문에 신경쓰실 필요 없습니다.


- Web UI 암호 변경

아래 명령어로 Web UI 암호를 변경할 수 있습니다.

1
sudo pihole --p 새암호
cs

만약 암호에 특수문자가 들어간다면 따옴표로 묶어서 입력하면 됩니다.

1
sudo pihole --"새암호"
cs


명령어를 외우고 있을 필요는 없고, Web UI 로그인 창에서 Forgot password 옆의 + 를 클릭하면 아래처럼 암호 변경 명령어를 보여줍니다. 아래 스크린샷은 + 버튼을 이미 눌러서 -로 바뀌어 있네요.


- 한국형 Block Lists 추가

Block List는 광고 서버의 도메인명이 정리되어 있는 리스트를 말합니다. 도메인 하나하나를 개인적으로 추가(Blacklist)할 수도 있으나, 고마운 분이 이미 Block List를 공개해주셨습니다. 감사히 가져다 써야지요.

Web UI에 로긴한 후 settings 탭으로 이동하여 Pi-Hole's Block Lists의 + 버튼을 눌러 Block Lists 섹션을 확장합니다. https://godpeople.or.kr/hosts.txt를 입력한 후 Save and Update 버튼을 눌러주면 됩니다.

위 스크린샷의 나머지 Block Lists는 모두 기본 설정에 들어있는 것이며 따로 추가해주지 않아도 됩니다.

참고로 컨텐츠 필터링 방식의 ad-block, ublock 용의 필터 목록은 호환되지 않으며, 오로지 도메인 필터 목록만 사용할 수 있다. (대개 hosts 파일 대체용으로 공유됩니다)



3. 공유기 설정

이제 pi-hole 설치와 설정을 마쳤으니 공유기에서 기본 DNS로 pi-hole을 사용하도록 설정해줄 차례입니다. PC, 스마트폰에서 각각 DNS 설정을 변경하는 것도 가능하지만 저는 공유기에서 한방에 설정해주었습니다.

공유기의 DNS를 pi-hole 서버(포고플러그)로 지정하면, 공유기에 연결된 모든 기기가 설정을 상속해가기 때문입니다. 단, 웹서핑을 할 일이 없는 NAS 등에서는 공유기 설정을 받아가지 않고 통신사 DNS로 수동 지정해주었습니다. NAS의 경우 실익도 없이 pi-hole에 log만 쌓이거든요.

공유기 브랜드 별로 설정 방법이 다를테지만, DHCP 설정 부분을 유심히 살펴보시면 될 것 같네요. 아래는 제가 사용하는 TP-Link의 셋팅입니다.

DHCP Settings 메뉴의서 Primary DNS를 pi-hole 서버(포고플러그) 주소로 변경했습니다. Secondary DNS는 pi-hole에 문제가 생겼을 때를 대비해서 통신사의 기본 DNS 주소를 입력해주었습니다.

상기 예시의 모든 IP 주소는 예시일 뿐 그대로 따라 쓰시면 안됩니다. :)



4. Web UI 간략 소개

갈수록 접속 빈도가 떨어지기는 합니다만, pi-hole을 처음 셋팅하고 나면 신기해서, 재미나서, 무언가 잘 안되서 자주 접속하게 마련인 Web UI의 기능에 대한 간략한 설명입니다.


- 대쉬보드

대쉬보드는 Web UI 접속 시 기본 화면으로 지난 24시간 동안 pi-hole의 동작 상태를 알려줍니다. 로그인을 하지 않으면 아래 처럼 간략한 정보면 표출됩니다.

상단 네모 박스의 숫자는 순서대로 지난 24시간 동안의 차단건수, DNS 조회건수, 차단 비율과 Block Lists에 등록된 도메인 개수를 의미합니다. 총 3676건의 DNS 조회를 했고, 그 중 19.5%인 716건이 차단되었네요. 그래프는 시간대별 조회 / 차단 건수를 의미합니다.


접속 / 차단한 도메인 목록 등 조금 더 민감한 정보는 로그인을 해야 표시가 됩니다.

위에서 부터 순서대로 시간대별 "조회 / 차단 건수", "프로토콜(IPv4 vs IPv6) 비율", "DNS 포워딩 지점"을 의미합니다.

마지막 그래프 "DNS 포워딩 지점"은 DNS 조회 요청에 대하여 어떤 DNS를 통해서 ip를 반환했는지를 나타내는 것으로 빨간색이 기본 DNS, 파란색이 보조 DNS를 통해서 ip를 반환해주었다는 뜻입니다. 초록색은 Local인데, pi-hole 자체적으로 DNS Cache를 통해서 ip를 반환한 비율입니다.

DNS Cache 유지 시간이 얼마나 되는지는 모르겠습니다만, 웹 응답속도 향상에 조금이나마 도움이 됩니다. 위 그래프에서는 평균 30~40%의 DNS 조회 요청이 DNS Cache로 처리되었네요.


추가로 접속 빈도가 가장 높은 도메인과 차단 빈도가 높은 도메인, 가장 빈번하게 DNS를 조회한 클라이언트를 각각 10개씩 알려줍니다.

아래 리스트는 완전 초기 상태에서 네이버 메인 페이지를 딱 1회 접속했을 때 발생한 조회/차단 결과입니다. 그 짧은 순간 파이어폭스 동기화랑 안랩 업데이트가 끼어들었네요. :)


- 화이트리스트

Block Lists에 포함되어 있지만 접속을 허용하고 싶은 도메인을 추가하는 기능입니다. 예를들어 godpeople.or.kr의 블록 리스트에는 각종 신문사 도메인이 포함되어 있는데, 특정 신문사 홈페이지 접속을 허용하고 싶을 때 사용합니다.

좌측 메뉴에서 whitelist를 선택한 후 허용하고 싶은 도메인을 추가해주면 됩니다. 참고로 블록 리스트를 제공하는 도메인은 자동으로 화이트리스트에 추가됩니다.


- 블랙리스트

차단 도메인 목록을 의미하는 블록 리스트와는 다릅니다. 블록 리스트는 웹 상에서 공개 서비스되는 차단 도메인 목록을 말하고, 블랙리스트는 사용자가 관리하는 리스트를 말합니다.

화이트리스트와는 달리 exact와 wildcard 두가지 방식이 존재하는데, exact는 특정 서브도메인만 차단할 때 사용합니다. wildcard는 모든 서브도메인을 통채로 차단합니다.

상기 예시는 example1.com의 경우 example1.com으로 끝나는 모든 서브도메인을 통채로 차단하고, example2.com의 경우 sub1.example2.com과 sub2.example2.com만을 차단하도록 설정한 것입니다. sub3.example2.com은 차단되지 않습니다.


- Disable (비활성화)

pi-hole의 차단 기능을 정지시킬 때 사용합니다.

메뉴에 표출된 순서대로 영구, 10초, 30초, 5분, 사용자 정의 시간 입니다. 저는 이하넥스 배송대행 싸이트에서 pi-hole을 사용하면 배송대행 신청이 안되더라구요. 이럴 때 5분 비활성화 기능을 사용하곤합니다. 윈도우즈 자체 DNS cache 때문인지 10초는 정지로는 차단된 싸이트에 접속할 수 없는 경우가 많아서 10초는 잘 사용하지 않습니다.



5. 시스템 부하

pi-hole은 DNS 조회(중계)/차단만 하기 때문에 정말 가볍습니다. 미천한 CPU/RAM을 가진 포고플러그 V4에서도 쌩쌩 날아갑니다.

설치 후 메모리 사용량
1
2
3
4
free -m
          total    used    free    shared  buff/cache  available
Mem:        114      36       2        10          76         63
Swap:         0       0       0
cs

설치 전에는 used 메모리가 얼마였는지 정확히 기억이 안납니다만, 포고플러그용 debian rootfs 기본 설정에다가 pi-hole만 달랑 추가한 상태입니다.

CPU 부하는 Web UI에서도 확인할 수 있는데, 항상 놀고있습니다. :)



6. pihole-FTL이 활성화되지 않는 문제 해결

언젠가 pi-hole을 업데이트하면 더 이상 작동하지 않는 문제가 있습니다. DNS server와 FTL이 활성화되지 않는 문제이며, Pogoplug의 CPU용 FTL 실행파일을 더 이상 배포하지 않기 때문입니다. 

알아보니 FTL 소스를 받아서 직접 컴파일하면 된하고 하며, 그리 어렵지 않네요. 다행입니다. 아래 링크의 절차를 따라서 명령어 몇 개만 입력해주면 됩니다.

https://docs.pi-hole.net/ftldns/compile/ 


7. 부팅 디스크 보호 (선택사항) - 로그 파일을 램디스크(tmpfs)에 생성하기

저는 부팅 디스크(SD카드, USB 메모리) 보호를 위하여 fstab에서 /var/log, /var/run을 tmpfs에 마운트했습니다. 그런데 tmpfs는 재부팅 시 초기화 되는데, 이 때문에 pi-hole WebUI가 제대로 동작하지 않습니다.

웹서버인 lighttpd와 로그파일을 읽어서 WebUI로 전달해주는 pihole-FTL이 /var/log, /var/run 디렉토리에 위치하는 특정 파일과 디렉토리가 없다고 실행을 거부하기 때문입니다. 서비스가 실행될 때 필요한 파일과 디렉토리를 생성하도록 아래와 같이 설정해주어야 합니다.

저는 lighttpd와 pihole-FTL 서비스 실행 스크립트를 수정했는데, 업데이트 때 마다 좀 귀찮겠네요. 부팅 순서에 따라 lighttpd와 pihole-FTL이 실행되기 전에 먼저 실행되는 스크립트를 하나 만드는 것이 좋겠으나, 부팅 순서가 어떻게 결정되는지에 대해 전혀 몰라서 아직은 어쩔수가 없네요.


우선 lighttpd 서비스 스크립트를 편집기로 열어서 빨간색 세 줄을 추가해줍니다.

수정: /lib/systemd/system/lighttpd.service

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[Unit]
Description=Lighttpd Daemon
After=network.target
 
[Service]
Type=simple
ExecStartPre=-/bin/mkdir -p /var/log/lighttpd /var/run/lighttpd
ExecStartPre=-/bin/chown www-data:www-data /var/log/lighttpd /var/run/lighttpd
ExecStartPre=-/bin/chmod 755 /var/log/lighttpd /var/run/lighttpd
ExecStartPre=/usr/sbin/lighttpd -tt -f /etc/lighttpd/lighttpd.conf
ExecStart=/usr/sbin/lighttpd -D -f /etc/lighttpd/lighttpd.conf
Restart=on-failure
 
[Install]
WantedBy=multi-user.target
cs

특별한 내용은 없고, /var/log와 /var/run 디렉토리 아래에 lighttpd 디렉토리를 만들고, 소유자/그룹을 www-data:www-data로, 접근권한을 755로 설정해주는 것이 전부입니다.


pihole-FTL 서비스 스크립트 역시 아래 빨간 내용을 추가해줍니다.

수정: /etc/init.d/pihole-FTL

1
2
3
4
5
6
7
8
9
10
11
12
# Start the service
start() {
  if is_running; then
    echo "pihole-FTL is already running"
  else
    touch /var/log/pihole.log /var/log/pihole-FTL.log /run/pihole-FTL.pid /run/pihole-FTL.port
    chown dnsmasq:pihole /var/log/pihole.log
    chown pihole:pihole /var/log/pihole-FTL.log /run/pihole-FTL.pid /run/pihole-FTL.port /etc/pihole
    chmod 0644 /var/log/pihole.log /var/log/pihole-FTL.log /run/pihole-FTL.pid /run/pihole-FTL.port
    su -/bin/sh -"/usr/bin/pihole-FTL" "$FTLUSER"
    echo
  fi
cs

/var/log 디렉토리에 pihole.log 파일을 생성한 후, 소유자/그룹을 dnsmasq:pihole로, 접근 권한을 644로 설정하는 내용입니다.


변경된 서비스 스크립트를 갱신한 후 lighttpd, pihole-FTL 서비스 재실행합니다.

1
2
3
systemctl daemon-reload
systemctl stop pihole-FTL lighttpd
systemctl start pihole-FTL lighttpd
cs