LINUX.ORG.RU

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

 , , ,

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

5

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

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

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

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

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

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