Протокол QUIC, в отличие от UDP поддерживает шифрование и работает быстрее чем TCP, который часто используется для шифрованных DNS-запросов. Данная инструкция актуальная, так как Google все-таки начал удаление поддержки блокировщиков рекламы из своего браузера. Кроме того, она пригодится тем, кто хочет скрыть свое пребывание в Интернете от тотальной слежки.
Команда разработчиков популярного расширения для блокировки рекламы AdGuard разработала свой прокси-сервер для работы с DNS через QUIC, который поддерживает множество настроек.
dnsproxy — AdGuard Home для вас слишком тяжёлый и вам нужен простой forwarder? Используйте
dnsproxy
— простой DNS-прокси с поддержкой DoH, DoT, DoQ и DNSCrypt.
Запуск через Docker
dnsproxy
можно запустить через docker так:
docker run --rm -p "127.0.0.1:53:53/udp" adguard/dnsproxy -b "1.1.1.1" -u "quic://dns.adguard-dns.com"
Можете через dig проверить его работоспособнность:
dig @127.0.0.1 google.com
Чтобы сервис автоматически запускался при старте системы, создайте docker-compose.yml
:
services:
dnsproxy:
image: adguard/dnsproxy
container_name: dnsproxy
restart: unless-stopped
ports:
- "127.0.0.1:53:53/udp"
command: -b "1.1.1.1" -u "quic://dns.adguard-dns.com"
Без флага -b
, где указывается Bootstrap DNS, quic
работать не будет.
Для его запуска достаточно выполнить:
docker compose up -d
Проверьте вывод:
$ docker compose ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
dnsproxy adguard/dnsproxy "/opt/dnsproxy/dnspr…" dnsproxy 4 minutes ago Up 4 minutes 53/tcp, 80/tcp, 443/tcp, 443/udp, 853/tcp, 853/udp, 5443/tcp, 6060/tcp, 127.0.0.1:53->53/udp, 5443/udp
Однако это не избавляет от необходимости настройки сети.
Установка в Arch Linux
Пакет доступен для пользователей Arch Linux в репозиториях archlinuxcn
и AUR. Но я бы использовал даже в Arch способ с docker, так как он требует меньше правок конфигов.
Добавьте репозиторий archlinuxcn
(это более предпочтительно чем установка из AUR, сервера которого последнее время блокируют IP без причины) в /etc/pacman.conf
:
[archlinuxcn]
Server = https://repo.archlinuxcn.org/$arch
А затем установите:
sudo pacman -S dnsproxy
Ручная установка
wget -O dnsproxy.tar.gz "$(curl -s https://api.github.com/repos/AdguardTeam/dnsproxy/releases | grep -P 'browser_download_url.*linux-amd' | head -1 | cut -d '"' -f4)"
tar -xzvf dnsproxy.tar.gz
cd linux-amd64
sudo mv dnsproxy /usr/bin/dnsproxy
Запуск через Systemd
В Arch с пакетом идет systemd-сервис:
/usr/lib/systemd/system/dnsproxy.service
[Unit]
Description=Simple DNS proxy with DoH, DoT, and DNSCrypt support
Documentation=https://github.com/AdguardTeam/dnsproxy#readme
After=network.target
Before=network-online.target
[Service]
Type=simple
DynamicUser=true
WorkingDirectory=/etc/dnsproxy
ProtectSystem=true
ProtectHome=true
PrivateTmp=true
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_BIND_SERVICE
ExecStart=/usr/bin/dnsproxy --config-path=/etc/dnsproxy/dnsproxy.yaml
Restart=on-failure
RestartSec=30
StartLimitBurst=10
[Install]
WantedBy=user.target
Редактируем /etc/dnsproxy/dnsproxy.yaml
:
# Bootstrap обязателен!
bootstrap:
- "8.8.8.8:53"
listen-addrs:
- "127.0.0.1"
listen-ports:
- 53
# Тут можно несколько серверов вписать
# Сервер от AdGuard хорош тем, что блокирует рекламу и трекеры
upstream:
- "quic://dns.adguard-dns.com"
Имена настроек соответствуют именам флагов:
dnsproxy --help
Включаем dnsproxy
:
sudo systemctl enable --now dnsproxy.service
Настройка сети
Запретим NetworkManager
перезаписывать /etc/resolv.conf
:
/etc/NetworkManager/conf.d/dns.conf
[main]
dns=none
Настройка systemd-resolved
:
/etc/systemd/resolved.conf.d/dnsproxy.conf
[Resolve]
DNS=127.0.0.1
Domains=~.
DNSStubListener=no
Перезапустим systemd-resolved
:
sudo systemctl restart systemd-resolved
Для NetworkManager нужно прописать адрес, который слушает dnsproxy
, в качестве nameserver
:
/etc/resolv.conf
nameserver 127.0.0.1
Перезапустим сетевой менеджер:
sudo systemctl restart NetworkManager
Проверка
Yandex Metrica должна возвращать 0.0.0.0
:
$ resolvectl query mc.yandex.ru
mc.yandex.ru: 0.0.0.0
::
-- Information acquired via protocol DNS in 48.9ms.
-- Data is authenticated: no; Data was acquired via local or encrypted transport: no
-- Data from: network
$ dig mc.yandex.ru
; <<>> DiG 9.20.6 <<>> mc.yandex.ru
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 47106
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;mc.yandex.ru. IN A
;; ANSWER SECTION:
mc.yandex.ru. 3600 IN A 0.0.0.0
;; Query time: 49 msec
;; SERVER: 127.0.0.1#53(127.0.0.1) (UDP)
;; WHEN: Thu Mar 06 13:08:18 MSK 2025
;; MSG SIZE rcvd: 57
Проблемы и их решение
При использовании socks-прокси в Chromium всегда используется dns прокси-сервера. В Firefox нужно отключить DNS Over HTTPS, а так же снять галочки в настройках прокси напротив Proxy DNS when using SOCKS v4
и Proxy DNS when using SOCKS v5
.
Чтобы заблокировать трекеры и рекламу на прокси-сервере, придется проделать все вышеописанное и там, за исключением того, что на сервере нет NetworkManager.
Можно так же использовать hblock
, который через hosts
блокирует сайты:
$ curl -o /tmp/hblock 'https://raw.githubusercontent.com/hectorm/hblock/v3.5.0/hblock' \
&& echo 'bb8f632fcb101ea017fb00a8d02925dfc7d5a6d075e2cb30e4bc293e5c0628b1 /tmp/hblock' | shasum -c \
&& sudo mv /tmp/hblock /usr/local/bin/hblock \
&& sudo chown 0:0 /usr/local/bin/hblock \
&& sudo chmod 755 /usr/local/bin/hblock
$ hblock
DNS-сервера
Известные DNS-сервера можно посмотреть на сайте AdGuard.
При написании частично использован этот gist