LINUX.ORG.RU

DNS-Over-QUIC для блокировки рекламы и не только

 , , ,

DNS-Over-QUIC для блокировки рекламы и не только

6

1

Протокол 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

★★★

Проверено: hobbit ()
Последнее исправление: rtxtxtrx (всего исправлений: 31)

О да, надо сделать днс через quic и реклама сразу заблокируется. Днс через днс рекламу блокировать, разумеется, не может.

А вообще, я «днс-блокировками» (через hosts было) страдал только в давние годы. То, что это тупиковая идея, стало ясно уже около 10 лет назад (мне, а другим может быть раньше или позже, тебе видимо до сих пор непонятно). Адекватно блокировать мусор можно только имея доступ к содержимому страниц, т.е. либо внутри браузера, либо https-митм.

Итог: статья якобы про решение задачи неадекватным способом, при этом собственно «решение» тем не менее вообще не описано, а описаны мутные инструкции к не пойми чему, да ещё и с докерами.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)

Протокол QUIC, в отличие от UDP поддерживает шифрование и работает быстрее чем TCP

В отличии? QUIC сделан на основе UDP, обычный TCP шифрование не поддерживает, шифрование в веб-е сделано с помощью TLS. Для QUIC сделан свой TLS - DTLS с учётом того что это UDP (просираются пакеты и т.д.). Исправляй.

Кстати, QUIC вроде бы в РФ заблокирован?

Skullnet ★★★★★
()
Ответ на: комментарий от Skullnet

не буду. tls - это не протокол, а transport layer. помимо него еще и ssl долго использовался, сейчас по привычке многие мх не различают. нет не заблокирован

rtxtxtrx ★★★
() автор топика
Ответ на: комментарий от rtxtxtrx

Правильно не различают, это одно и то же. Не «SSL использовался вместо TLS», а SSL переименовали в TLS после третьей версии. Если не веришь - почитай соответствующие rfc, между sslv3 и tlsv1.0 отличий наверно меньше чем между tlsv1.1 и tlsv1.2.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от firkax

ты как дед, которому не угодить. ну не будет весь мир под тебя подстраиваться и отказываться от docker только потому что тот тебе не нравится

rtxtxtrx ★★★
() автор топика
Ответ на: комментарий от rtxtxtrx

tls - это не протокол

TLS это протокол.

Прикладной уровень (HTTP, SMTP)  
↓  
TLS (шифрование данных)  
↓  
Транспортный уровень (TCP)  
↓  
Сетевой уровень (IP)  
↓  
Физический уровень  
lbvf50txt
()
Ответ на: комментарий от firkax

Правильно не различают, это одно и то же.

TLS 1.0 обратно совместим с SSL 3.0, но это НЕ одно и то же. Заменен Handshake, добавлены алгоритмы шифрования.

lbvf50txt
()
Последнее исправление: lbvf50txt (всего исправлений: 1)
Ответ на: комментарий от lbvf50txt

TLS 1.0 и SSL 3.0 это конечно не одно и то же. А вот SSL и TLS (без указания версий) - одно и то же. SSL2, SSL3, TLS10, TLS11, TLS12, TLS13 - это всё разные версии одного и того же протокола (или линейки если тебе так больше нравится).

firkax ★★★★★
()

яннп. этот квик нужен чтобы что? чтобы терминироваться на ближайшем роутере через метр от рабочей станции, а потом по стандарту долбиться в апстрим? потужно.

Anoxemian ★★★★★
()
Ответ на: комментарий от thesis

«Здравствуйте, я веб-программист».

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

lbvf50txt
()
Ответ на: комментарий от thesis

куда мне до менеджера конфигов с ансимблями изначально tcp соединение открывается.

все верно tcp используется… душнилы могут бомбить

rtxtxtrx ★★★
() автор топика
Последнее исправление: rtxtxtrx (всего исправлений: 1)

У вас метод работает? В фирефоксе блочит рекламу?

Пс: на некоторых сайтах вылазит реклама с Ublock Origin. Может есть расширения, более рабочие, чем Ublock Origin.

Tesler
()

Не слишком ли много всяких мутных типков участвует в процессе?

1.1.1.1
8.8.8.8
dns.adguard-dns.com

Есть же базированное решение такой задачи - pi-hole и unbound.

pisemsky
()
Ответ на: комментарий от pisemsky

этот днс нужен чтобы «безопасно» узнать айпи quic хоста. ну как-то у них странно все это сделано. тут просто показано, что есть такой протокол quic и можно через него dns-запросы делать. можно на роутере прописать использование днс от adguard и на всех устройствах не видеть мусор… точнее даже не так. меня бесит фсбшный яндекс, который на каждый сайт пихают и он все твои передвижения по сети отслеживает.

rtxtxtrx ★★★
() автор топика
Последнее исправление: rtxtxtrx (всего исправлений: 1)
Ответ на: комментарий от rtxtxtrx

То есть слежка яндекса тебя беспокоит а более обширная слежка гугла - нет?

И я тебя расстрою, яндекс ты отовсюду вырезать не сможешь, есть сайты которые yastatic.net используют. Аналогично с гуглом (только намного чаще) googleapis.com. А если ты эти домены просто забанишь - на сайтах сломаются скрипты. Так что твои днс-блокировки явно недостаточны.

firkax ★★★★★
()

Все в курсе этого способа и либо долбятся к своей телеметрии напрямую по IP-адресам, либо точно так же используют DoH для резолва.

somemong
()
Ответ на: комментарий от somemong

либо долбятся к своей телеметрии напрямую по IP-адресам

браузеры с недавних пор не ходят по небезопасным адресам, а поэтому везде используются домены

rtxtxtrx ★★★
() автор топика
Ответ на: комментарий от rtxtxtrx

по небезопасным адресам, а поэтому везде используются домены

Сертификаты не только на домен, но и ip-адреса, например https://1.1.1.1

yandrey ★★
()
Ответ на: комментарий от yandrey

сложно спорить с такими людьми. почитай кто его выдал и как это работает (работает ли с не особенными)

rtxtxtrx ★★★
() автор топика

Обожаю ЛОР. Всегда со злобной улыбкой читаю cрaчи…=)

И да, @firkax иногда напрашивается на нецензурную посланность, но в последнее время он становится адекватнее

Shprot ★★
()
Ответ на: комментарий от rtxtxtrx

браузеры

Мам, привет! Приложение не открывает браузер, чтобы отправить свою телеметрию! Это работает не так. Это делается через REST APT, в основном. Но ничего не мешает сделать свой протокол.

с недавних пор не ходят по небезопасным адресам

Можно выпустить сертификат на IP, и адрес волшебным образом станет доверенным.

somemong
()
Ответ на: комментарий от rtxtxtrx

кто его выдал

Годадди, комодо такие точно выдавали. Но можно и без них, selfsigned вполне себе зашивают в приложения.

somemong
()
Ответ на: комментарий от somemong

не можно. 1.1.1.1 - единственный вообще, вроде. а кроме педирест айпи не знаешь ничего (хотя бы там всякие джейсон рпц)? ufw тебе на что? закрой исходящие порты кроме нужных (443, 22, 3306 и тп) раз параноишь… хотя ты пишешь чушь. хром шлет телеметрию, и она отлавливалась банально через самописное расширение

rtxtxtrx ★★★
() автор топика
Ответ на: комментарий от pisemsky

pi-hole тормозное censored. Вплоть до того что страницу с рекламой быстрее иногда загрузить, чем с pi-hole. uBlock Origin наше все.

anonymous_sama ★★★★★
()
Ответ на: комментарий от yandrey

https://stackoverflow.com/a/21776493

Сертификаты на айпи выдает Google Trust Services их можно заблокировать на уровне системы и все запросы по https к айпи не работают (по http и так не работают)

# /etc/ssl/openssl.cnf
[ v3_ca ]
subjectAltName = email:copy
rtxtxtrx ★★★
() автор топика
Ответ на: комментарий от Tesler

Их все не забочить. Там миллионы адресов. Блокировщики рекламы сотни мегабайт на каждой вкладке сжирают и даже через hosts тоже лишние мегабайты. Через dns ты экономишь свои ресурсы, но способ спорный и как все не спасает от 100% рекламы

rtxtxtrx ★★★
() автор топика
Ответ на: комментарий от rtxtxtrx

Сертификаты на айпи выдает Google Trust Services

не только

Opendns https://208.67.222.222 - IdenTrust

Alibaba https://223.5.5.5 Яндекс https://77.88.8.8 - GlobalSign

AdGuard https://94.140.14.14 - ZeroSSL

yandrey ★★
()
Последнее исправление: yandrey (всего исправлений: 1)
Ответ на: комментарий от rtxtxtrx

хром шлет телеметрию

Только Хром шлет телеметрию?!

закрой исходящие порты кроме нужных (443)

Как это спасет от отправки телеметрии по REST API?

somemong
()
Ответ на: комментарий от yandrey

Покажите мне сертификат на IP адрес. Просто пример какого-то реального. И я пойду напьюсь.

AdGuard https://94.140.14.14 - ZeroSSL

$ openssl s_client -connect 94.140.14.14:443
Connecting to 94.140.14.14
CONNECTED(00000003)
Can't use SSL_get_servername
depth=2 C=US, ST=New Jersey, L=Jersey City, O=The USERTRUST Network, CN=USERTrust ECC Certification Authority
verify return:1
depth=1 C=AT, O=ZeroSSL, CN=ZeroSSL ECC Domain Secure Site CA
verify return:1
depth=0 CN=dns.adguard-dns.com  <------- Сертификат на FQDN
verify return:1

$ host 94.140.14.14
14.14.140.94.in-addr.arpa domain name pointer dns.adguard-dns.com.
Kroz ★★★★★
()
Ответ на: комментарий от Kroz

В «Subject Alternative Name» не реальные домены и ip-адреса?

$ openssl s_client -connect 94.140.14.14:443 | openssl x509 -noout -text | grep -C3 -i dns
Connecting to 94.140.14.14
Can't use SSL_get_servername
depth=2 C=US, ST=New Jersey, L=Jersey City, O=The USERTRUST Network, CN=USERTrust ECC Certification Authority
verify return:1
depth=1 C=AT, O=ZeroSSL, CN=ZeroSSL ECC Domain Secure Site CA
verify return:1
depth=0 CN=dns.adguard-dns.com
verify return:1
        Validity
            Not Before: Nov  5 00:00:00 2024 GMT
            Not After : Nov  5 23:59:59 2025 GMT
        Subject: CN=dns.adguard-dns.com
        Subject Public Key Info:
            Public Key Algorithm: id-ecPublicKey
                Public-Key: (256 bit)
--
                                9C:78:58:36:57:46:A7:8B:48:EB:98:BE:05:D8:17:A0:
                                9B:6F:25:89:DD:F1:37
            X509v3 Subject Alternative Name: 
                DNS:dns.adguard-dns.com, IP Address:94.140.14.14, IP Address:94.140.14.140, IP Address:94.140.14.141, IP Address:94.140.14.15, IP Address:94.140.15.15, IP Address:94.140.15.16, DNS:family.adguard-dns.com, DNS:unfiltered.adguard-dns.com
yandrey ★★
()

Если systemd ≥ 253 версии, то проще всего это делать через systemd-resolved, не понадобится даже ставить dnsproxy и боже упаси, целый докер с контейнером тащить для такой цели.

Редактируем /etc/systemd/resolved.conf:

# Основные DNS-серверы AdGuard (IPv4 и IPv6)
DNS=94.140.14.14  # AdGuard DNS (основной)
DNS=2a10:50c0::ad1:ff  # AdGuard DNS IPv6
# Резервные DNS (можно оставить Cloudflare/Google)
FallbackDNS=1.1.1.1 8.8.8.8
# Отключаем DoT, если используем DoQ
DNSOverTLS=no
# Отключает Link-Local Multicast Name Resolution:
LLMNR=no
# Отключает mDNS:
MulticastDNS=no
# Разрешает DNSSEC, но не требует его:
DNSSEC=allow-downgrade
# Включаем DoQ
DNSOverQUIC=yes
# Указываем DoQ-сервер AdGuard (формат: quic://сервер)
DNS=quic://dns.adguard-dns.com

Сохраняем, делаем sudo systemctl restart systemd-resolved и готово. Опять же, надо не забыть в том же Firefox отключить DoH. Возможно, ещё отредактировать прописанный DNS в NetworkManager(если он там вообще был прописан). Вот и всё. А то нагородили тут простыню с кучей возни :)

th3m3 ★★★★★
()

При наличии маршрутизатора с OpenWRT в доме будет сильно проще:

  • использовать локальный unbound в качестве резолвера — он поддерживает кеш и умеет самостоятельно его актуализировать; поддерживает DoH и DoT

  • на unbound настроить форвард на доверенные публичные DNS, например Quad9, Wikipedia, OpenDNS или несколько через DoT

  • использовать adblock из репозитория OpenWRT вместе с unbound с подписками на листы по усмотрению

В такой конфигурации:

  • ответ на запросы DNS с откликом локальной сети (обычно, до 1 мс) для всех устройств после прогрева кеша

  • скрытые от оператора, властей запросы к восходящим серверам, которые сложнее привязать к физическому лицу

  • естественная защита от dnsleak и вычисления по IP в случае обхода блокировок

  • фильтрация откровенно мусорных серверов для всех в локальной сети: с adblock подписками [adaway, adguard, android_tracking, disconnect, reg_ru, yoyo] тест https://adblock-tester.com выдаёт 76/100 успешной фильтрации — это сильно лучше ничего для носимых устройств

Всё спокойно помещается в устройства с 16 МБ флеша и 128 оперативки. Это быстроее и проверенное решение, которое не ограничивается локалхостом. Разница загрузки страниц с правильно кеширующим резолвером заметна глазом.

emmawatsondtypants
()
Ответ на: комментарий от th3m3

По той же причине что и всякие logrotate.d, modprobe.d, sudoers.d, sysctl.d и подобные, чтобы основа при обновлении заменялась, группировать конфиги по разным файлам.

yandrey ★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.