Skip to content

Releases: necronicle/keenetic-doq

v0.6.0 — Local SmartDNS

Choose a tag to compare

@github-actions github-actions released this 23 Oct 21:51

Локальный SmartDNS вместо гео-DNS

Теперь doqd сам отвечает адресами прокси для имён из hosts. Все остальные имена идут через обычные DoQ-серверы с выбором самого быстрого здорового upstream по накопленным замерам. Cloudflare Zero Trust и отдельные гео-DNS для этой схемы не нужны.

  • Встроен список из 1025 точных имён: GeoHide EU, Sora и releases.openai.com для обновления Codex.
  • Полностью удалены гео-полоса, закрепление сервера, автоматическая классификация и специальные geo-команды. Бывшие гео-DNS убраны из дефолтов; вручную их можно добавить как обычный upstream.
  • Добавлены doqd hosts export, check, status, reload. Пользовательский hosts заменяет встроенный; перечитывание атомарное, ошибочный файл не заменяет рабочие правила.
  • Для имён из hosts A/AAAA содержат только заданные IP. Если IPv6 нет — пустой успешный AAAA. HTTPS/SVCB не выдают реальные IP-подсказки. Локальный TTL — 60 секунд.
  • Сохранены обычный DNS-кэш, резервные upstream и обработка отказов.
  • Исправлен выбор upstream: быстрый SERVFAIL/REFUSED больше не возвращает неисправный сервер в начало списка из-за колебаний задержки.

Обновление

Это изменение формата конфигурации. Используйте установщик из этого релиза или обновлённого main, а не просто заменяйте бинарник.

Keenetic:

curl -fsSL https://raw.githubusercontent.com/necronicle/keenetic-doq/v0.6.0/install.sh | sh

OpenWrt:

wget -qO- https://raw.githubusercontent.com/necronicle/keenetic-doq/v0.6.0/install-openwrt.sh | sh

Перед изменением конфига установщик сохраняет копию .pre-smartdns.*. Стандартная старая тройка гео-DNS удаляется, пользовательские гео-серверы становятся обычными upstream. Собственные geo-domain без IP нужно перенести в hosts вручную: установщик объяснит это и остановится до изменения работающей установки. Новый конфиг и hosts проверяются новым бинарником до остановки службы.

Адреса прокси остаются сторонними: doqd не является VPN и не создаёт собственный зарубежный выход. Автообновления hosts и автоматической замены умерших прокси нет. Точное имя не включает произвольные поддомены. Сторонняя веб-панель может требовать обновления для новых команд.

Проверка

Go-тесты и race detector, vet, миграции обоих установщиков, shellcheck, сборка 11 Linux-архитектур. Локальный демон проверен реальными DNS-запросами: локальные A/AAAA/HTTPS/SVCB по UDP/TCP и обычный домен через DoQ. Это не означает проверку каждого из 1025 сервисов или прогон новой версии на всех моделях роутеров.

v0.5.4

Choose a tag to compare

@github-actions github-actions released this 21 Oct 11:46

Changed

  • Переоценка при частично мёртвом пуле. Раньше закреплённый сервер
    обхода уступал место, только когда мертвы ВСЕ его прокси три проверки
    подряд. Bezmezhau 21.10.2026 показал дыру: из двух прокси умер тот, что для
    Claude и Gemini, второй жил, и doqd держал сервер бесконечно, а claude.ai
    уходил на единственный мёртвый адрес. Теперь мёртвый прокси в пуле три
    проверки подряд (90 с) запускает переоценку всех серверов обхода.
    Закреплённый уступает только серверу со строго большим охватом
    проверочных имён: если рядом с мёртвым адресом в ответах есть живой, сервер
    остаётся, и IP выхода у пользователей не меняется зря. По одному и тому же
    набору мёртвых прокси переоценка идёт один раз.

v0.5.3

Choose a tag to compare

@github-actions github-actions released this 21 Oct 11:24

Changed

  • Bezmezhau DNS убран из значений по умолчанию. У него два прокси, и один
    из них (143.20.64.55: Claude, Gemini, Copilot, Grok) перестал отвечать по
    порту 443 из сетей РФ, тогда как порт 853 на том же адресе отвечает: это
    фильтр, а не падение. ChatGPT через второй прокси работал, Claude и Gemini
    нет.
  • Серверы обхода по умолчанию: quic://eu.geohide.ru, quic://dns.comss.one,
    quic://dns.dns-ai.ru.
    Замер 21.10.2026 из РФ: у всех трёх DoQ живой и
    полное покрытие семи проверочных имён. eu.geohide.ru: 7 прокси в DE и NL,
    все живы, TLS до chatgpt.com 0,15–0,38 с. comss: 4 прокси в NL, TLS
    0,14–0,24 с (медленных прокси, из-за которых его убрали в 0.3.5, больше
    нет). dns-ai: один прокси в FI, TLS 0,18 с; теперь проксирует и
    sentinel/auth/tcr9i OpenAI и assets-proxy Anthropic, которых ему не
    хватало в 0.4.1. Российский узел geohide.ru не взят: три его прокси из
    четырёх закрыты по 443.
  • Установщики (Keenetic и OpenWRT) мигрируют конфиг ровно с одним сервером
    обхода quic://dns.bezmezhau.com на эту тройку. Конфигурации со своими
    серверами обхода не затрагиваются.

v0.5.2

Choose a tag to compare

@github-actions github-actions released this 16 Oct 22:14
v0.5.2

v0.5.1

Choose a tag to compare

@github-actions github-actions released this 13 Oct 11:13

Changed

  • Серверы обхода получают только геоблокированные имена. Раньше они
    стояли и в быстрой полосе: если geohide или dns-ai отвечали быстрее
    Quad9, обычные имена (в том числе .ru) резолвили они. Прокси для
    обычных имён они не отдавали, но видеть всё, что открывают устройства,
    им незачем. Теперь обычные имена идут только на upstream. Если в
    конфиге нет ни одного upstream, обычные имена идут на серверы geo,
    как раньше.
  • Третий обычный сервер по умолчанию — NextDNS (quic://dns.nextdns.io,
    без профиля ничего не фильтрует). Без серверов обхода в быстрой полосе
    двух серверов мало: ControlD у части провайдеров не отвечает по QUIC. У
    Cloudflare и Google DoQ нет.
  • Ответ с оборванной цепочкой CNAME больше не выигрывает у полного.
    ControlD на www, esia и lk.gosuslugi.ru отвечал одним CNAME на
    *.gslb.gosuslugi.ru без адресов, и если ControlD был самым быстрым,
    Госуслуги не открывались. Теперь такой ответ doqd считает бесполезным, как
    SERVFAIL: спрашивает следующий сервер и отдаёт оборванный ответ, только
    если полного нет ни у кого. Честный NODATA (SOA в конце цепочки) не
    затронут.
  • doqd list: заголовок секции FAST — every other name goes to the fastest of these.
  • Установщики (Keenetic и OpenWRT) обновляют комментарий над строками
    upstream. В конфиг ровно с прежней парой (Quad9 и ControlD) они
    добавляют upstream quic://dns.nextdns.io. Конфиг со своими upstream
    не меняется.

v0.5.0

Choose a tag to compare

@github-actions github-actions released this 11 Oct 23:50

Added

  • OpenWRT. Установка одной командой:
    wget -qO- https://raw.githubusercontent.com/necronicle/keenetic-doq/main/install-openwrt.sh | sh.
    doqd слушает 127.0.0.1:5354 и становится единственным сервером dnsmasq
    (server 127.0.0.1#5354, noresolv 1). Установщик меняет dnsmasq, только
    когда doqd уже отвечает, и проверяет запрос через порт 53. Если проверка
    не прошла, он возвращает dnsmasq в исходное состояние. procd перезапускает
    демона после любого сбоя. Удаление — uninstall-openwrt.sh: оно сначала
    возвращает dnsmasq исходные server и noresolv.
  • Имена серверов NTP на OpenWRT идут на bootstrap-серверы обычным DNS, мимо
    doqd. После перезагрузки часы роутера могут отставать, и тогда
    сертификаты DoQ-серверов «ещё не выданы»: doqd не может установить TLS, а
    NTP без обхода не смог бы исправить часы. Проверено в эмуляторе: с
    отставшими часами doqd восстановился сам, когда NTP поставил время.
  • Файлы doqd на OpenWRT попадают в список sysupgrade
    (/lib/upgrade/keep.d/doqd). Обновление прошивки с сохранением настроек
    оставляет doqd рабочим, а не dnsmasq без серверов.
  • Новые сборки: armv7, armv5, amd64, 386, mips64, mips64le,
    riscv64, loong64 — всего 11 архитектур. Установщик OpenWRT выбирает
    сборку по DISTRIB_ARCH; ARMv7 без FPU получает armv5.
  • В бинарник встроены корневые сертификаты. doqd берёт их, только если в
    прошивке своих нет.
  • doqd status на OpenWRT проверяет dnsmasq: есть ли doqd в
    /etc/config/dhcp и в конфиге, с которым dnsmasq работает сейчас.
    Строка other DNS перечисляет серверы, которые отвечают мимо doqd.

Changed

  • Сборка на Go 1.26 (была 1.23). На тест-роутере Keenetic память демона
    снизилась с 19 до 12,5 МБ.
  • Пути doqd выбирает по прошивке: на Keenetic всё по-прежнему в /opt, на
    OpenWRT — /etc/doqd.conf, /etc/doqd/geo.state, /etc/init.d/doqd.
  • install.sh и uninstall.sh для Keenetic на OpenWRT останавливаются и
    называют нужный скрипт.
  • README переписан: Keenetic и OpenWRT, короткие предложения.

v0.4.1

Choose a tag to compare

@github-actions github-actions released this 09 Oct 14:41

Fixed

  • ChatGPT не отвечал («Не удалось загрузить этот ответ»), вход сбрасывался,
    когда закреплялся dns.dns-ai.ru.
    Оценка серверов обхода проверяла только
    chatgpt.com, claude.ai и gemini.google.com. dns-ai подменяет эти имена, но
    для остальных хостов, без которых сервис не работает (sentinel.openai.com —
    антибот перед каждым ответом, tcr9i.chat.openai.com — капча входа,
    assets-proxy.anthropic.com), отдаёт настоящие адреса: браузер открывал сайт
    через чужой прокси, а антибот и капчу — напрямую с российского адреса, и
    OpenAI их отклонял. geohide.ru подменяет все эти хосты, но проигрывал по
    скорости TLS. Теперь пробных доменов семь (chatgpt.com, sentinel.openai.com,
    tcr9i.chat.openai.com, auth.openai.com, claude.ai, assets-proxy.anthropic.com,
    gemini.google.com); охват — сколько из них сервер подменяет живым прокси, а
    рейтинг сначала сравнивает охват и только потом скорость, так что побеждает
    сервер с полным охватом. DNS-запросы по пробным
    доменам идут параллельно. Если резолвер сравнения не ответил по какому-то
    хосту, он не засчитывается никому; если не ответил ни по одному, оценка
    безрезультатна. Пул прокси растёт только от ответов на хосты, которые
    закреплённый сервер действительно подменяет: настоящие адреса не попадают
    в пул. Победитель с неполным охватом закрепляется, но оценка повторяется
    (1 мин, ×2 до 30 мин), пока не вернётся сервер с полным охватом.
  • geo.state хранит набор пробных доменов. Если он не совпадает с текущим
    (в том числе у geo.state версии 0.4.0, где поля нет), закреплённому выбору
    не доверяют: после обновления каждый роутер один раз переоценивает серверы и
    снимает закрепление dns-ai.

v0.4.0

Choose a tag to compare

@github-actions github-actions released this 09 Oct 13:31

Changed

  • Гео-полоса: геоблокированные имена резолвит один закреплённый сервер
    обхода.
    Раньше doqd на каждое имя брал самый быстрый DNS-ответ: домены
    одного сайта получали прокси разных серверов (разных стран), а быстрый
    DNS не значил быстрых прокси. Теперь серверы обхода — отдельный ключ
    geo; doqd один раз оценивает их по живости и скорости TLS до их прокси
    (chatgpt.com, claude.ai, gemini.google.com), закрепляет лучший и меняет
    его только при отказе: три ошибки подряд на A/AAAA (SERVFAIL и REFUSED
    тоже; ошибки на HTTPS/SVCB не считаются — geohide сбрасывает такие запросы
    всегда) или все прокси мертвы три проверки подряд. Перед переключением
    doqd проверяет сеть запросом через быструю полосу: если молчит и она,
    закреплённый остаётся. Оценка, в которой ни один сервер ничего не обошёл
    (лежит интернет), безрезультатна: прежний выбор, рейтинг и geo.state
    остаются, оценка повторяется через 1 мин с удвоением до 30 мин. Серверы,
    у которых медиана TLS в пределах 20 % от лучшей, считаются равными и
    сохраняют порядок из конфига. Выбор хранится в
    /opt/var/lib/doqd/geo.state и переживает рестарт; оценка, прерванная
    остановкой демона, не сохраняется, повреждённый geo.state вызывает новую
    оценку. Обычные имена по-прежнему резолвит самый быстрый сервер.
  • Геоблокированное имя определяется встроенным списком (OpenAI, Anthropic,
    Gemini/AI Studio, NotebookLM, xAI), своими доменами (geo-domain,
    doqd add-domain) и автоматически: если ответ на имя попал в пул прокси
    сервера обхода. Пул растёт только от ответов на пробные домены (chatgpt.com,
    claude.ai, gemini.google.com), а не от каждого гео-имени. Напрямую
    классифицируются только A-запросы; AAAA, HTTPS и остальные типы сначала
    проходят внутренний A-запрос. Выученное геоблокированным имя остаётся
    таким до рестарта.
  • HTTPS/SVCB для геоблокированных имён: doqd вырезает из ответа подсказки
    ipv4hint/ipv6hint (в них может быть настоящий адрес сервиса), а если
    не ответил ни один сервер обхода — отвечает NODATA вместо ответа обычного
    резолвера. Браузер берёт адреса из A/AAAA, а они идут через прокси.
  • Дефолты: geo — geohide и dns-ai; Quad9 и ControlD — обычные upstream
    вместо fallback. Инсталлер переводит старые конфиги сам; повторный запуск
    на конфиге 0.4.0 ничего не меняет. comss инсталлер, как и раньше, убирает
    только при обновлении с 0.3.x и только если в конфиге остаётся другая
    строка upstream; иначе comss переходит в geo.
  • Откат на 0.3.x: старые версии не знают ключа geo и с конфигом 0.4.0 не
    запустятся. Перед установкой старой версии верните строки geo в
    upstream, а строки upstream с Quad9 и ControlD — в fallback; строки
    geo-domain удалите (0.3.x отвергает неизвестные ключи); или
    удалите /opt/etc/doqd.conf, чтобы получить дефолты той версии.

Added

  • Фильтр прокси. Адреса прокси закреплённого сервера проверяются раз в
    30 с; мёртвые и медленные (медиана TLS > 1 с и > 3× лучшей) выкидываются
    из ответов, если рядом есть здоровый адрес того же типа, а кешированные
    ответы с таким прокси по тому же правилу сбрасываются сразу. Так не
    доходят до клиентов, например, прокси geohide с TLS ~3 с и мёртвый адрес,
    который dns-ai начал отдавать при смене пула.
  • doqd geo — закреплённый сервер, рейтинг, состояние прокси;
    doqd geo reselect — переоценить сейчас (ждёт до 45 с; шлёт сигнал только
    демону 0.4.0 со свежим снимком); doqd add --geo (подсказывает запустить
    doqd geo reselect);
    doqd add-domain / doqd remove-domain; секции GEO/FAST в doqd list;
    строка geo: в doqd status.

v0.3.5

Choose a tag to compare

@github-actions github-actions released this 09 Oct 09:42

Changed

  • comss убран из дефолтных апстримов. Основные теперь geohide и dns-ai.
    doqd выбирает сервер с самым быстрым DNS-ответом, и обычно это был comss,
    но его прокси для геоблокированных сервисов оказались самыми медленными:
    TLS-рукопожатие с chatgpt.com через них занимало от 0,2 до 4,7 с против
    0,13–0,15 с через dns-ai. DNS отвечал быстро, а ChatGPT открывался долго.
    Инсталлер при обновлении убирает upstream quic://dns.comss.one из
    конфига, если в нём остаются другие основные апстримы. Вернуть:
    doqd add quic://dns.comss.one.

v0.3.4

Choose a tag to compare

@github-actions github-actions released this 07 Oct 20:39

Added

  • Резервные апстримы: ключ fallback и doqd add --fallback. Резервный
    сервер спрашивается, только когда отказали все основные (upstream):
    подстраховкой он не запускается, пока ждётся ответ хоть одного основного,
    даже медленного. TTL его ответов урезается до 60 с, чтобы после
    возвращения основных настоящий адрес не застрял в кешах. Отказавший
    основной стоит за здоровым резервом и возвращается вперёд, как только
    ответит фоновой проверке. doqd list помечает резерв [fallback].
  • doqd status показывает другие DNS-серверы роутера (other DNS): их
    ndnproxy спрашивает наравне с doqd и берёт самый быстрый ответ — так
    геоблокированный сервис может получить настоящий адрес мимо doqd.

Changed

  • Дефолты — серверы обхода геоблокировок. Основные апстримы — comss,
    geohide и dns-ai: для ChatGPT, Gemini, Claude и других закрытых для
    России сервисов они отдают адреса своих прокси. Резерв — Quad9 и ControlD
    (p0.freedns.controld.com, без фильтрации, из другой сети). Раньше
    comss и Quad9 были равны, запрос уходил в быстрейший, а подстраховка — в
    другой, и Quad9 регулярно обгонял comss с настоящим адресом: «геоблок
    то работает, то нет». Инсталлер при обновлении переводит
    upstream quic://dns.quad9.net в fallback, если в конфиге есть другие
    апстримы и ещё нет резервных, и добавляет к нему ControlD; в конфиг со
    старыми дефолтами (только comss и Quad9) он добавляет geohide и dns-ai.