1. pi-hole 설치

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

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

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

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

설치 방법은 아래 별도 글로 정리했습니다. 포고플러그라는 초초 저성능 NAS에 debian을 깔아서 설치했는데, 일반 컴퓨터용 debian에서도 설치/설정 방법이 완전히 동일합니다.

- 광고차단 DNS(pi-hole) 설치하기: http://blog.muka.kr/100


2. OpenVPN 설치 및 방화벽 설정


OpenVPN 설치는 나처럼 네트웍 지식이 미천한 사람에게는 상당히 곤란한 작업이었는데, 아래 글이 큰 도움이 되었다.

- 해외 VPS(리눅스)에 OpenVPN 설정 (+방화벽 설정) 하기

- How To Set Up an OpenVPN Server on Ubuntu 16.04

우분투 방화벽(UFW) 설정


두 참고글의 내용이 거의 일치하니 첫 글을 보고 따라하다가 막히는 경우에 둘째 글을 보면 좋을 것 같다. 가장 마지막 단계인 클라이언트용 프로파일 (접속설정+키)을 만드는 것은 둘째 글이 좀 더 편리하다. 마지막으로 둘째 글은 방화벽 설정을 ufw라는 iptables front-end를 사용하는데, 설치할 필요는 없다.

세상에 널린 참고자료는 죄다 iptables를 직접 만들어주는 것인데, 간단하기는 하지만 ufw 사용법을 공부하는 것도 일이더라. 일단은 ufw 설정 방법은 링크의 멋진 글로 알아볼 수는 있었다만 아직은 자신이 없다.


- vpn을 통해 인터넷이 연결 되느냐는 문제는 실상 OpenVPN과 iptables가 결정하는 것은 아니고, server os가 해주는 ip forwarding 이더라. net.ipv4.ip_forward=1 을 잘 챙기자.
iptables 옵션은 아래 한 줄만 우선 추가하는 것이 일단은 편하다.

sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE


- 일단은 pi-hole과 연동을 생각하지 말고, OpenVPN을 통해 인터넷이 되고, local network에 접속이 가능한 상태(예를들면 pi-hole web ui) 까지만 만드는 것을 목표로 하자.


3. local / vpn ip 모두 pi-hole dns 사용

처음 시작할 때 검색했던 글들은 local network용 pi-hole 단독 구축이나, OpenVPN 전용의 pi-hole을 설정하는 내용들만 있었다. pi-hole을 local서도 쓰고, vpn 통해서도 쓰는 방법을 백방으로 검색했는데, 허탈하게도 pi-hole 공식 git hub에 떠억 하니 써있다. 정석대로 차근차근 알아가려 하지 않고, 검색으로 한방이나 노린게 좀 창피했다.


- 참고1: pi-hole 깃헙: OpenVPN server: Dual operation: LAN & VPN at the same time

- 참고2: 클리앙: 해외 VPS(리눅스)에 OpenVPN 설정 (+방화벽 설정) 하기


vpn에서 pi-hole DNS에 접속하기 위한 핵심은 아래 두 줄이다.

/etc/openvpn/server.conf 설정

push "route 192.168.0.0 255.255.255.0"

push "dhcp-option DNS 192.168.0.41" # pi-hole의 로컬 ip

192.168.0.x 의 ip에 대해서는 vpn server의 local network로 접근하도록 route를 열어주고, DNS server는 pi-hole의 local ip로 지정하는 것이다.

보조 DNS를 하나 더 추가해주는 것이 일반적인데, 내 경우엔 vpn은 pi-hole을 쓰기 위한 보조적 수단이므로, pi-hole이 제대로 동작하지 않을 경우 그냥 vpn이 내려준 보조 DNS에 의존하기 보다 그냥 접속을 끊는 것이 합리적이다. 따라서 DNS는 pi-hole 하나만 적었다.


한편, 내부 네트워크로 라우트 시켜주지 않고, DNS 서버를 VPN ip로 적어도 상관이 없다. 기본 설정을 그대로 유지했을 경우 10.8.0.1에 해당한다. 즉, 아래 한줄의 설정으로도 VPN을 통해서 pi-hole DNS를 사용할 수 있다.

 /etc/openvpn/server.conf 설정

push "dhcp-option DNS 10.8.0.1" # pi-hole의 VPN ip


단, 내 경우엔 pi-hole DNS 이외에도 local network 상의 host에 접속할 일이 있기 때문에 192.168.0.0에 대해서 route를 열어주고 pi-hole의 local ip를 DNS 주소로 지정했다.


여기까지가 pi-hole 공홈의 이야기인데, 실상은 DNS에 접속이 안되어 인터넷이 안된다.

실은 pi-hole의 DNS가 eth0에만 응답하도록 설정되어 있기 때문인데, 아래와 같이 webui에서 모든 interface에 반응하게 설정하면 된다.


web ui 로그인 - settings - Advanced DNS settings - Interface listening behavior에서 Listen on all interfaces 선택


4. DNS 쿼리만 VPN 서버를 통하도록 설정하기 (실제 인터넷은 서버를 거치지 않고 직접 접속)

아래와 같이 OpenVPN 설정 변경 후 서버 재시작 (클라이언트 키/프로파일을 다시 만들 필요 없음)

/etc/openvpn/server.conf 설정 변경

;push "redirect-gateway def1 bypass-dhcp"  # 세미콜론(;)으로 주석 처리

push "route 192.168.0.0 255.255.255.0"       # local network로 route (아까 했음)


VPN서버로 gateway를 지정해주지 않으면(첫째 줄), route로 지정하지 않은 ip는 client의 인터넷 회선으로 직접 접속한다. 따라서 pi-hole DNS에 접속하기 위해서는 local network를 통째로 route해주거나, pi-hole의 local ip 주소를 딱 찍어서 route 해주어야 한다.



5. 방화벽 설정: iptables

참고1. Iptables example block all except specified

참고2. pi-hole 깃헙: OpenVPN server: Firewall configuration (using iptables)



6. 최적의 상위 DNS 찾기

http://macnews.tistory.com/4242

결과는.. 그냥 통신사 기본 DNS가 속도갑인듯 ^^;




'홈서버 (리눅스) > VPN,프록시' 카테고리의 다른 글

Wireguard를 이용한 중계서버 구축  (0) 2020.06.26