К контенту
habrforever
СКРЫТА #wireguard полный ремейк 2026 ≈2020 · ~12 мин чтения

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

автор оригинала: nelidinav

оригинал на Хабре habr.com/…/594877
снимок Wayback web.archive.org
статус на Хабре (ноябрь 2026) скрыта (403/451)
права © автор, переиздание в архивных целях с указанием источника

Свой VPN + фильтрация DNS в 2026: ремейк гайда про WireGuard + DNSCrypt + Unbound + Pi-hole

Архивное переиздание с полной переработкой. Оригинал «Пошаговая инструкция по настройке Wireguard VPN + DNSCrypt + DNS server (Unbound) + Pihole» (nelidinav, ≈2020) скрыт на Habr — доступен через Wayback Machine. Идея «VPN + свой резолвер + блокировка рекламы на сервере» в 2026 не то чтобы актуальна — она обязательна: без своего DNS туннель не спасает. Ниже — та же схема на живом ПО и с поправкой на ТСПУ. Оригинал — в конце, без купюр.

TL;DR — версия 2026

Схема собирается, но с тремя заменами: Debian 11 → Debian 13, голый WireGuard → AmneziaWG (DPI режет классический хендшейк), DNSCrypt + Unbound + Pi-hole v5 → AdGuard Home (или Pi-hole v6 + Unbound 1.2x). Идея не изменилась: туннель до VPS, DNS внутри туннеля, реклама и телеметрия режутся на сервере, а не на каждом устройстве.

Зачем это вообще: DNS — первая дыра «VPN»

Оригинал ставил своей целью «сделать свой VPN и DNS-сервер с шифрованным DNS и блокировкой рекламы». В 2026 это уже не « nice to have », а условие работы: провайдер подменяет ответы DNS, ТСПУ смотрит на SNI/DoH, а «VPN без своего DNS» — это туннель, из которого половина запросов всё равно уходит к провайдеру. Поэтому любая схема «WireGuard + что-то ещё» в 2026 начинается с трёх вопросов:

  1. куда уходит DNS клиента (системный → провайдер = провал);
  2. виден ли хендшейк сам по себе (голый WG = провал);
  3. кто режет рекламу, если устройств десять (сервер = правильно).

База 2026: ОС и сеть

Было: Debian 11 (bullseye), Ubuntu 20.04, /etc/apt/sources.list, iptables-persistent, 2 ГБ ОЗУ.

Стало:

Компонент 2020 2026
ОС Debian 11 / Ubuntu 20.04 Debian 12/13 или Ubuntu 24.04 LTS
репозитории /etc/apt/sources.list deb822 /etc/apt/sources.list.d/*.sources
фаервол iptables-persistent nftables (/etc/nftables.conf)
ОЗУ 2 ГБ «на всякий» 512 МБ – 1 ГБ хватает
WG wireguard из backports в ядре, amnezia-wg для обфускации
Pi-hole v5 (FTL v5, lighttpd) v6 (FTL v6, переписанный web UI)
Unbound 1.13 1.2x
DNSCrypt dnscrypt-proxy 2 жив, но чаще AdGuard Home с DoH/DoQ

VPS — за пределами РФ (оригинал советовал Fornex; в 2026 важнее не бренд, а юрисдикция логов и латентность: Финляндия/Нидерланды/ Германия дают 20–40 мс из западной части РФ).

Шаг 1. AmneziaWG вместо «ванильного» WireGuard

Повторяем структуру конфига из оригинала ([Interface], [Peer], AllowedIPs, PersistentKeepalive), но ставим обфусцированный форк:

# Debian 12/13, Ubuntu 24.04+
apt update && apt install -y amnezia-wg qrencode nftables curl
awg genkey | tee /etc/amnezia-wg/server.key
awg pubkey < /etc/amnezia-wg/server.key    # публичный ключ сервера

/etc/amnezia-wg/awg0.conf:

[Interface]
Address = 10.8.0.1/24
ListenPort = 38417          # не 51820 — случайный высокий UDP-порт
PrivateKey = <server-private>
Jc = 4                      # обфускация AmneziaWG: мусорные пакеты
Jmin = 40
Jmax = 70
S1 = 15
S2 = 28
H1 = 1234567                # псевдо-типы пакетов (подбираются парой с клиентом)
H2 = 2345678
H3 = 3456789
H4 = 4567890

[Peer]
PublicKey = <client-public>
AllowedIPs = 10.8.0.2/32
PersistentKeepalive = 25
systemctl enable --now awg-quick@awg0

Клиенты — приложение AmneziaVPN (Windows/macOS/Linux/Android/iOS) или тот же awg-конфиг; параметры Jc/Jmin/.../H4 должны совпадать на обеих сторонах. Всё остальное из оригинала (Address, DNS = 10.8.0.1, AllowedIPs = 0.0.0.0/0, QR-код для телефона) не меняется.

Если сервер и клиенты находятся внутри одной доверенной сети и трафик не выходит в «большой» интернет через российского провайдера — AmneziaWG не обязателен: ставьте обычный WG, он быстрее и проще.

Шаг 2. DNS: два рабочих варианта 2026

Вариант A (рекомендую): AdGuard Home вместо зоопарка

Один бинарник закрывает сразу три роли оригинала: DNS-резолвер, блокировщик рекламы/телеметрии и шифрованный «апстрим».

curl -s -S -L https://raw.githubusercontent.com/AdguardTeam/AdGuardHome/master/scripts/install.sh | sh
# веб-интерфейс: http://<VPS-IP>:3000 — первичная настройка
  • слушать 10.8.0.1:53 (адрес туннеля) и 127.0.0.1:5335 для самой системы;
  • upstream: https://dns.cloudflare.com/dns-query (DoH) или quic://... (DoQ) + tls:// резерв;
  • в клиентском конфиге WG/AWG: DNS = 10.8.0.1;
  • фильтры: базовый AdGuard + EasyList-русский + список «заблокированного у провайдера» уходит в тот же туннель.

Вариант B (буквально оригинал, но живой): Pi-hole v6 + Unbound 1.2x

Если хочется сохранить связку из статьи:

apt install -y unbound
curl -o /var/lib/unbound/root.hints https://www.internic.net/domain/named.cache
curl -sSL https://install.pi-hole.net | bash     # поставит v6

Unbound-конфиг из оригинала (pi-hole.conf) жив почти дословно — проверьте только interface: 127.0.0.1@5335 и do-ip6: no, если провайдер не даёт IPv6. В Pi-hole v6 upstream указывается в Settings → DNS как 127.0.0.1#5335; web UI больше не lighttpd, так что «открыть /admin по IP VPS» из оригинала работает, но лучше закрыть его за туннелем и не светить наружу.

DNSCrypt-proxy из оригинала при желании остаётся третьим слоем, но в 2026 он избыточен: AdGuard Home/Unbound сами умеют DoH/DoT/DoQ.

Шаг 3. nftables вместо iptables-persistent

Оригинал сохранял правила через iptables-persistent. Актуальный минимум /etc/nftables.conf:

table inet filter {
  chain input {
    type filter hook input priority 0; policy drop;
    iif lo accept
    ct state established,related accept
    tcp dport 22 accept                      # SSH (лучше на нестандартный порт)
    udp dport 38417 accept                  # AWG, порт из awg0.conf
    iifname "awg0" accept                   # всё от клиентов
    ip protocol icmp accept
  }
  chain forward {
    type filter hook forward priority 0; policy drop;
    iifname "awg0" oifname "eth0" accept
    iifname "eth0" oifname "awg0" ct state established,related accept
  }
}
table ip nat {
  chain postrouting {
    type nat hook postrouting priority 100;
    oifname "eth0" masquerade
  }
}

sysctl -w net.ipv4.ip_forward=1 (и net.ipv6.conf.all.forwarding=1, если v6 не отключён) — как в оригинале.

Проверка: три команды, которые всё скажут

awg show                                        # handshake есть, transfer растёт
dig @10.8.0.1 habr.com +short                    # резолвится СЕРВЕРОМ, не провайдером
curl -s https://dnsleaktest.com/...             # или ipleak.net из браузера клиента:
                                                # в списке DNS только ваш VPS

Дополнительно: blockcheck от ValdikSS — чтобы убедиться, что порт AWG не режется провайдером, и ping -M do -s 1372 для подбора MTU (ставьте MTU = 1280 в [Interface], если за CDN/облаком).

Что изменилось с ≈2020 года

  • Debian 11 и Ubuntu 20.04 — EOL; deb822-репозитории вместо sources.list
  • «ванильный» WireGuard на 51820 режется ТСПУ → AmneziaWG со случайным высоким портом
  • Pi-hole v6 (FTL v6, новый UI), Unbound 1.2x; dnscrypt-proxy ушёл в «по желанию»
  • iptables-persistent → nftables
  • появился готовый «комбайн» AdGuard Home, который заменяет три сервиса одним процессом
  • проверка DNS-утечек стала обязательным шагом, а не «итогами» в конце

Чек-лист 2026

  • AmneziaWG на сервере и у всех клиентов, параметры обфускации совпадают
  • нестандартный высокий UDP-порт, в nftables открыт только он + SSH
  • DNS = 10.8.0.1 в клиентском конфиге, системный DNS не используется
  • AdGuard Home/Unbound слушают только туннельный адрес и localhost
  • web-панель НЕ торчит на 0.0.0.0:80 наружу
  • kill switch на клиенте (AllowedIPs = 0.0.0.0/0 + фаервол)
  • MTU 1280 при проблемах с большими пакетами
  • проверен dnsleaktest/ipleak — утечек нет

Вердикт

Оригинальная статья была редким примером «правильного» гайда: она не путала VPN и DNS и сразу строила обе половины. В 2026 она не устарела концептуально ни на йоту — просто «ваниль» WireGuard научились резать, а зоопарк из трёх демонов удобно заменяется одним AdGuard Home. Соберите по шагам выше — и у вас та же схема, что автор задумывал в 2020-м, только выживающая в ноябре 2026-го.


ОРИГИНАЛ СТАТЬИ (без изменений)

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

Оглавление:

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

Установка Wireguard

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

Установка Pihole

Установка Unbound

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

Суть задачи в том, чтобы сделать свой 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).

            ДО                                                 и                                           ПОСЛЕ

Иллюстрация из оригинала статьи

**

по теме #wireguard