Форум OlegON > Компьютеры и Программное обеспечение > Сеть

Свой собственный быстрый DNS-сервер knot-resolver : Сеть

21.11.2024 14:14


16.06.2022 19:47
Вообще я достаточно длительное время был фанатом unbound и втыкал его куда только ни попадя. Работал достаточно шустро, как я подозревал, быстрее некуда. Но, во-первых, оказалось, что очень даже есть куда, а во-вторых, с печалью вынужден был констатировать, что в наше непростое по сетевым баталиями время unbound стал подвисать. Стоит только родительскому серверу не ответить или разорвать соединение, unbound уходил в себя и отдавал только уже закешированное. Постоянно рестартовать надоело, как и угадывать момент, когда он повиснет в очередной раз. Как вы понимаете, это я все к тому, что все вышеперечисленное отсутствует в knot-resolver. Его и предлагаю поставить.




После установки необходимо поправить конфиг:
Код:
net.listen('127.0.0.1', 53, { kind = 'dns' })
net.listen('192.168.1.1', 53, { kind = 'dns' })
net.listen('192.168.1.1', 8453, { kind = 'webmgmt' })
modules = {
        'hints > iterate',  -- Allow loading /etc/hosts or custom root hints
        'stats',            -- Track internal statistics
        'predict',          -- Prefetch expiring/frequent records
        'rebinding < iterate',
        'http',
        'prefill',
        'serve_stale < cache',
}

http.config({ tls = false, })
hints.add_hosts('/etc/hosts')

watchdog.config({ qname = 'nic.ru.', qtype = kres.type.A })

cache.size = 32 * MB
cache.min_ttl(600)
Это все :)
Небольшое описание: кеш у меня 32Мб всего. Минимальное время жизни записи - 10 минут. Если с сервером не удается связаться, то отдается старый адрес. Периодически устаревающие записи, которые часто используются, обновляются даже без обращения клиента к ним. На 8453 порту у меня веб. Он вообще-то не нужен, но очень лениво было собирать статистику по каждому процессу и суммировать ее, а в вебе она уже суммарная. Автоматом подтягиваются хосты, прописанные в /etc/hosts. Если NIC не работает, то демону пришло время перезапуститься.
После конфигурирования необходимо запустить необходимое количество демонов, я запустил две штуки
Код:
systemctl enable --now kresd@1
systemctl enable --now kresd@2
это удобно с той точки зрения, что пока вы рестартуете один, второй спасает ваших пользователей, а если рестарт будет неудачным, никто без DNS не останется и вы сможете спокойно разбираться в причинах.

Можно посмотреть статистику по кешу (обратите внимание, что это по каждому демону отдельная, то есть это по первому):
Код:
echo 'cache.stats()'|socat - UNIX-CONNECT:/run/knot-resolver/control/1
> {
    ['clear'] = 0,
    ['close'] = 1,
    ['commit'] = 8716,
    ['count'] = 6,
    ['count_entries'] = 40610,
    ['match'] = 0,
    ['match_miss'] = 0,
    ['open'] = 2,
    ['read'] = 206456,
    ['read_leq'] = 350,
    ['read_leq_miss'] = 170,
    ['read_miss'] = 27774,
    ['remove'] = 0,
    ['remove_miss'] = 0,
    ['usage_percent'] = 18.44482421875,
    ['write'] = 9838,
}
или по самому демону
Код:
echo 'stats.list()'|socat - UNIX-CONNECT:/run/knot-resolver/control/1
> {
    ['answer.1000ms'] = 14,
    ['answer.100ms'] = 376,
    ['answer.10ms'] = 745,
    ['answer.1500ms'] = 1,
    ['answer.1ms'] = 32947,
    ['answer.250ms'] = 190,
    ['answer.500ms'] = 39,
    ['answer.50ms'] = 1010,
    ['answer.aa'] = 142,
    ['answer.ad'] = 44,
    ['answer.cached'] = 29772,
    ['answer.cd'] = 1,
    ['answer.do'] = 1,
    ['answer.edns0'] = 5176,
    ['answer.nodata'] = 6977,
    ['answer.noerror'] = 22853,
    ['answer.nxdomain'] = 2313,
    ['answer.ra'] = 35386,
    ['answer.rd'] = 35386,
    ['answer.servfail'] = 3241,
    ['answer.slow'] = 64,
    ['answer.tc'] = 0,
    ['answer.total'] = 35386,
    ['predict.epoch'] = 7,
    ['predict.learned'] = 9,
    ['predict.queue'] = 2,
    ['query.dnssec'] = 1,
    ['query.edns'] = 5176,
    ['request.doh'] = 0,
    ['request.dot'] = 0,
    ['request.internal'] = 5174,
    ['request.tcp'] = 0,
    ['request.total'] = 35386,
    ['request.udp'] = 30212,
    ['request.xdp'] = 0,
}
Чтобы сбросить DNS кеш в knot можно использовать такую команду (обращение к любому процессу сбрасывает общий кеш).
Код:
echo 'cache.clear()'|socat - UNIX-CONNECT:/run/knot-resolver/control/1
При включенном в конфиге вебе можно даже трассировку посмотреть
Код:
http://192.168.1.1:8453/trace/:olegon.ru/
В целом очень положительные впечатления, рекомендую. Шустро, даже не думал, что без родительского кеша так быстро может работать. Нюанс, конечно, что запросы нешифрованные и при некотором старании их можно будет отлавливать, но поддерживаются всякие DoH, при желании можете настроить и рассказать здесь.
16.06.2022 20:00
Добавил файл корневых серверов, чтобы можно было пользоваться не встроенными, а обновляемым списком.
Нужно дописать строку
Код:
hints.root_file = '/etc/knot-resolver/root.hints'
А обновлять этот файлик еще проще, по заданию
Код:
curl -so /etc/knot-resolver/root.hints https://www.internic.net/domain/named.cache
18.01.2024 11:51
Пришлось отказаться от рекурсора, поскольку попереломанная сейчас сеть и некоторые ресурсы не только сами по себе недоступны, но и DNS-запросы не доходят.
После некоторых размышлений включил DoT. Для knot-resolver это делается так:
Код:
policy.add(policy.all(
  policy.TLS_FORWARD({
    {'1.0.0.1', hostname='cloudflare-dns.com'},
    {'2606:4700:4700::1001', hostname='cloudflare-dns.com'},
    {'8.8.4.4', hostname='dns.google'},
    {'2001:4860:4860::8844', hostname='dns.google'},
  })
))
Часовой пояс GMT +3, время: 14:14.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.