ExternalDNS Webhook для MikroTik: автоматизация DNS

ExternalDNS Webhook Provider для MikroTik

Важно

Несмотря на то что программа достигла версии v1.0.0, она ещё не прошла обширного тестирования в крупных production-средах. Поэтому в ней могут присутствовать ошибки, и она может быть не вполне готова для промышленной эксплуатации.

Пожалуйста, сообщайте об обнаруженных проблемах и предлагайте улучшения — проект активно развивается. Спасибо за участие!

ExternalDNS — это дополнение (add-on) для Kubernetes, которое автоматически управляет DNS-записями для входящих маршрутов (Ingress) и сервисов кластера с помощью различных DNS-провайдеров. Данный webhook-провайдер позволяет автоматически переносить DNS-записи из ваших кластеров Kubernetes в маршрутизатор MikroTik.

Поддерживаемые типы DNS-записей: A, AAAA, CNAME, MX, NS, SRV, TXT

Примеры создания DNS-записей через CRD или через аннотации Ingress/Service можно найти в директории example/.

🎯 Требования

  • ExternalDNS >= v0.15.0

Примечание

В версии v0.15.0 ExternalDNS добавлена поддержка аннотаций providerSpecific в объектах Ingress/Service для webhook-провайдеров.

Более старые версии ExternalDNS могут работать, однако эта возможность в них недоступна.

  • MikroTik RouterOS (проверено на 7.16 stable)

Примечание

Другие версии RouterOS могут работать, но официально не тестировались. Если вам удалось успешно использовать этот webhook с другой версией ROS, оставьте комментарий в mirceanton/external-dns-provider-mikrotik#141.

На данный момент точно известно, что версия 7.16 работает, а 7.12 — нет.

🚫 Ограничения

Записи с регулярными выражениями (Regexp Records)

Webhook умеет читать записи с заданным regexp, однако сам ExternalDNS управлять ими не может. Это означает, что такие записи необходимо исключать с помощью domainFilters или excludeDomains, чтобы ExternalDNS не пытался взять на себя владение ими.

Проблема состоит в том, что с точки зрения MikroTik DNS-запись может содержать либо поле name, либо поле regexp — они взаимоисключающие.

Это создаёт трудности: даже если создать Endpoint без имени, ExternalDNS всё равно попытается создать TXT-запись для отслеживания владения. Поскольку имя TXT-записи формируется на основе имени основной записи, при его отсутствии создание TXT-записи завершается ошибкой.

Подробнее: mirceanton/external-dns-provider-mikrotik#166

⚙️ Параметры конфигурации

Настройки подключения к MikroTik

Переменная окружения Описание Значение по умолчанию

MIKROTIK_BASEURL

URL, по которому доступен RouterOS API (например, https://192.168.88.1:443)

MIKROTIK_USERNAME

Имя пользователя для аутентификации в RouterOS API

MIKROTIK_PASSWORD

Пароль для аутентификации в RouterOS API

MIKROTIK_SKIP_TLS_VERIFY

Пропускать ли проверку TLS (true или false)

false

MIKROTIK_CA_CERT

Путь к файлу собственного CA-сертификата для проверки TLS

Настройки логирования

Переменная окружения Описание Значение по умолчанию

LOG_FORMAT

Формат вывода логов (text или json)

text

LOG_LEVEL

Уровень детализации логов (debug, info, warn или error)

info

Настройки значений по умолчанию

Переменная окружения Описание Значение по умолчанию

MIKROTIK_DEFAULT_TTL

Значение TTL по умолчанию для DNS-записей, у которых TTL не задан

3600

MIKROTIK_DEFAULT_Comment

Комментарий по умолчанию для DNS-записей, у которых комментарий не задан

Настройки webhook-сервера

Переменная окружения Описание Значение по умолчанию

SERVER_HOST

Адрес хоста, на котором слушает сервер

localhost

SERVER_PORT

Порт, на котором слушает сервер

8888

SERVER_READ_TIMEOUT

Время ожидания сервера до завершения операции чтения по таймауту

SERVER_WRITE_TIMEOUT

Время ожидания сервера до завершения операции записи по таймауту

DOMAIN_FILTER

Список доменов, включаемых в фильтр

Пусто

EXCLUDE_DOMAIN_FILTER

Список доменов, исключаемых из фильтра

Пусто

REGEXP_DOMAIN_FILTER

Регулярное выражение для фильтрации доменов

Пусто

REGEXP_DOMAIN_FILTER_EXCLUSION

Регулярное выражение для исключения доменов из фильтра

Пусто

🚀 Развёртывание

  1. Создайте сервисную учётную запись в RouterOS. Этому локальному пользователю необходимы политики api и rest-api для аутентификации и работы с HTTP API RouterOS, а также политики read и write для управления статическими DNS-записями.

  2. Создайте пространство имён (namespace) Kubernetes для развёртывания External DNS:

    ---
    apiVersion: v1
    kind: Namespace
    metadata:
      name: external-dns
  3. Создайте секрет Kubernetes с параметрами подключения к экземпляру RouterOS:

    ---
    apiVersion: v1
    kind: Secret
    metadata:
      name: mikrotik-credentials
      namespace: external-dns
    stringData:
      MIKROTIK_BASEURL: "https://192.168.88.1:443"
      MIKROTIK_USERNAME: "external-dns"
      MIKROTIK_PASSWORD: "external-dns"
      MIKROTIK_SKIP_TLS_VERIFY: "true"
  4. Добавьте Helm-репозиторий External DNS и обновите локальный кэш:

    helm repo add external-dns https://kubernetes-sigs.github.io/external-dns/
    helm repo update
  5. Настройте значения Helm. Ознакомьтесь с примером файла values.yaml.

  6. Установите Helm-чарт External DNS:

    helm upgrade --install --namespace external-dns external-dns external-dns/external-dns -f values.yaml
Совет

По умолчанию поддержка записей MX, NS и SRV отключена и включается через аргумент --managed-record-types. Чтобы включить, например, SRV-записи, укажите --managed-record-types=SRV, и так далее.

⭐ Статистика звёзд


🤝 Благодарности

Спасибо всем, кто уделяет своё время сообществу Home Operations в Discord.

© 2026 meganuke