Динамическое обновление DNS-сервера BIND при помощи Kea DHCP

2024-06-18 · 5 мин. для прочтения
blog computer-science

Динамическое обновление DNS-сервера BIND при помощи Kea DHCP.

Содержание

1 Ключи

  • Создадим ключ на сервере с BIND9:
    tsig-keygen -a HMAC-SHA512 DHCP_UPDATER > /etc/named/keys/dhcp_updater.key
    
  • Файл /etc/named/keys/dhcp_updater.key будет иметь следующий вид:
    key "DHCP_UPDATER" {
        algorithm hmac-sha512;
        secret "psFFSGdUIwK36l1G82LOw15PuIH4W5uB8h/cw7F0XDsjniBbwm/59tM+V3ydcCs15VLpe2pxlUlggWilytQqgg==";
    };
    
  • Поправим права доступа:
    chown -R named:named /etc/named/keys
    

2 Настройка DNS Bind

  • Настройка происходит в файле /etc/named.conf.
  • Ключ находится в файле /etc/named/keys/dhcp_updater.key.
  • Подключим ключ:
    include "/etc/named/keys/dhcp_updater.key";
    
  • Разрешим обновление зон:
    zone "local.zone" IN {
         type master;
         file "local.zone.db";
         allow-update { key DHCP_UPDATER; };
         update-policy {
              grant DHCP_UPDATER wildcard *.local.zone A DHCID;
         };
    };
    
    zone "0.168.192.in-addr.arpa" IN {
         type master;
         file "192.168.0.db";
         update-policy {
               grant DHCP_UPDATER wildcard *.0.168.192.in-addr.arpa PTR DHCID;
         };
    };
    
  • Сделаем проверку конфигурационного файла:
    named-checkconf
    
  • Перестартуйте сервер DNS:
    systemctl restart named.service
    

3 Настройка Kea DHCP

3.1 Ключ

  • Файл ключа назовём /etc/kea/tsig-keys.json:
    touch /etc/kea/tsig-keys.json
    
  • Перенесём ключ на сервер Kea DHCP и перепишем его в формате json:
    "tsig-keys": [
        {
           "name": "DHCP_UPDATER",
           "algorithm": "hmac-sha512",
           "secret": "psFFSGdUIwK36l1G82LOw15PuIH4W5uB8h/cw7F0XDsjniBbwm/59tM+V3ydcCs15VLpe2pxlUlggWilytQqgg=="
        }
    ],
    
  • Сменим владельца:
    chown kea:root /etc/kea/tsig-keys.json
    
  • Поправим права доступа:
    chmod 640 /etc/kea/tsig-keys.json
    

3.2 Сервис ddns

  • Настройка происходит в файле /etc/kea/kea-dhcp-ddns.conf.
  • Файл будет иметь следующий вид:
    {
        "DhcpDdns":
        {
            "ip-address": "127.0.0.1",
            "port": 53001,
            "control-socket": {
                "socket-type": "unix",
                "socket-name": "/tmp/kea-ddns-ctrl-socket"
            },
            <?include "/etc/kea/tsig-keys.json"?>
    
            "forward-ddns" : {
                "ddns-domains" : [
                    {
                        "name": "local.zone.",
                        "key-name": "DHCP_UPDATER",
                        "dns-servers": [
                            { "ip-address": "192.168.0.1" }
                        ]
                    }
                ]
            },
    
            "reverse-ddns" : {
                "ddns-domains" : [
                    {
                        "name": "0.168.192.in-addr.arpa.",
                        "key-name": "DHCP_UPDATER",
                        "dns-servers": [
                            { "ip-address": "192.168.0.1" }
                        ]
                    }
                ]
            },
    
            "loggers": [
                {
                    "name": "kea-dhcp-ddns",
                    "output_options": [
                        {
                            "output": "stdout",
                            "pattern": "%-5p %m\n"
                        }
                    ],
                    "severity": "INFO",
    
                    "debuglevel": 0
                }
            ]
        }
    }
    
  • Обратите особое внимание на точку в конце имени зоны, иначе DDNS завершится сбоем и сообщит, что не удалось найти соответствующее полное доменное имя.
  • Можно определить несколько DNS-серверов.
  • Раздел журналирования оставлен из шаблона.
  • Изменим владельца файла:
    chown kea:root /etc/kea/kea-dhcp-ddns.conf
    
  • Проверим файл на наличие возможных синтаксических ошибок:
    kea-dhcp-ddns -t /etc/kea/kea-dhcp-ddns.conf
    
  • Запустим службу ddns:
    systemctl enable --now kea-dhcp-ddns.service
    
  • Проверим статус работы службы:
    systemctl status kea-dhcp-ddns.service
    

3.3 Сервис dhcp4

3.3.1 Минимальная настройка

  • Настройка происходит в файле /etc/kea/kea-dhcp4.conf.
  • Включим динамическое обновление:
    "dhcp-ddns": {
        "enable-updates": true
    },
    
    "ddns-qualifying-suffix": "local.zone",
    "ddns-override-client-update": true,
    
  • Включаем обновления DDNS.
  • Затем мы сообщаем DHCP-серверу, каким будет DNS-суффикс по умолчанию.
    • Если клиент предоставляет только своё имя хоста, это вызывает проблемы для DDNS, поскольку он не будет знать, что такое полное доменное имя, и поэтому не будет знать, какую зону обновлять.
    • Другими словами, команда ddns-qualifying-suffix используется для указания того, какое доменное имя должно быть добавлено к имени хоста.
    • Можно определить это для каждой подсети.
  • Для параметра ddns-override-client-update устанавливается значение true, поскольку мы не хотим, чтобы клиент решал, какие записи обновлять.

3.3.2 Продвинутая настройка

  • Настройка DDNS в kea-dhcp4.conf имеет два уровня:
    • глобальные параметры подключения к демону kea-dhcp-ddns;
    • параметры поведения, которые можно задавать глобально, на уровне shared-network или subnet.
  1. Параметры подключения

    • Параметры находятся в секции dhcp-ddns верхнего уровня.
    • Определяют, как DHCP-сервер общается с DDNS.
    • Они не могут быть переопределены на уровне подсети.
      "Dhcp4": {
        "dhcp-ddns": {
          "enable-updates": true,
          "server-ip": "127.0.0.1",
          "server-port": 53001,
          "sender-ip": "",
          "sender-port": 0,
          "max-queue-size": 1024,
          "ncr-protocol": "UDP",
          "ncr-format": "JSON"
        }
      }
      
    ПараметрНазначениеЗначение по умолчанию
    enable-updatesВключает отправку NCR-запросов в DDNS. Должен быть true для работы DDNS.false
    server-ipIP-адрес, на котором DDNS слушает запросы.127.0.0.1
    server-portПорт DDNS.53001
    sender-ipIP, с которого DHCP-сервер отправляет запросы (пусто — выбрать автоматически).""
    sender-portПорт отправителя (0 — выбрать автоматически).0
    max-queue-sizeМаксимум запросов в очереди; при переполнении DDNS временно отключается.1024
    ncr-protocolПротокол для NCR. Поддерживается только UDP.UDP
    ncr-formatФормат пакета. Поддерживается только JSON.JSON
  1. Параметры поведения

    • Начиная с Kea 1.7.1 эти параметры вынесены из секции dhcp-ddns.
    • Они могут задаваться на трёх уровнях: глобально, в shared-network и в subnet4.
    • Значения наследуются сверху вниз.
      "Dhcp4": {
        "ddns-send-updates": true,
        "ddns-override-no-update": false,
        "ddns-override-client-update": false,
        "ddns-replace-client-name": "never",
        "ddns-generated-prefix": "myhost",
        "ddns-qualifying-suffix": "example.com",
        "hostname-char-set": "[^A-Za-z0-9.-]",
        "hostname-char-replacement": ""
      }
      
    ПараметрНазначениеЗначение по умолчанию
    ddns-send-updatesРазрешает/запрещает DDNS на данном уровне.true
    ddns-override-no-updateЕсли true, сервер игнорирует запрос клиент не обновлять DNS.false
    ddns-override-client-updateЕсли true, сервер берёт на себя ответственность за обновление.false
    ddns-replace-client-nameРежим формирования FQDN: never, always, when-present, when-not-present.never
    ddns-generated-prefixПрефикс для авто-генерируемых имён (по умолчанию myhost).myhost
    ddns-qualifying-suffixСуффикс домена, добавляемый к неполным именам.""
    hostname-char-setРегулярное выражение для недопустимых символов в имени хоста.[^A-Za-z0-9.-]
    hostname-char-replacementСтрока замены для недопустимых символов (пусто — удалять).""
    • enable-updates в dhcp-ddns и ddns-send-updates на соответствующем уровне должны быть true, иначе обновления не будут отправляться.
    • Режимы ddns-replace-client-name:
      • never — использовать имя клиента как есть (по умолчанию);
      • always — всегда генерировать имя на сервере;
      • when-present — заменять, только если клиент прислал имя;
      • when-not-present — использовать имя клиента, если оно есть, иначе генерировать.
    • Параметр ddns-qualifying-suffix не имеет значения по умолчанию, и если он не задан, неполные имена клиентов не будут корректно преобразованы в FQDN.
      • Его следует задать явно при включении DDNS.
  1. Пример

    {
      "Dhcp4": {
        "dhcp-ddns": {
          "enable-updates": true,
          "server-ip": "127.0.0.1",
          "server-port": 53001
        },
        "ddns-send-updates": true,
        "ddns-override-client-update": true,
        "ddns-replace-client-name": "always",
        "ddns-generated-prefix": "host",
        "ddns-qualifying-suffix": "lan.example.com",
        "subnet4": [
          {
            "subnet": "192.168.1.0/24",
            "pools": [ { "pool": "192.168.1.100 - 192.168.1.200" } ],
            "ddns-send-updates": true,
            "ddns-qualifying-suffix": "office.lan.example.com"
          }
        ]
      }
    }
    
    • Глобально DDNS включён, сервер всегда сам генерирует FQDN вида host-192-168-1-100.lan.example.com.
    • Для подсети 192.168.1.0/24 суффикс переопределён на office.lan.example.com, поэтому клиенты этой подсети получат имена вида host-192-168-1-100.office.lan.example.com.

3.4 Проверка

  • Проверим файл на наличие возможных синтаксических ошибок:
    kea-dhcp4 -t /etc/kea/kea-dhcp4.conf
    
  • Перезапустим службу, чтобы изменения вступили в силу:
    systemctl restart kea-dhcp4.service
    
  • Проверим статус:
    systemctl status kea-dhcp4.service
    
Дмитрий Сергеевич Кулябов
Authors
Профессор кафедры теории вероятностей и кибербезопасности
Работаю профессором на кафедре теории вероятностей и кибербезопасности Российского университета дружбы народов им. Патриса Лумумбы. Научные интересы относятся к области теоретической физики и математического моделирования.