Пошаговая инструкция по настройке Wireguard VPN + DNSCrypt + DNS server (Unbound) + Pihole

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Давно была идея сделать свой VPN сервер, для того чтобы "ходить" на ресурсы типа Linkedin. Со временем подумал, что неплохо было бы сделать еще и блокировку рекламы, а потом и DNS сервер. Простых инструкций в интернете я не нашел, поэтому со временем написал ее для себя. Возможно кому-то еще поможет.

Оглавление:

  1. Подготовка системы

  2. Установка Wireguard

  3. Установка DNS-proxy

  4. Установка Pihole

  5. Установка Unbound

  6. Проверка и итоги

Суть задачи в том, чтобы сделать свой VPN и DNS сервер с шифрованным трафиком DNS и блокировкой рекламы через Pihole.

В качестве VPN сервера был выбран Wireguard, а DNS сервера - Unbound. По моему мнению, они одни из самых простых в настройке.

Для начала арендуем какой-нибудь VPS сервер, с хостингом за границей (к примеру https://fornex.com/).Достаточно сервера с 1 ядром, 2 Гигами оперативки и 15 Гб SSD диска. Я выбирал операционку Debian 11 без графической оболочки.

1. Первым делом меняем список репозиториев, на дефолтные для Debian 11.

nano /etc/apt/sources.list

Удаляем там все и вставляем эти строки:

deb http://ftp.debian.org/debian bullseye main contrib non-free deb-src http://ftp.debian.org/debian bullseye main contrib non-free

deb http://ftp.debian.org/debian bullseye-updates main contrib non-free deb-src http://ftp.debian.org/debian bullseye-updates main contrib non-free

deb http://security.debian.org/debian-security/ bullseye-security main deb-src http://security.debian.org/debian-security/ bullseye-security main deb http://ftp.debian.org/debian bullseye-backports main contrib non-free

Если у вас Ubuntu 20.04, то вот список репозиториев:

deb http://archive.ubuntu.com/ubuntu/ focal main restricted universe multiversedeb-src http://archive.ubuntu.com/ubuntu/ focal main restricted universe multiversedeb

http://archive.ubuntu.com/ubuntu/ focal-updates main restricted universe multiversedeb-src http://archive.ubuntu.com/ubuntu/ focal-updates main restricted universe multiversedeb

http://archive.ubuntu.com/ubuntu/ focal-security main restricted universe multiversedeb-src http://archive.ubuntu.com/ubuntu/ focal-security main restricted universe multiversedeb

http://archive.ubuntu.com/ubuntu/ focal-backports main restricted universe multiversedeb-src http://archive.ubuntu.com/ubuntu/ focal-backports main restricted universe multiversedeb http://archive.canonical.com/ubuntu focal partnerdeb-src http://archive.canonical.com/ubuntu focal partner

Далее обновляем систему:

apt update -y

apt upgrade -y

Если система не обновляется, то проблема возможно в файле /etc/resolv.conf

Нужно добавить там строку nameserver 8.8.8.8.

2. Ставим сначала VPN сервер. По моему опыту, самый быстрый и простой в настройке VPN сервер - это Wirguard. Для простоты и скорости, качаем скрипт:

curl -O https://raw.githubusercontent.com/angristan/wireguard-install/master/wireguard-install.sh

Если нет curl, то ставим командой apt install curl

Даем права:

chmod +x wireguard-install.sh

Запускаем:

./wireguard-install.sh

Дальше все время нажимаем Enter и придумываем название для клиента. В конце будет QR код для настройки VPN с клиента на телефоне. Клиент на телефонах, к слову, так и называется - Wireguard. При повторном запуске скрипта создается второй клиент VPN. По умолчанию он сохраняется в корневую директорию и имеет формат .conf.

Проверяем работоспособность VPN сервера, перейдя на 2ip.ru. IP адрес на сайте 2ip должен совпадать с белым адресом нашего VPS сервера.

Для шифрования DNS трафика установим службу DNS-proxy.

Для работы службы шифрования DNS-proxy необходимо установить язык go (минимум версии 1.15):

sudo apt install wget software-properties-common apt-transport-https
wget https://golang.org/dl/go1.17.linux-amd64.tar.gz
sudo tar -zxvf go1.17.linux-amd64.tar.gz -C /usr/local/
echo "export PATH=/usr/local/go/bin:${PATH}" | sudo tee /etc/profile.d/go.sh
source /etc/profile.d/go.sh
echo "export PATH=/usr/local/go/bin:${PATH}" | sudo tee -a $HOME/.profile source
source $HOME/.profile
echo $PATH

Если в конце такой вывод с версией языка, значит все верно.

3. Далее качаем файлы для установки DNS-proxy:

git clone https://github.com/AdguardTeam/dnsproxy.git

если в системе нет утилиты git, то устанавливаем ее командой sudo apt install git

и компилируем программу:

cd dnsproxy

go build -mod=vendor

Можно выбрать различные варианты протоколов шифрования трафика, например DNS-over-TLS, DNS-over-QUIC, DNS-over-HTTPS и другие. Я выбрал DNS-over-HTTPS, т.к. этот вид шифрования не виден для провайдера.

Запуск службы:

./dnsproxy -u sdns://AgcAAAAAAAAABzEuMC4wLjGgENk8mGSlIfMGXMOlIlCcKvq7AVgcrZxtjon911-ep0cg63Ul-I8NlFj4GplQGb_TTLiczclX57DvMV8Q-JdjgRgSZG5zLmNsb3VkZmxhcmUuY29tCi9kbnMtcXVlcnk

Этот ключ берется с инструкции проекта dnsproxy на github.com https://github.com/AdguardTeam/dnsproxy при желании можно указать другие виды шифрования, примеры указаны там же.

Затем правила для рекурсивного DNS:

sudo iptables -A INPUT -s 10.20.20.0/24 -p tcp -m tcp --dport 53 -m conntrack --ctstate NEW -j ACCEPT 

sudo iptables -A INPUT -s 10.20.20.0/24 -p udp -m udp --dport 53 -m conntrack --ctstate NEW -j ACCEPT

Виртуальные ip адреса 10.20.20.0/24 меняем, на адрес вашей подсети Wirguard.

Чтобы сохранить маршруты ставим и настраиваем iptables-persistent

sudo apt-get install iptables-persistent

echo iptables-persistent iptables-persistent/autosave_v4 boolean true | sudo debconf-set-selections
echo iptables-persistent iptables-persistent/autosave_v6 boolean true | sudo debconf-set-selections
sudo apt install iptables-persistent -y
sudo systemctl enable netfilter-persistent
sudo netfilter-persistent save

4. Ставим Pihole для блокировки рекламы.

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

После запуска скрипта выбираем виртуальный интерфейс нашего wireguard - wg0. Далее жмем Enter и в конце сохраняем пароль для веб интерфейса программы.

5. Переходим к установке и настройке своего DNS сервера.

Установим Unbound DNS:

sudo apt install unbound unbound-host -y
Скопируем DNS записи:
curl -o /var/lib/unbound/root.hints https://www.internic.net/domain/named.cache

Создаем конфиг /etc/unbound/unbound.conf.d/pi-hole.conf

nano /etc/unbound/unbound.conf.d/pi-hole.conf

Туда копируем эту конфигурацию:

server:
     # if no logfile is specified, syslog is used
     # logfile: "/var/log/unbound/unbound.log"
     verbosity: 1
     port: 5353

     do-ip4: yes
     do-udp: yes
     do-tcp: yes

     # may be set to yes if you have IPv6 connectivity
     do-ip6: no

     # use this only when you downloaded the list of primary root servers
     root-hints: "/var/lib/unbound/root.hints"

     # respond to DNS requests on all interfaces
     interface: 0.0.0.0
     max-udp-size: 3072

     # IPs authorised to access the DNS Server
     access-control: 0.0.0.0/0                 refuse
     access-control: 127.0.0.1                 allow
     access-control: 10.20.20.0/24             allow

     # hide DNS Server info
     hide-identity: yes
     hide-version: yes

     # limit DNS fraud and use DNSSEC
     harden-glue: yes
     harden-dnssec-stripped: yes
     harden-referral-path: yes

     # add an unwanted reply threshold to clean the cache and avoid, when possible, DNS poisoning
     unwanted-reply-threshold: 10000000

     # have the validator print validation failures to the log val-log-level: 1
     # don't use Capitalisation randomisation as it known to cause DNSSEC issues sometimes
     # see https://discourse.pi-hole.net/t/unbound-stubby-or-dnscrypt-proxy/9378 for further details
     use-caps-for-id: no

     # reduce EDNS reassembly buffer size
     # suggested by the unbound man page to reduce fragmentation reassembly problems
     edns-buffer-size: 1472

     # TTL bounds for cache
     cache-min-ttl: 3600
     cache-max-ttl: 86400

     # perform prefetching of close to expired message cache entries
     # this only applies to domains that have been frequently queried
     prefetch: yes
     prefetch-key: yes
     # one thread should be sufficient, can be increased on beefy machines
     num-threads: 1
     # ensure kernel buffer is large enough to not lose messages in traffic spikes
     so-rcvbuf: 1m

     # ensure privacy of local IP ranges
     private-address: 192.168.0.0/16
     private-address: 169.254.0.0/16
     private-address: 172.16.0.0/12
     private-address: 10.0.0.0/8
     private-address: fd00::/8
     private-address: fe80::/10

Виртуальный адрес access-control: 10.20.20.0/24 меняем на адрес своей подсети!

Ребутим сервер командой reboot и проверяем работу DNS сервера командами:

dig pi-hole.net @127.0.0.1 -p 5353

dig sigfail.verteiltesysteme.net @127.0.0.1 -p 5353

dig sigok.verteiltesysteme.net @127.0.0.1 -p 5353

В первом и третьем случае должен выдаваться статус NOERROR, во втором SERFAIL. Если выводы такие - то все супер.

Далее в браузере открываем веб интерфейс Pihole. Адрес будет такой же, как и адрес VPS сервера и /admin (пример http://185.18.55.137/admin). Переходим на вкладку настроек и делаем как на картинке:

Внизу еще можно поставить галочку Use DNSSEC и сохранить.

Ну и хорошо бы закрыть веб интерфейс Pihole чтобы его не брутили. Оставим доступ только из внутренней подсети:

iptables -A INPUT -s 10.55.55.0/24 -p tcp --dport 80 -j ACCEPT

iptables -A INPUT -p tcp --dport 80 -j DROP

Также не забывает тут подставить свою виртуальную сеть вместо 10.55.55.0/24.

6. Чтобы протестировать все настраиваемые сервисы, переходим по ссылкам:

Тест на утечку DNS трафика https://dnsleak.com/

и https://www.dnsleaktest.com/ тут адрес DNS сервера должен совпадать с белым IP адресом нашего VPS сервера.

P.S.

Для большей эффективности Pihole, можно добавить дополнительные источники с адресами для фильтрации мусорного трафика. Я добавлял эти:

http://sysctl.org/cameleon/hosts

https://s3.amazonaws.com/lists.disconnect.me/simple_tracking.txt

https://s3.amazonaws.com/lists.disconnect.me/simple_ad.txt

https://easylist-downloads.adblockplus.org/easyprivacy.txt

https://easylist-downloads.adblockplus.org/easylist.txt

http://www.fanboy.co.nz/adblock/opera/urlfilter.ini

http://www.fanboy.co.nz/adblock/fanboy-tracking.txt

http://phishing.mailscanner.info/phishing.bad.sites.conf

https://zeltser.com/malicious-ip-blocklists/

Дополнительные списки можно скачать от сюда https://firebog.net/

Добавляется через веб интерфейс.

По итогу мы имеем свой VPN сервер за границей, соответственно и возможность посещать желаемые ресурсы, свой DNS сервер, с шифрованием трафика, а также блокировщик рекламы, что является приятным дополнением. Эффективность блокировки конечно не 100%, но почти вдвое больше чем изначально. Реклама блокируется не только в браузере, но и в приложениях телефона (например Avito).

ДО и ПОСЛЕ

Источник: https://habr.com/ru/post/594877/


Интересные статьи

Интересные статьи

Основная претензия при работе с serverless — время холодного старта, которым нельзя управлять «из коробки». Если функция стартует впервые за последние 5–25 минут, скорее всего запуск будет долгим — со...
Нередко при работе с Bitrix24 REST API возникает необходимость быстро получить содержимое определенных полей всех элементов какого-то списка (например, лидов). Традиционн...
Давайте на минуту отбросим все предубеждения и стереотипы об отечественной медицине и попробуем объективно разобраться в том, что сделано правильно, а что неправильно с "первой в мир...
В преддверии старта курса «MS SQL Server Developer» подготовили для вас еще один полезный перевод. Графовые базы данных — это важная технология для специалистов по базам данных. ...
В 1С Битрикс есть специальные сущности под названием “Информационные блоки, сокращенно (инфоблоки)“, я думаю каждый с ними знаком, но не каждый понимает, что это такое и для чего они нужны