Давно была идея сделать свой 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 сервер - это Wireguard. Для простоты и скорости, качаем скрипт:

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).

ДО и ПОСЛЕ

Комментарии (25)



  1. GH0st3rs
    11.12.2021 14:00
    +3

    1. Код желательно оформлять

    2. В статье описана куча бесполезных действий:
      2.1 Смысла в dnsproxy судя из статьи никакого, Unbound может всё тоже самое, читайте ман.

      2.2 Зачем в /etc/resolv.conf выставлять Google DNS, потом руками править iptables, если есть resolvconf утилита и unbound?


    1. nelidinav Автор
      12.12.2021 06:24

      В статье описана куча бесполезных действий: 2.1 Смысла в dnsproxy судя из статьи никакого, Unbound может всё тоже самое, читайте ман.

      Можно ссылку? Ничего подобного не находил.



  1. toxella
    11.12.2021 14:28

    Я бы присмотрелся еще в сторону powerDNS


  1. happy-cat
    11.12.2021 15:35

    Не получается законектится Wireguard VPN на Oracle free server

    Поставил и не могу достучаться до моего впн, там такая тухлая настройка входящего траффика и открытия портов.... Хз, может я что не так делаю.. Их 2-х машин нигде Wireguard не завелся (вернее все прекрасно поставилось но нет коннекта из инета до впн)


    1. bankinobi
      11.12.2021 16:16
      +1

      Когда поднимал на oracle cloud впн и сталкнулся с такой же проблемой, то помогла эта репа https://github.com/chadgeary/cloudblock


    1. xsash
      11.12.2021 22:15

      Завелся со второй инсталляции на оракле. Да, файервол замудренный чутка


    1. SignFinder
      11.12.2021 22:33

      Нужно в вебинтерфейсе создать NSG, привязать ее к VM и там создать правило, открывающее порт. Затем уже открыть порт в файрволе ОС.


    1. dartraiden
      11.12.2021 23:39
      +1

      У Oracle ваша виртуалка стоит как бы за аппаратным файерволлом. Схематично: интернет — файерволл Oracle — виртуалка со своим файерволлом

      поэтому, как выше заметили, порты нужно открывать дважды: сперва на самой виртуалке (firewall-cmd, iptables и т.п.), затем в Networking → Virtual Cloud Networks → [VCN name] → Security Lists → Default Security List for [VCN name] → Ingress Rules.

      Да, это кровавый энтерпрайз, придётся привыкать. Это вы ещё не пробовали включить поддержку IPv6. А высший пилотаж — прикрутить 2FA, у меня всё руки не доходят где-то описать, там вообще без поллитры хрен разберёшься.


  1. sunbeam
    11.12.2021 21:59

    По моему опыту, самый быстрый и простой в настройке VPN сервер - это Wirguard.

    Описка в названии.


    1. nelidinav Автор
      12.12.2021 06:15

      Благодарю, исправил


  1. SignFinder
    11.12.2021 22:36

    Для меня было достаточно в качестве secure DNS и блокировки рекламы развернуть AdGuard Home. Разворачивается быстро - docker, snap, настраивается через web интерфейс, фильтры блокировки уже в коробке.


  1. Alangasarus
    12.12.2021 06:15

    Есть вопрос по хостингу Форнекс - там прямым текстом написано что запрещено на ВПС поднимать ВПН. Цитата: "Запрещено размещение: сканеров, сервисов проверки прокси, прокси, OpenVPN и других VPN серверов, torrent-трекеров и torrent-клиентов, вредоносного ПО, IRC серверов, фишинга, а также любого контента, нарушающего законодательства ЕС".

    Это типа формальность и можно не обращать внимания?


    1. nelidinav Автор
      12.12.2021 06:18

      Раньше такого вроде не было, или я не обращал внимание. Техпод сервиса знает что вертится на их ВПС, значит видимо не так строго) Или имеются в виду публичные сервисы, а я делал только для себя. Если что есть альтернативы, типа https://www.digitalocean.com/


  1. yvikt
    12.12.2021 06:18

    После того как я написал свой скрипт по развертыванию OpenVPN сервера в один клик, я понял что хорошо было бы если помимо туториала был альтернативный путь для быстрого решения вопроса - скачал -> запустил -> работает )


    1. nelidinav Автор
      12.12.2021 06:19

      Соглашусь)


  1. Jolt
    12.12.2021 12:59
    +2

    мне кажется куда проще разворачивать это все хозяйство в docker :)


  1. happy-cat
    12.12.2021 16:20
    +1

    Таки получилось запустить Wireguard на оракловском сервере :)
    Спасибо юзеру CyberTm за совет!
    а надо сделать:
    1.
    Открыть в веб панели номер порта в режиме UDP
    2.
    Выполнить команду sudo iptables -F (по словам @CyberTm - И так при каждой перезагрузке или обновлении)
    Сорри что не сразу всем ответил тк лимит на 1 сообщение в сутки..


    1. Salavat
      12.12.2021 23:37

      Wireguard на оракловском сервере у меня заблокировали инстанс через некоторое время.
      Был настроен только Wireguard, 1 клиент.


      1. GritsanY
        13.12.2021 11:46

        Мой Wireguard крутится на оракловском VM.Standard.E2.1.Micro, штук 5 клиентов моих личных. Полёт нормальный, аптайм 152 дня.


  1. nitro80
    12.12.2021 16:29

    Приветствую. Почему выбор пал на Wireguard, а не допустим SSTP?


    1. nelidinav Автор
      13.12.2021 13:04

      Добрый день. Из-за простоты настройки на разных платформах, включая мобильные.


  1. PbIXTOP
    13.12.2021 04:48

    Смотрю, что везде используется VPN только для защиты DNS от клиента до pihole(или подобного). Так почему сразу не использовать DoH с клиента, используя login:pass для отбрасывания сторонних запросов?