CoreDNS — это DNS-сервер/форвардер, написанный на Go, который использует цепочки плагинов. Каждый плагин выполняет определённую (DNS) функцию.
CoreDNS — это проект, выпущенный Cloud Native Computing Foundation.
CoreDNS — это быстрый и гибкий DNS-сервер. Ключевое слово здесь — гибкость: с помощью CoreDNS вы можете делать с вашими DNS-данными всё, что захотите, используя плагины. Если какая-то функциональность не предоставляется из коробки, вы можете добавить её, написав собственный плагин.CoreDNS может прослушивать DNS-запросы, поступающие по:
UDP/TCP (классический DNS).
TLS - DoT (RFC 7858).
DNS over HTTP/2 - DoH (RFC 8484).
DNS over QUIC - DoQ (RFC 9250).
gRPC (нестандартный).В настоящее время CoreDNS способен:
Предоставление зонных данных из файла; поддерживаются как DNSSEC (только NSEC), так и DNS (file и auto).
Получение зонных данных из первичных серверов, то есть работа как вторичный сервер (только AXFR) (secondary).
Подпись зонных данных на лету (dnssec).
Балансировка нагрузки ответов (loadbalance).
Разрешение на передачу зонных данных, то есть работа как первичный сервер (file + transfer).
Автоматическое загрузка файлов зон с диска (auto).
Кэширование ответов DNS (cache).
Использование etcd в качестве бэкенда (заменяет SkyDNS) (etcd).
Использование k8s (kubernetes) в качестве бэкенда (kubernetes).
Предоставление прокси для перенаправления запросов к другому (рекурсивному) серверу имен (forward).
Предоставление метрик (с использованием Prometheus) (prometheus).
Предоставление журналирования запросов (log) и ошибок (errors).
Интеграция с поставщиками облачных услуг (route53).
Поддержка класса CH: version.bind
и другие (chaos).
Поддержка опции DNS name server identifier (NSID) по RFC 5001 (nsid).
Поддержка профилирования (pprof).
Переписывание запросов (qtype, qclass и qname) (rewrite и template).
Блокировка запросов ANY (any).
Предоставление DNS64 IPv6 перевода (dns64).
И многое другое. Каждый из плагинов документирован. См. coredns.io/plugins для всех плагинов в дереве, и coredns.io/explugins для всех плагинов вне дерева.## Сборка из исходного кода
Чтобы собрать CoreDNS, предполагается, что у вас есть рабочая среда Go. См. различные туториалы, если у вас еще не настроена такая среда.
Сначала убедитесь, что ваша версия Go 1.23.0 или выше, так как требуется поддержка go mod
и других API. См. здесь для деталей go mod
.
Затем, клонируйте проект и выполните make
для сборки бинарника:
$ git clone https://github.com/coredns/coredns
$ cd coredns
$ make
ЗАМЕЧАНИЕ: дополнительные плагины могут быть включены при сборке путем установки переменной окружения
COREDNS_PLUGINS
с запятой-разделенным списком плагинов в том же формате, что и в файлеplugin.cfg
Это должно привести к созданию бинарника coredns
.
CoreDNS требует Go для сборки. Однако, если у вас уже установлена Docker и вы предпочитаете не настраивать среду Go, вы можете легко собрать CoreDNS:
docker run --rm -i -t \
-v $PWD:/go/src/github.com/coredns/coredns -w /go/src/github.com/coredns/coredns \
golang:1.22 sh -c 'GOFLAGS="-buildvcs=false" make gen && GOFLAGS="-buildvcs=false" make'
Вышеуказанный командный запрос должен сгенерировать бинарник coredns
.
При запуске CoreDNS без какого-либо конфигурационного файла, он загружает плагины
whoami и log и начинает прослушивание порта 53 (переопределите с помощью -dns.port
), он должен показывать следующее:~~~ txt
.:53
CoreDNS-1.6.6
linux/amd64, go1.16.10, aa8c32
Следующий запрос можно использовать для запроса к серверу CoreDNS, который запущен сейчас:
~~~ txt
dig @127.0.0.1 -p 53 www.example.com
Любой запрос, отправленный на порт 53, должен вернуть какую-либо информацию; ваш адрес отправки, порт и используемый протокол. Запрос также должен быть записан в стандартный вывод.
Конфигурация CoreDNS осуществляется через файл под названием Corefile
. При запуске CoreDNS он будет искать Corefile
в текущей рабочей директории. Corefile
для сервера CoreDNS, который прослушивает порт 53
и включает плагин whoami
:
.:53 {
whoami
}
Иногда порт 53 занят системными процессами. В этом случае вы можете запустить сервер CoreDNS, изменив файл Corefile
следующим образом, чтобы сервер CoreDNS запускался на порту 1053.
.:1053 {
whoami
}
Если у вас есть Corefile
, в котором не указан номер порта, по умолчанию он будет использовать порт 53, но вы можете переопределить порт с помощью флага -dns.port
: coredns -dns.port 1053
, запускает сервер на порту 1053.
Вы можете импортировать другие текстовые файлы в Corefile
с помощью директивы import. Вы можете использовать шаблоны для соответствия нескольким файлам одной директивой import.
.:53 {
import example1.txt
}
import example2.txt
~~~Вы можете использовать переменные окружения в `Corefile` с помощью `{$VARIABLE}`. Обратите внимание, что каждая переменная окружения вставляется в `Corefile` как единственный токен. Например, переменная окружения с пробелом будет воспринята как единственный токен, а не как два отдельных токена.~~~ txt
.:53 {
{$ENV_VAR}
}
Пример Corefile
для сервера CoreDNS, который перенаправляет любые запросы к верхнему DNS-серверу (например, 8.8.8.8
):
.:53 {
forward . 8.8.8.8:53
log
}
Запустите CoreDNS, а затем выполните запрос на этом порту (53). Запрос должен быть перенаправлен на 8.8.8.8, и ответ будет возвращен. Каждый запрос также должен появляться в журнале, который выводится на стандартный вывод.
Чтобы обслуживать (NSEC) DNSSEC-подписанный example.org
на порту 1053, с ошибками и логированием, отправляемыми на стандартный вывод. Разрешите перенос зон всем, но укажите конкретно один IP-адрес, чтобы CoreDNS мог отправлять уведомления на него.
example.org:1053 {
file /var/lib/coredns/example.org.signed
transfer {
to * 2001:500:8f::53
}
errors
log
}
Обслуживание example.org
на порту 1053, но перенаправление всего, что не соответствует example.org
, на рекурсивный nameserver и переписывание запросов ANY в HINFO.
example.org:1053 {
file /var/lib/coredns/example.org.signed
transfer {
to * 2001:500:8f::53
}
errors
log
}
. {
any
forward . 8.8.8.8:53
errors
log
}
IP-адреса также допускаются. Они автоматически преобразуются в обратные зоны:
10.0.0.0/24 {
whoami
}
Значит, вы являетесь авторитетным источником для 0.0.10.in-addr.arpa.
. Это также работает для IPv6-адресов. Если по какой-то причине вы хотите обслуживать зону с именем 10.0.0.0/24
, добавьте закрывающую точку: 10.0.0.0/24.
для прекращения конвертации.Это работает и для CIDR (см. RFC 1518 и 1519), то есть для 10.0.0.0/25
, CoreDNS затем будет проверять, попадает ли запрос in-addr
в правильный диапазон.
Слушание на TLS (DoT) и для gRPC? Используйте:
tls://example.org grpc://example.org {
whoami
}
Аналогично, для QUIC (DoQ):
quic://example.org {
whoami
tls mycert mykey
}
И для DNS over HTTP/2 (DoH) используйте:
https://example.org {
whoami
tls mycert mykey
}
В этом конфигурационном файле CoreDNS будет отвечать за завершение TLS.
Вы также можете запустить DNS-сервер, обслуживающий DoH без завершения TLS (простой HTTP), но будьте осторожны, так как в таком сценарии перед CoreDNS-экземпляром должен быть прокси-сервер для завершения TLS, который перенаправляет DNS-запросы, иначе клиенты не смогут общаться с сервером по протоколу DoH.
https://example.org {
whoami
}
Указание портов работает аналогичным образом:
grpc://example.org:1443 https://example.org:1444 {
# ...
}
Когда транспортный протокол не указан, предполагается по умолчанию dns://
.
Мы наиболее активны на GitHub (и Slack):
Более ресурсов можно найти:
Если вы хотите внести вклад в CoreDNS, убедитесь, что вы ознакомились с правилами вклада.## Развертывание
Примеры развертывания через systemd и другие сценарии можно найти в репозитории развертывания.
Когда в CoreDNS происходит обратно-несовместимое изменение, используется следующий процесс:
Третьими лицами проведены аудиты безопасности:
security@coredns.io
. Отчеты о уязвимостях безопасности очень ценны, и мы публично поблагодарим вас за это.Пожалуйста, обратитесь к документу по раскрытию уязвимостей безопасности и процессу выпуска исправлений и версий
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )