Вообще я достаточно длительное время был фанатом 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, при желании можете настроить и рассказать здесь.