Skip to main content

Установка DNS сервера Bind9 на UbuntuServer 24.04 с WebMin в Proxmox

Развёртывание DNS-сервера BIND9 для OT-сети Самара

Статус документа: рабочая пошаговая инструкция, основанная на фактически выполненной и проверенной установке.

Редакция: 8, состояние проекта на 29.07.2026.

Текущее состояние: BIND9 работает как выделенный авторитетный DNS для одной прямой и восьми обратных OT-зон; рекурсия и forwarder отключены. Доступ к DNS проверен с реальных Windows-клиентов во всех подключённых сетях. Webmin установлен и проверен как веб-интерфейс управления существующей конфигурацией BIND. DDNS пока выключен: во всех рабочих зонах используется allow-update { none; };.

1. Концепция проекта: что строим и как это работает

1.1. Задача проекта

В OT-сетях много устройств со статическими IP-адресами. Запоминать и сопровождать только адреса неудобно, поэтому создаётся собственная DNS-зона ot-samara.baltika.ru и набор обратных зон. В результате инженер может обращаться к оборудованию по понятному имени, а по IP-адресу можно определить зарегистрированное имя.

Имя оборудования → A-запись → IP-адрес
IP-адрес          → PTR-запись → имя оборудования

Один экземпляр BIND9 обслуживает несколько OT-подсетей. У виртуальной машины есть отдельный локальный DNS-адрес в каждой сети, поэтому клиент обращается к адресу своего сегмента и не зависит от межвлановой маршрутизации.

1.2. Инструменты, лицензии и назначение

Компонент Для чего используется Стоимость и лицензирование
Proxmox VE Запускает отдельную виртуальную машину DNS и подключает её виртуальные сетевые карты к нужным bridge/VLAN. Свободное ПО AGPLv3; использовать можно без платы. Платная подписка нужна только для enterprise-репозитория и коммерческой поддержки. Официальное описание.
Ubuntu Server 24.04 LTS Гостевая операционная система, в которой работают BIND9, UFW, Webmin и диагностические утилиты. Свободно скачивается и используется; стандартная поддержка LTS предоставляется бесплатно, Ubuntu Pro является дополнительной услугой. Официальная страница.
BIND9 Авторитетный DNS-сервер: хранит зоны и отвечает на запросы A, CNAME, PTR, NS и SOA; позднее сможет принимать DDNS. Свободное ПО под MPL 2.0, отдельная лицензия не требуется. Официальная страница ISC.
Webmin Веб-интерфейс для редкого ручного добавления и изменения DNS-записей, просмотра служб и базового администрирования. Свободное ПО под BSD-3-Clause, отдельная лицензия не требуется. Официальное описание.
UFW Host firewall: разрешает DNS только из нужных OT-сетей, а SSH и Webmin — только из management-сетей. Входит в репозиторий Ubuntu; отдельной платы нет.
systemd, rndc, dig, named-checkconf, named-checkzone, tcpdump Управление службами, безопасное перечитывание BIND, проверка синтаксиса, DNS-тесты и анализ трафика. Штатные свободные компоненты Ubuntu/BIND, отдельной платы нет.
QEMU Guest Agent Передаёт Proxmox сведения о гостевой системе и обеспечивает корректное взаимодействие с ВМ. Свободный пакет из Ubuntu, отдельной платы нет.
BookStack Хранит эту инструкцию, схему адресации, правила эксплуатации и историю решений. В DNS-службу не входит. Свободное ПО под MIT License. Официальное описание.
Windows-клиенты Проверяют прямое и обратное разрешение; позднее компьютеры со статическими IP смогут самостоятельно выполнять DDNS. Используются уже имеющиеся лицензированные ОС; в стоимость серверного решения не входят.

Итог по стоимости: весь серверный программный стек можно развернуть без лицензионных платежей. Платными остаются только необязательная коммерческая поддержка/подписки и существующие лицензии Windows.

1.3. Как проходит обычный DNS-запрос

OT-клиент
  ↓ UDP/53 или TCP/53 на локальный DNS-адрес своей подсети
UFW
  ↓ проверяет входной интерфейс, сеть источника, адрес назначения и порт
BIND9
  ↓ читает авторитетную прямую или обратную зону
Ответ клиенту: IP по имени или имя по IP

Для имён из ot-samara.baltika.ru сервер отвечает авторитетно. Для внешних доменов он возвращает REFUSED, потому что рекурсия и пересылка запросов намеренно отключены.

1.4. Как выполняется администрирование

Компьютер администратора
  ↓ HTTPS/TCP 10000 через management-сеть
Webmin
  ↓ изменяет существующие конфигурационные файлы и файлы зон BIND
Проверка named-checkzone / named-checkconf
  ↓
rndc reload или Apply Configuration
  ↓
BIND9 начинает отвечать новой версией зоны

Webmin не заменяет BIND9 и не хранит отдельную базу DNS-записей: он управляет теми же файлами, которые можно проверять и обслуживать из Linux CLI. Поэтому после изменений всегда выполняются проверка синтаксиса и контрольный запрос через dig.

1.5. Текущий и планируемый режим наполнения зон

Этап Как появляются записи
Сейчас Все зоны статические, allow-update { none; };. Редкие записи оборудования добавляются вручную через Webmin или CLI.
Позднее Windows-компьютеры со статическими IP и DNS-суффиксом ot-samara.baltika.ru смогут регистрировать свои A/PTR через DDNS. ПЛК, HMI, счётчики и другое оборудование без DDNS продолжат добавляться вручную.

Сервер не выполняет функции DHCP, маршрутизатора или публичного recursive DNS. Он является специализированным DNS-сервисом для OT.

1.6. Как устроены исполняемые примеры в этой инструкции

Команды создания конфигураций приведены в исполняемом виде: с точными путями, именами интерфейсов, IP-адресами, зонами и комментариями для каждой сети. Для записи файлов используется команда tee с heredoc: содержимое между строками EOF записывается в указанный файл без подстановки переменных оболочки.

Важно: блоки «ожидаемый результат» не вводятся в терминал. Конфигурация Proxmox-хоста не заменяется готовым /etc/network/interfaces, потому что этот файл содержит посторонние для DNS-сервера bridge, адреса и физические интерфейсы конкретного узла. Для Proxmox приведена точная карта уже используемых bridge, VLAN-подинтерфейсов, VM netX и MAC-адресов.


2. Принятая архитектура

DNS-сервер разворачивается на отдельной виртуальной машине в Proxmox VE. BIND9 устанавливается нативно из репозитория Ubuntu, без Docker.

Параметр Значение
Имя виртуальной машины SMR-SRV-OT-DNS
Hostname Ubuntu smr-srv-ot-dns
Операционная система Ubuntu Server 24.04.4 LTS
DNS-сервер BIND9, нативная установка
Режим DNS Авторитетный сервер только для собственных OT-зон
Рекурсия Отключена
Forwarder Не используется
Контейнеризация Не используется
Назначение ВМ DNS, диагностика и системное администрирование
Веб-интерфейс администрирования Webmin 2.653, HTTPS/TCP 10000, доступ только из management-сетей

Нативная установка выбрана намеренно: виртуальная машина уже обеспечивает изоляцию, а работа с несколькими IP-адресами, файлами зон, systemd, rndc и будущими журналами DDNS .jnl остаётся прозрачной.

2.1. Авторитетный режим без рекурсии

Сервер отвечает только за зоны, перечисленные в /etc/bind/named.conf.local. Для внешних доменов, например ubuntu.com, сервер возвращает REFUSED.

OT-клиент → запрос имени из ot-samara.baltika.ru → локальный авторитетный ответ
OT-клиент → запрос внешнего имени             → REFUSED

Это исключает зависимость от внешнего DNS и не превращает OT-сервер в рекурсивный resolver.


3. План DNS-зон

3.1. Прямая зона

ot-samara.baltika.ru

Примеры имён оборудования:

plc-brew-001.ot-samara.baltika.ru
hmi-brew-001.ot-samara.baltika.ru
plc-fill-001.ot-samara.baltika.ru
hmi-util-001.ot-samara.baltika.ru

3.2. Обратные зоны

IP-сеть Назначение Обратная DNS-зона
10.255.0.0/16 Legacy OT 255.10.in-addr.arpa
172.16.66.0/24 Пивопроизводство, первая половина /23 66.16.172.in-addr.arpa
172.16.67.0/24 Пивопроизводство, вторая половина /23 67.16.172.in-addr.arpa
172.16.68.0/24 Розлив, первая половина /23 68.16.172.in-addr.arpa
172.16.69.0/24 Розлив, вторая половина /23 69.16.172.in-addr.arpa
172.16.70.0/24 Утилиты, первая половина /23 70.16.172.in-addr.arpa
172.16.71.0/24 Утилиты, вторая половина /23 71.16.172.in-addr.arpa
172.17.14.0/24 АСТУЭ, VLAN 2006 14.17.172.in-addr.arpa

В домене in-addr.arpa октеты записываются в обратном порядке. Поэтому для сети 10.255.0.0/16 используется зона 255.10.in-addr.arpa, а не 10.255.in-addr.arpa.

Каждая сеть /23 состоит из двух соседних сетей /24, поэтому для неё создаются две стандартные обратные зоны.


4. Сетевая схема

4.1. Текущее состояние OT-сети

Сеть VLAN Состояние
10.255.0.0/16 VLAN 1 Действующая legacy-сеть
172.16.66.0/23 VLAN 1 Действующая производственная сеть

Обе подсети пока находятся в одном L2-домене и назначены одному интерфейсу Ubuntu.

4.2. Состояние после модернизации

Сеть VLAN Назначение Локальный DNS-адрес
172.16.66.0/23 2030 Пивопроизводство 172.16.66.53
172.16.68.0/23 2002 Розлив 172.16.68.53
172.16.70.0/23 2040 Утилиты 172.16.70.53
172.17.14.0/24 2006 АСТУЭ 172.17.14.53
10.255.0.0/16 1 Legacy OT на переходный период 10.255.0.53

4.3. Адреса управления

Этап Адрес Шлюз Назначение
Развёртывание 192.168.1.53/24 192.168.1.1 Временное управление, обновления и доступ в Интернет
Production 10.44.100.228/24 10.44.100.1 Постоянное управление сервером; default route пока не активирован

На сервере должен быть только один маршрут по умолчанию. Сейчас активен маршрут через ens18 → 192.168.1.1. Будущий маршрут через ens23 → 10.44.100.1 оставлен в Netplan комментарием.

4.4. Важное ограничение маршрутизации

ВМ многосетевая, но не является маршрутизатором:

net.ipv4.ip_forward = 0
net.ipv6.conf.all.forwarding = 0

На OT-интерфейсах шлюзы не назначаются. Каждый OT-клиент обращается к DNS-адресу своей локальной подсети.


5. Proxmox и интерфейсы виртуальной машины

5.1. Рабочая схема bridge

Ubuntu MAC Proxmox Назначение Адрес
ens18 BC:24:11:AE:75:CD net0 / vmbr0 Временное управление 192.168.1.53/24
ens19 BC:24:11:DB:4F:A2 net1 / vmbr7 / nic1.2006 VLAN 2006, АСТУЭ 172.17.14.53/24
ens20 BC:24:11:6B:32:0E net2 / vmbr3 / nic1.2002 VLAN 2002, Розлив 172.16.68.53/23
ens21 BC:24:11:E4:E6:A9 net3 / vmbr4 / nic1.2030 VLAN 2030, Пивопроизводство Пока без IPv4; позднее 172.16.66.53/23
ens22 BC:24:11:32:D6:01 net4 / vmbr5 / nic1.2040 VLAN 2040, Утилиты 172.16.70.53/23
ens23 BC:24:11:D1:4C:AE net5 / vmbr1 / nic1.2100 Production management 10.44.100.228/24
enp2s1 BC:24:11:7E:0F:4D net6 / vmbr6 / nic2 Untagged access VLAN 1 10.255.0.53/16, 172.16.66.53/23

5.2. Почему VLAN 1 подключён через отдельный физический access-порт

Рабочий путь VLAN 1:

Коммутатор: access VLAN 1 / PVID 1
    ↓ untagged Ethernet
Proxmox nic2
    ↓
vmbr6
    ↓
VM net6
    ↓
Ubuntu enp2s1

Предыдущая схема nic1.1 → vmbr2 была удалена. Linux-подинтерфейс nic1.1 ожидает кадры с тегом VLAN 1, тогда как access/native VLAN 1 приходит без тега.

5.3. Подключение VLAN 2006 для АСТУЭ

Рабочий путь VLAN 2006:

Коммутатор: tagged VLAN 2006
    ↓
Proxmox nic1.2006
    ↓ тег снимается на Linux VLAN-интерфейсе
vmbr7
    ↓
VM net1, MAC BC:24:11:DB:4F:A2
    ↓ обычный нетегированный Ethernet внутри ВМ
Ubuntu ens19 → 172.17.14.53/24

VLAN-интерфейс внутри Ubuntu создавать не требуется. Тег 2006 обрабатывается Proxmox на nic1.2006, а гостевая система получает обычный виртуальный Ethernet-интерфейс ens19.

5.4. Состояние физического линка и виртуального интерфейса

Внутри ВМ интерфейс может показывать UP, LOWER_UP даже при отключённом кабеле nic2. Гостевая ОС видит виртуальный VirtIO/tap-порт, а не физический carrier хоста.

Физический линк проверяется на Proxmox:

carrier = 0 означает отключённый физический линк, carrier = 1 — подключённый.

5.5. Правило миграции VLAN 2030

Адрес 172.16.66.53/23 нельзя одновременно назначать интерфейсам enp2s1 и ens21. Во время миграции он удаляется с VLAN 1 и в том же изменении назначается интерфейсу VLAN 2030.


6. Параметры виртуальной машины и установка Ubuntu

Ресурс Значение
CPU 2 vCPU
RAM 4 ГБ
Диск 32 ГБ
Дисковый контроллер VirtIO SCSI
Сетевые карты VirtIO
QEMU Guest Agent Включён в настройках ВМ

Параметры установщика:

  • hostname: smr-srv-ot-dns;
  • установить OpenSSH Server;
  • не устанавливать Docker и дополнительные snaps;
  • во время установки активировать только management-интерфейс;
  • на остальных интерфейсах отключить DHCP.

6.1. Установка hostname после первого входа

Даже если hostname уже задан установщиком, команда ниже приводит его к проектному значению и сразу показывает результат.

# hostnamectl меняет статическое имя узла через systemd-hostnamed.
sudo hostnamectl set-hostname smr-srv-ot-dns

# Проверяем короткое имя и полное состояние hostname.
hostname
hostnamectl status

7. Базовая подготовка Ubuntu

7.1. Обновление системы

sudo apt update
sudo apt full-upgrade -y

apt update обновляет индекс пакетов. apt full-upgrade устанавливает обновления и при необходимости корректно изменяет зависимости.

Перезагрузка выполняется только тогда, когда система её запросила. Проверка:

# -f проверяет существование обычного файла.
if [ -f /var/run/reboot-required ]; then
  cat /var/run/reboot-required.pkgs
  systemctl reboot
fi

После загрузки повторно проверяются сеть, named, webmin, конфигурация зон и контрольные запросы dig. Конкретный пакет, который потребовал reboot на отдельной установке, для универсальной инструкции несущественен.

7.2. Базовые пакеты

sudo apt install -y \
  ca-certificates \
  curl \
  nano \
  openssl \
  iputils-ping \
  tcpdump \
  arping \
  bash-completion \
  lsof \
  qemu-guest-agent \
  systemd-timesyncd \
  ufw
Пакет Назначение
ca-certificates Проверка TLS-сертификатов
curl Проверка HTTP/HTTPS и получение файлов
nano Редактирование конфигурационных файлов
openssl Криптографические операции и диагностика TLS
iputils-ping Проверка IP-доступности
tcpdump Анализ DNS, ARP, ICMP и NTP-трафика
arping Проверка адресных конфликтов и L2-доступности
bash-completion Автодополнение команд
lsof Поиск процессов, использующих файлы и порты
qemu-guest-agent Интеграция Ubuntu с Proxmox
systemd-timesyncd Синхронизация системного времени
ufw Host firewall

8. QEMU Guest Agent

systemctl status qemu-guest-agent --no-pager
ls -l /dev/virtio-ports/

Ожидается:

Active: active (running)
/dev/virtio-ports/org.qemu.guest_agent.0

Служба может иметь тип static. Это нормально: она запускается при наличии virtio-канала, созданного Proxmox.


9. Часовой пояс и NTP

9.1. Часовой пояс

sudo timedatectl set-timezone Europe/Samara
sudo timedatectl set-local-rtc 0
sudo timedatectl set-ntp true

9.2. Временный NTP

sudo install -d -m 0755 /etc/systemd/timesyncd.conf.d

sudo tee /etc/systemd/timesyncd.conf.d/10-internal-ntp.conf >/dev/null <<'EOF'
[Time]
NTP=ntp.ubuntu.com
FallbackNTP=
EOF

sudo systemctl restart systemd-timesyncd

9.3. Проверка

timedatectl status
timedatectl timesync-status
systemctl status systemd-timesyncd --no-pager
journalctl -u systemd-timesyncd --since "5 minutes ago" --no-pager

Подтверждённое состояние: часы синхронизированы, источник ntp.ubuntu.com, stratum 2.

9.4. Production NTP

После окончательного перевода default route в production management планируются серверы:

10.44.14.34
10.44.14.33

Потребуется маршрут от 10.44.100.228 и разрешение UDP/123. Пока default route остаётся через ens18, эта замена не выполняется.


10. Netplan

10.1. Отключение управления сетью со стороны cloud-init

sudo tee /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg >/dev/null <<'EOF'
network: {config: disabled}
EOF

sudo mv /etc/netplan/50-cloud-init.yaml /etc/netplan/50-cloud-init.yaml.disabled

10.2. Актуальный файл /etc/netplan/01-ot-dns.yaml

Создаём файл целиком одной командой:

# tee получает текст из heredoc и полностью записывает файл Netplan.
# Кавычки в <<'EOF' запрещают shell подставлять переменные внутри YAML.
sudo tee /etc/netplan/01-ot-dns.yaml >/dev/null <<'EOF'
network:
  version: 2
  renderer: networkd

  ethernets:
    # Временная management-сеть и единственный действующий default route.
    ens18:
      dhcp4: false
      dhcp6: false
      addresses:
        - 192.168.1.53/24
      nameservers:
        addresses:
          - 192.168.1.1
      routes:
        - to: default
          via: 192.168.1.1

    # АСТУЭ, VLAN 2006 через Proxmox vmbr7 / nic1.2006.
    ens19:
      dhcp4: false
      dhcp6: false
      accept-ra: false
      link-local: []
      optional: true
      addresses:
        - 172.17.14.53/24

    # Legacy OT и временное Пивопроизводство в untagged VLAN 1.
    enp2s1:
      dhcp4: false
      dhcp6: false
      accept-ra: false
      link-local: []
      optional: true
      addresses:
        - 10.255.0.53/16
        - 172.16.66.53/23

    # Розлив, VLAN 2002 через Proxmox vmbr3 / nic1.2002.
    ens20:
      dhcp4: false
      dhcp6: false
      accept-ra: false
      link-local: []
      optional: true
      addresses:
        - 172.16.68.53/23

    # Будущее Пивопроизводство, VLAN 2030 через vmbr4 / nic1.2030.
    # Адрес нельзя включать, пока 172.16.66.53/23 назначен enp2s1.
    ens21:
      dhcp4: false
      dhcp6: false
      accept-ra: false
      link-local: []
      optional: true
      # addresses:
      #   - 172.16.66.53/23

    # Утилиты, VLAN 2040 через Proxmox vmbr5 / nic1.2040.
    ens22:
      dhcp4: false
      dhcp6: false
      accept-ra: false
      link-local: []
      optional: true
      addresses:
        - 172.16.70.53/23

    # Production management, VLAN 2100 через vmbr1 / nic1.2100.
    ens23:
      dhcp4: false
      dhcp6: false
      accept-ra: false
      link-local: []
      optional: true
      addresses:
        - 10.44.100.228/24

      # Будущий production default route.
      # Включается одновременно с удалением default route у ens18.
      # routes:
      #   - to: default
      #     via: 10.44.100.1
EOF

10.3. Безопасное применение

sudo chmod 600 /etc/netplan/01-ot-dns.yaml
sudo netplan generate
sudo netplan try --timeout 120

netplan try временно применяет конфигурацию и автоматически откатывает её, если администратор не подтвердит изменения.

10.4. Подтверждённое состояние

ens18   192.168.1.53/24
ens19   172.17.14.53/24
enp2s1  10.255.0.53/16 172.16.66.53/23
ens20   172.16.68.53/23
ens21   без IPv4
ens22   172.16.70.53/23
ens23   10.44.100.228/24

Активный маршрут по умолчанию:

default via 192.168.1.1 dev ens18

Проверена доступность production management: 10.44.100.225, 10.44.100.1 и 10.44.100.210 отвечают через ens23. Для АСТУЭ подтверждён связанный маршрут 172.17.14.0/24 dev ens19 src 172.17.14.53; единственный default route остался через ens18.


11. Запрет маршрутизации и UFW

11.1. IP forwarding

sudo tee /etc/sysctl.d/90-ot-dns-no-forwarding.conf >/dev/null <<'EOF'
net.ipv4.ip_forward=0
net.ipv6.conf.all.forwarding=0
EOF

sudo sysctl --system

Проверка:

sysctl net.ipv4.ip_forward
sysctl net.ipv6.conf.all.forwarding

11.2. Текущие правила UFW

sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw default deny routed

sudo ufw allow in on ens18 proto tcp \
  from 192.168.1.0/24 to 192.168.1.53 port 22 \
  comment 'SSH temporary management network'

sudo ufw allow in on ens23 proto tcp \
  from 10.44.100.0/24 to 10.44.100.228 port 22 \
  comment 'SSH production management network'

sudo ufw enable
sudo ufw status verbose

Подтверждённое состояние:

Status: active
Default: deny (incoming), allow (outgoing), disabled (routed)

11.3. DNS-правила UFW — применены

Для каждого DNS-адреса разрешены оба штатных транспортных протокола DNS: UDP/53 и TCP/53. Правила ограничены одновременно входным интерфейсом, сетью источника, адресом назначения и портом.

Сеть клиентов Входной интерфейс DNS-адрес Состояние
10.255.0.0/16 enp2s1 10.255.0.53 Действующее правило VLAN 1
172.16.66.0/23 enp2s1 172.16.66.53 Действующее временное правило VLAN 1
172.16.68.0/23 ens20 172.16.68.53 Действующее правило VLAN 2002
172.16.70.0/23 ens22 172.16.70.53 Действующее правило VLAN 2040
172.16.66.0/23 ens21 172.16.66.53 Подготовлено для будущего VLAN 2030
172.17.14.0/24 ens19 172.17.14.53 Действующее правило VLAN 2006, АСТУЭ
# Legacy OT, VLAN 1
sudo ufw allow in on enp2s1 proto udp \
  from 10.255.0.0/16 to 10.255.0.53 port 53 \
  comment 'DNS legacy OT UDP'

sudo ufw allow in on enp2s1 proto tcp \
  from 10.255.0.0/16 to 10.255.0.53 port 53 \
  comment 'DNS legacy OT TCP'

# Пивопроизводство, временно VLAN 1
sudo ufw allow in on enp2s1 proto udp \
  from 172.16.66.0/23 to 172.16.66.53 port 53 \
  comment 'DNS beer production current VLAN1 UDP'

sudo ufw allow in on enp2s1 proto tcp \
  from 172.16.66.0/23 to 172.16.66.53 port 53 \
  comment 'DNS beer production current VLAN1 TCP'

# Розлив, VLAN 2002
sudo ufw allow in on ens20 proto udp \
  from 172.16.68.0/23 to 172.16.68.53 port 53 \
  comment 'DNS bottling VLAN2002 UDP'

sudo ufw allow in on ens20 proto tcp \
  from 172.16.68.0/23 to 172.16.68.53 port 53 \
  comment 'DNS bottling VLAN2002 TCP'

# Утилиты, VLAN 2040
sudo ufw allow in on ens22 proto udp \
  from 172.16.70.0/23 to 172.16.70.53 port 53 \
  comment 'DNS utilities VLAN2040 UDP'

sudo ufw allow in on ens22 proto tcp \
  from 172.16.70.0/23 to 172.16.70.53 port 53 \
  comment 'DNS utilities VLAN2040 TCP'

# Пивопроизводство, будущее подключение VLAN 2030
sudo ufw allow in on ens21 proto udp \
  from 172.16.66.0/23 to 172.16.66.53 port 53 \
  comment 'DNS beer production future VLAN2030 UDP'

sudo ufw allow in on ens21 proto tcp \
  from 172.16.66.0/23 to 172.16.66.53 port 53 \
  comment 'DNS beer production future VLAN2030 TCP'

# АСТУЭ, VLAN 2006
sudo ufw allow in on ens19 proto udp \
  from 172.17.14.0/24 to 172.17.14.53 port 53 \
  comment 'DNS ASTUE VLAN2006 UDP'

sudo ufw allow in on ens19 proto tcp \
  from 172.17.14.0/24 to 172.17.14.53 port 53 \
  comment 'DNS ASTUE VLAN2006 TCP'

sudo ufw reload
sudo ufw status numbered
sudo ufw show added

Правила на ens21 не переносят IP-адрес и не создают прослушивающий сокет. Пока 172.16.66.53/23 находится на enp2s1, они фактически бездействуют. После миграции адреса в VLAN 2030 они начнут применяться автоматически.

После окончательной миграции два старых правила для 172.16.66.53 на enp2s1 необходимо удалить. Порт 53 на management-интерфейсах ens18 и ens23 не открывается.

11.4. Проверка firewall и локальных DNS-сокетов

sudo ufw status numbered
sudo ufw show added
systemctl is-active named
sudo ss -lntup | grep named
sudo journalctl -u named --since "10 minutes ago" --no-pager

Подтверждено: UFW активен, правила применены, служба named активна и слушает OT-адреса по UDP и TCP.

Локально успешно выполнены следующие проверки:

# UDP через сервисный адрес VLAN 1
dig @10.255.0.53 ot-samara.baltika.ru SOA +norecurse

# TCP через сервисный адрес VLAN 1
dig @10.255.0.53 ot-samara.baltika.ru SOA +tcp +norecurse

# UDP через сервисный адрес VLAN 2002
dig @172.16.68.53 ot-samara.baltika.ru SOA +norecurse

# UDP через сервисный адрес АСТУЭ, VLAN 2006
dig @172.17.14.53 ot-samara.baltika.ru SOA +norecurse

# TCP через сервисный адрес АСТУЭ, VLAN 2006
dig @172.17.14.53 14.17.172.in-addr.arpa SOA +tcp +norecurse

Ожидаемые и фактически полученные признаки:

status: NOERROR
flags: qr aa

Ограничение локальной проверки: запрос к собственному IP-адресу сервера обрабатывается ядром как локальный маршрут и не доказывает прохождение пакета через физический OT-интерфейс, VLAN и интерфейсное правило UFW. Полная end-to-end-проверка выполняется только с отдельного хоста соответствующей OT-сети.

Проверка BIND через каждый конкретный сервисный адрес. Здесь запрос выполняется локально на сервере; он проверяет сокет BIND и зону, но не заменяет end-to-end-тест с удалённого клиента.

# Legacy OT, VLAN 1.
dig @10.255.0.53 ot-samara.baltika.ru SOA +norecurse
dig @10.255.0.53 ot-samara.baltika.ru SOA +tcp +norecurse

# Пивопроизводство, сейчас VLAN 1.
dig @172.16.66.53 ot-samara.baltika.ru SOA +norecurse
dig @172.16.66.53 ot-samara.baltika.ru SOA +tcp +norecurse

# Розлив, VLAN 2002.
dig @172.16.68.53 ot-samara.baltika.ru SOA +norecurse
dig @172.16.68.53 ot-samara.baltika.ru SOA +tcp +norecurse

# Утилиты, VLAN 2040.
dig @172.16.70.53 ot-samara.baltika.ru SOA +norecurse
dig @172.16.70.53 ot-samara.baltika.ru SOA +tcp +norecurse

# АСТУЭ, VLAN 2006.
dig @172.17.14.53 ot-samara.baltika.ru SOA +norecurse
dig @172.17.14.53 ot-samara.baltika.ru SOA +tcp +norecurse

11.5. End-to-end-проверка с OT-клиентов — выполнена

Каждый блок выполняется в PowerShell на Windows-клиенте, физически подключённом к указанной сети. Проверяются авторитетный A-ответ, PTR локального DNS-адреса, DNS по TCP и доступность TCP/53. Параметр -DnsOnly исключает LLMNR/NetBIOS, а -TcpOnly принудительно использует DNS over TCP.

Сеть Назначение DNS-адрес Результат
10.255.0.0/16 Legacy OT, VLAN 1 10.255.0.53 A/PTR/UDP/TCP успешно
172.16.66.0/23 Пивопроизводство, временно VLAN 1 172.16.66.53 A/PTR/UDP/TCP успешно
172.16.68.0/23 Розлив, VLAN 2002 172.16.68.53 A/PTR/UDP/TCP успешно
172.16.70.0/23 Утилиты, VLAN 2040 172.16.70.53 A/PTR/UDP/TCP успешно
172.17.14.0/24 АСТУЭ, VLAN 2006 172.17.14.53 A/PTR/UDP/TCP успешно

11.5.1. Legacy OT — 10.255.0.0/16, VLAN 1

# Прямая запись: имя DNS-сервера должно вернуть RRset из пяти A-адресов.
Resolve-DnsName `
  -Name smr-srv-ot-dns.ot-samara.baltika.ru `
  -Type A `
  -Server 10.255.0.53 `
  -DnsOnly

# Обратная запись: локальный DNS-адрес должен вернуть имя сервера.
Resolve-DnsName `
  -Name 10.255.0.53 `
  -Type PTR `
  -Server 10.255.0.53 `
  -DnsOnly

# Содержательная проверка DNS по TCP.
Resolve-DnsName `
  -Name smr-srv-ot-dns.ot-samara.baltika.ru `
  -Type A `
  -Server 10.255.0.53 `
  -DnsOnly `
  -TcpOnly

# Проверка установки TCP-соединения на порт 53.
Test-NetConnection `
  -ComputerName 10.255.0.53 `
  -Port 53 `
  -InformationLevel Detailed

11.5.2. Пивопроизводство — 172.16.66.0/23, временно VLAN 1

# Прямая запись: имя DNS-сервера должно вернуть RRset из пяти A-адресов.
Resolve-DnsName `
  -Name smr-srv-ot-dns.ot-samara.baltika.ru `
  -Type A `
  -Server 172.16.66.53 `
  -DnsOnly

# Обратная запись: локальный DNS-адрес должен вернуть имя сервера.
Resolve-DnsName `
  -Name 172.16.66.53 `
  -Type PTR `
  -Server 172.16.66.53 `
  -DnsOnly

# Содержательная проверка DNS по TCP.
Resolve-DnsName `
  -Name smr-srv-ot-dns.ot-samara.baltika.ru `
  -Type A `
  -Server 172.16.66.53 `
  -DnsOnly `
  -TcpOnly

# Проверка установки TCP-соединения на порт 53.
Test-NetConnection `
  -ComputerName 172.16.66.53 `
  -Port 53 `
  -InformationLevel Detailed

11.5.3. Розлив — 172.16.68.0/23, VLAN 2002

# Прямая запись: имя DNS-сервера должно вернуть RRset из пяти A-адресов.
Resolve-DnsName `
  -Name smr-srv-ot-dns.ot-samara.baltika.ru `
  -Type A `
  -Server 172.16.68.53 `
  -DnsOnly

# Обратная запись: локальный DNS-адрес должен вернуть имя сервера.
Resolve-DnsName `
  -Name 172.16.68.53 `
  -Type PTR `
  -Server 172.16.68.53 `
  -DnsOnly

# Содержательная проверка DNS по TCP.
Resolve-DnsName `
  -Name smr-srv-ot-dns.ot-samara.baltika.ru `
  -Type A `
  -Server 172.16.68.53 `
  -DnsOnly `
  -TcpOnly

# Проверка установки TCP-соединения на порт 53.
Test-NetConnection `
  -ComputerName 172.16.68.53 `
  -Port 53 `
  -InformationLevel Detailed

11.5.4. Утилиты — 172.16.70.0/23, VLAN 2040

# Прямая запись: имя DNS-сервера должно вернуть RRset из пяти A-адресов.
Resolve-DnsName `
  -Name smr-srv-ot-dns.ot-samara.baltika.ru `
  -Type A `
  -Server 172.16.70.53 `
  -DnsOnly

# Обратная запись: локальный DNS-адрес должен вернуть имя сервера.
Resolve-DnsName `
  -Name 172.16.70.53 `
  -Type PTR `
  -Server 172.16.70.53 `
  -DnsOnly

# Содержательная проверка DNS по TCP.
Resolve-DnsName `
  -Name smr-srv-ot-dns.ot-samara.baltika.ru `
  -Type A `
  -Server 172.16.70.53 `
  -DnsOnly `
  -TcpOnly

# Проверка установки TCP-соединения на порт 53.
Test-NetConnection `
  -ComputerName 172.16.70.53 `
  -Port 53 `
  -InformationLevel Detailed

11.5.5. АСТУЭ — 172.17.14.0/24, VLAN 2006

# Прямая запись: имя DNS-сервера должно вернуть RRset из пяти A-адресов.
Resolve-DnsName `
  -Name smr-srv-ot-dns.ot-samara.baltika.ru `
  -Type A `
  -Server 172.17.14.53 `
  -DnsOnly

# Обратная запись: локальный DNS-адрес должен вернуть имя сервера.
Resolve-DnsName `
  -Name 172.17.14.53 `
  -Type PTR `
  -Server 172.17.14.53 `
  -DnsOnly

# Содержательная проверка DNS по TCP.
Resolve-DnsName `
  -Name smr-srv-ot-dns.ot-samara.baltika.ru `
  -Type A `
  -Server 172.17.14.53 `
  -DnsOnly `
  -TcpOnly

# Проверка установки TCP-соединения на порт 53.
Test-NetConnection `
  -ComputerName 172.17.14.53 `
  -Port 53 `
  -InformationLevel Detailed

В A-ответе порядок адресов может изменяться — DNS RRset не задаёт приоритет. Корректный набор: 10.255.0.53, 172.16.66.53, 172.16.68.53, 172.16.70.53, 172.17.14.53.

11.6. Диагностика AmneziaVPN и локального DNS

Первоначально клиент 10.255.255.250 успешно выполнял ping 10.255.0.53, но запросы Resolve-DnsName, nslookup и TCP/53 завершались тайм-аутом.

Маршрут Windows был правильным:

10.255.0.53
→ 10.255.0.0/16
→ Ethernet
→ source 10.255.255.250
→ NextHop 0.0.0.0

Первый захват на Ubuntu показывал ICMP, но не показывал ни UDP/53, ни TCP/53:

sudo tcpdump -ni any -vv   'host 10.255.255.250 and (icmp or udp port 53 or tcp port 53)'

Следовательно, DNS-пакеты блокировались на Windows до выхода через Ethernet. Причиной оказался AmneziaVPN и его защита локального DNS/DNS leak через Windows Filtering Platform.

После отключения VPN в tcpdump появились:

  • UDP-запросы и ответы для A и PTR;
  • TCP SYN, SYN-ACK и ACK;
  • полноценный DNS-запрос и авторитетный ответ по TCP.

Для постоянной совместной работы VPN и OT-DNS в клиенте VPN требуется исключить сеть 10.255.0.0/16 и разрешить обращения к 10.255.0.53 по UDP/53 и TCP/53 либо включить доступ к локальной сети и локальному DNS.

11.7. Ожидаемый REFUSED для внешних имён

После назначения OT-DNS системным DNS Windows отправляет на него фоновые запросы приложений и операционной системы, например client.wns.windows.com, yandex.ru, chatgpt.com и корпоративные зоны.

BIND отвечает на них REFUSED, поскольку работает в авторитетном режиме:

recursion no;
allow-query-cache { none; };

Это штатное поведение. Если OT-клиентам требуется разрешение корпоративных или внешних зон, нужно отдельно проектировать условную пересылку или доверенный forwarder. Второй DNS-сервер в настройках Windows не гарантирует разделение запросов по зонам.

11.8. Сообщения bad udp cksum в tcpdump

Строки bad udp cksum или cksum incorrect для исходящих пакетов сервера обычно являются следствием checksum offloading: tcpdump видит пакет до вычисления окончательной контрольной суммы виртуальным или физическим адаптером. При успешном ответе клиента и завершённом TCP-обмене это не является сетевой ошибкой.


12. Установка BIND9

sudo apt update
sudo apt install -y bind9 bind9-utils dnsutils
Пакет Назначение
bind9 Служба named
bind9-utils named-checkconf, named-checkzone, rndc
dnsutils dig, host, nslookup

Подтверждённая версия на момент установки:

BIND 9.18.39-0ubuntu0.24.04.5-Ubuntu

bind9.service является alias для основной службы named.service. Поэтому журнал удобнее смотреть через journalctl -u named.

12.1. Резервная копия исходной конфигурации

backup_dir="/root/bind9-before-configuration-$(date +%F-%H%M%S)"
sudo mkdir -m 0700 "$backup_dir"
sudo cp -a /etc/bind "$backup_dir/"
sudo tar -C "$backup_dir" -czf "${backup_dir}.tar.gz" bind
sudo sha256sum "${backup_dir}.tar.gz"

13. Глобальная конфигурация BIND

13.1. Главный файл /etc/bind/named.conf

Главный файл не содержит зон напрямую: он подключает три отдельных файла. Это штатная структура пакета BIND9 в Ubuntu.

# Полностью записываем главный конфигурационный файл BIND.
sudo tee /etc/bind/named.conf >/dev/null <<'EOF'
include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";
include "/etc/bind/named.conf.default-zones";
EOF

13.2. Файл /etc/bind/named.conf.options

# Создаём ACL клиентов и полный блок options.
sudo tee /etc/bind/named.conf.options >/dev/null <<'EOF'
// Сети, которым разрешено обращаться к авторитетным OT-зонам.
acl "ot-clients" {
    localhost;
    10.255.0.0/16;      // Legacy OT, VLAN 1.
    172.16.66.0/23;     // Пивопроизводство: VLAN 1, позднее VLAN 2030.
    172.16.68.0/23;     // Розлив, VLAN 2002.
    172.16.70.0/23;     // Утилиты, VLAN 2040.
    172.17.14.0/24;     // АСТУЭ, VLAN 2006.
};

options {
    directory "/var/cache/bind";

    // BIND слушает localhost и только сервисные OT-адреса.
    // Management-адреса 192.168.1.53 и 10.44.100.228 сюда не входят.
    listen-on {
        127.0.0.1;
        10.255.0.53;    // Legacy OT, VLAN 1.
        172.16.66.53;   // Пивопроизводство.
        172.16.68.53;   // Розлив, VLAN 2002.
        172.16.70.53;   // Утилиты, VLAN 2040.
        172.17.14.53;   // АСТУЭ, VLAN 2006.
    };

    listen-on-v6 { none; };

    allow-query { ot-clients; };

    // Сервер является только авторитетным и не разрешает внешние имена.
    recursion no;
    allow-query-cache { none; };
    dnssec-validation no;

    // Secondary DNS пока отсутствует.
    allow-transfer { none; };

    version "not disclosed";
    minimal-responses yes;
    auth-nxdomain no;
};
EOF

13.3. Смысл ключевых параметров

Параметр Назначение
acl "ot-clients" Перечень сетей, которым разрешены DNS-запросы
listen-on Точные локальные адреса, на которых BIND открывает TCP/UDP 53
listen-on-v6 { none; } Запрет DNS-прослушивания по IPv6
allow-query Кто может спрашивать записи авторитетных зон
recursion no Не разрешать внешние имена через другие DNS-серверы
allow-query-cache { none; } Не предоставлять клиентам рекурсивный кэш
dnssec-validation no Валидация рекурсивных ответов не нужна, потому что рекурсия отключена
allow-transfer { none; } Запрет AXFR/IXFR до появления secondary DNS
version "not disclosed" Не публиковать точную версию в version.bind

В конфигурации намеренно отсутствуют:

# В действующей конфигурации эти директивы должны отсутствовать.
# Пустой вывод означает, что forwarder не настроен.
grep -RniE '^\s*(forwarders|forward only|forward first)\b' /etc/bind

13.4. Проверка и перечитывание

sudo named-checkconf
sudo rndc reconfig
sudo rndc flush
systemctl is-active named

Внешний запрос должен быстро получить отказ:

dig @127.0.0.1 ubuntu.com A +norecurse

Ожидается status: REFUSED.


14. Файлы зон

14.1. Каталог зон

sudo install -d -o bind -g bind -m 0750 /var/lib/bind/zones

Каталог размещён в /var/lib/bind, чтобы позднее BIND мог создавать журналы динамических обновлений .jnl.

14.2. Прямая зона

Файл создаётся целиком, с текущими адресами всех сетей и фактическим serial после проверенного Webmin-теста:

# Полностью создаём прямую зону.
sudo tee /var/lib/bind/zones/db.ot-samara.baltika.ru >/dev/null <<'EOF'
$ORIGIN ot-samara.baltika.ru.
$TTL 3600

; Прямая зона OT Самара.
; Формат serial: YYYYMMDDNN, где NN — номер изменения за день.
@   IN  SOA smr-srv-ot-dns.ot-samara.baltika.ru. hostmaster.ot-samara.baltika.ru. (
        2026072901 ; serial
        3600       ; refresh
        900        ; retry
        1209600    ; expire
        300        ; negative cache TTL
)

@                   IN  NS      smr-srv-ot-dns.ot-samara.baltika.ru.

; Один DNS-сервер имеет локальный сервисный адрес в каждой OT-сети.
smr-srv-ot-dns     IN  A       10.255.0.53
smr-srv-ot-dns     IN  A       172.16.66.53
smr-srv-ot-dns     IN  A       172.16.68.53
smr-srv-ot-dns     IN  A       172.16.70.53
smr-srv-ot-dns     IN  A       172.17.14.53

; Короткий административный псевдоним.
dns                 IN  CNAME   smr-srv-ot-dns
EOF

sudo chown bind:bind /var/lib/bind/zones/db.ot-samara.baltika.ru
sudo chmod 0640 /var/lib/bind/zones/db.ot-samara.baltika.ru

После редактирования через Webmin SOA serial увеличивается автоматически. Webmin может изменить выравнивание и удалить комментарии возле полей SOA; на DNS-данные это не влияет.

14.3. Контакт администратора в SOA

Во всех девяти зонах используется одно фактическое значение RNAME:

hostmaster.ot-samara.baltika.ru.

В DNS-формате первая точка заменяет символ @, поэтому значение соответствует адресу hostmaster@ot-samara.baltika.ru. BIND не отправляет на него почту автоматически. Изменение контакта является изменением данных зоны и требует увеличения SOA serial, проверки named-checkzone и перечитывания зоны.

14.4. Обратные зоны

Ниже приведены все восемь файлов. Чётные зоны содержат PTR сервисного адреса .53; соседние нечётные зоны второй половины /23 пока не содержат PTR, но уже созданы и авторитетно обслуживаются.

14.4.1. /var/lib/bind/zones/db.255.10

# Legacy OT: 10.255.0.0/16, VLAN 1.
sudo tee /var/lib/bind/zones/db.255.10 >/dev/null <<'EOF'
$TTL 3600

; Legacy OT: 10.255.0.0/16, VLAN 1.
@   IN  SOA smr-srv-ot-dns.ot-samara.baltika.ru. hostmaster.ot-samara.baltika.ru. (
        2026072401 ; serial
        3600     ; refresh
        900      ; retry
        1209600  ; expire
        300      ; negative cache TTL
)

@   IN  NS   smr-srv-ot-dns.ot-samara.baltika.ru.
53.0  IN  PTR  smr-srv-ot-dns.ot-samara.baltika.ru.
EOF

14.4.2. /var/lib/bind/zones/db.66.16.172

# Пивопроизводство: 172.16.66.0/24, сейчас VLAN 1, позднее VLAN 2030.
sudo tee /var/lib/bind/zones/db.66.16.172 >/dev/null <<'EOF'
$TTL 3600

; Пивопроизводство: 172.16.66.0/24, сейчас VLAN 1, позднее VLAN 2030.
@   IN  SOA smr-srv-ot-dns.ot-samara.baltika.ru. hostmaster.ot-samara.baltika.ru. (
        2026072401 ; serial
        3600     ; refresh
        900      ; retry
        1209600  ; expire
        300      ; negative cache TTL
)

@   IN  NS   smr-srv-ot-dns.ot-samara.baltika.ru.
53  IN  PTR  smr-srv-ot-dns.ot-samara.baltika.ru.
EOF

14.4.3. /var/lib/bind/zones/db.67.16.172

# Пивопроизводство: 172.16.67.0/24, вторая половина сети /23.
sudo tee /var/lib/bind/zones/db.67.16.172 >/dev/null <<'EOF'
$TTL 3600

; Пивопроизводство: 172.16.67.0/24, вторая половина сети /23.
@   IN  SOA smr-srv-ot-dns.ot-samara.baltika.ru. hostmaster.ot-samara.baltika.ru. (
        2026072401 ; serial
        3600     ; refresh
        900      ; retry
        1209600  ; expire
        300      ; negative cache TTL
)

@   IN  NS   smr-srv-ot-dns.ot-samara.baltika.ru.
; PTR-записи будут добавлены при появлении узлов в этой /24.
EOF

14.4.4. /var/lib/bind/zones/db.68.16.172

# Розлив: 172.16.68.0/24, VLAN 2002.
sudo tee /var/lib/bind/zones/db.68.16.172 >/dev/null <<'EOF'
$TTL 3600

; Розлив: 172.16.68.0/24, VLAN 2002.
@   IN  SOA smr-srv-ot-dns.ot-samara.baltika.ru. hostmaster.ot-samara.baltika.ru. (
        2026072401 ; serial
        3600     ; refresh
        900      ; retry
        1209600  ; expire
        300      ; negative cache TTL
)

@   IN  NS   smr-srv-ot-dns.ot-samara.baltika.ru.
53  IN  PTR  smr-srv-ot-dns.ot-samara.baltika.ru.
EOF

14.4.5. /var/lib/bind/zones/db.69.16.172

# Розлив: 172.16.69.0/24, вторая половина сети /23, VLAN 2002.
sudo tee /var/lib/bind/zones/db.69.16.172 >/dev/null <<'EOF'
$TTL 3600

; Розлив: 172.16.69.0/24, вторая половина сети /23, VLAN 2002.
@   IN  SOA smr-srv-ot-dns.ot-samara.baltika.ru. hostmaster.ot-samara.baltika.ru. (
        2026072401 ; serial
        3600     ; refresh
        900      ; retry
        1209600  ; expire
        300      ; negative cache TTL
)

@   IN  NS   smr-srv-ot-dns.ot-samara.baltika.ru.
; PTR-записи будут добавлены при появлении узлов в этой /24.
EOF

14.4.6. /var/lib/bind/zones/db.70.16.172

# Утилиты: 172.16.70.0/24, VLAN 2040.
sudo tee /var/lib/bind/zones/db.70.16.172 >/dev/null <<'EOF'
$TTL 3600

; Утилиты: 172.16.70.0/24, VLAN 2040.
@   IN  SOA smr-srv-ot-dns.ot-samara.baltika.ru. hostmaster.ot-samara.baltika.ru. (
        2026072401 ; serial
        3600     ; refresh
        900      ; retry
        1209600  ; expire
        300      ; negative cache TTL
)

@   IN  NS   smr-srv-ot-dns.ot-samara.baltika.ru.
53  IN  PTR  smr-srv-ot-dns.ot-samara.baltika.ru.
EOF

14.4.7. /var/lib/bind/zones/db.71.16.172

# Утилиты: 172.16.71.0/24, вторая половина сети /23, VLAN 2040.
sudo tee /var/lib/bind/zones/db.71.16.172 >/dev/null <<'EOF'
$TTL 3600

; Утилиты: 172.16.71.0/24, вторая половина сети /23, VLAN 2040.
@   IN  SOA smr-srv-ot-dns.ot-samara.baltika.ru. hostmaster.ot-samara.baltika.ru. (
        2026072401 ; serial
        3600     ; refresh
        900      ; retry
        1209600  ; expire
        300      ; negative cache TTL
)

@   IN  NS   smr-srv-ot-dns.ot-samara.baltika.ru.
; PTR-записи будут добавлены при появлении узлов в этой /24.
EOF

14.4.8. /var/lib/bind/zones/db.14.17.172

# АСТУЭ: 172.17.14.0/24, VLAN 2006.
sudo tee /var/lib/bind/zones/db.14.17.172 >/dev/null <<'EOF'
$TTL 3600

; АСТУЭ: 172.17.14.0/24, VLAN 2006.
@   IN  SOA smr-srv-ot-dns.ot-samara.baltika.ru. hostmaster.ot-samara.baltika.ru. (
        2026072702 ; serial
        3600     ; refresh
        900      ; retry
        1209600  ; expire
        300      ; negative cache TTL
)

@   IN  NS   smr-srv-ot-dns.ot-samara.baltika.ru.
53  IN  PTR  smr-srv-ot-dns.ot-samara.baltika.ru.
EOF

14.4.9. Владелец и права всех файлов зон

# Назначаем владельца bind и режим 0640 всем девяти файлам зон.
sudo chown bind:bind \
  /var/lib/bind/zones/db.ot-samara.baltika.ru \
  /var/lib/bind/zones/db.255.10 \
  /var/lib/bind/zones/db.66.16.172 \
  /var/lib/bind/zones/db.67.16.172 \
  /var/lib/bind/zones/db.68.16.172 \
  /var/lib/bind/zones/db.69.16.172 \
  /var/lib/bind/zones/db.70.16.172 \
  /var/lib/bind/zones/db.71.16.172 \
  /var/lib/bind/zones/db.14.17.172

sudo chmod 0640 \
  /var/lib/bind/zones/db.ot-samara.baltika.ru \
  /var/lib/bind/zones/db.255.10 \
  /var/lib/bind/zones/db.66.16.172 \
  /var/lib/bind/zones/db.67.16.172 \
  /var/lib/bind/zones/db.68.16.172 \
  /var/lib/bind/zones/db.69.16.172 \
  /var/lib/bind/zones/db.70.16.172 \
  /var/lib/bind/zones/db.71.16.172 \
  /var/lib/bind/zones/db.14.17.172

14.5. Файл /etc/bind/named.conf.local

# Полностью объявляем одну прямую и восемь обратных master-зон.
sudo tee /etc/bind/named.conf.local >/dev/null <<'EOF'
// Прямая зона OT Самара.
zone "ot-samara.baltika.ru" {
    type master;
    file "/var/lib/bind/zones/db.ot-samara.baltika.ru";
    allow-update { none; };
    notify no;
};

// Legacy OT: 10.255.0.0/16, VLAN 1.
zone "255.10.in-addr.arpa" {
    type master;
    file "/var/lib/bind/zones/db.255.10";
    allow-update { none; };
    notify no;
};

// Пивопроизводство: 172.16.66.0/24, сейчас VLAN 1, позднее VLAN 2030.
zone "66.16.172.in-addr.arpa" {
    type master;
    file "/var/lib/bind/zones/db.66.16.172";
    allow-update { none; };
    notify no;
};

// Пивопроизводство: 172.16.67.0/24, вторая половина /23.
zone "67.16.172.in-addr.arpa" {
    type master;
    file "/var/lib/bind/zones/db.67.16.172";
    allow-update { none; };
    notify no;
};

// Розлив: 172.16.68.0/24, VLAN 2002.
zone "68.16.172.in-addr.arpa" {
    type master;
    file "/var/lib/bind/zones/db.68.16.172";
    allow-update { none; };
    notify no;
};

// Розлив: 172.16.69.0/24, вторая половина /23, VLAN 2002.
zone "69.16.172.in-addr.arpa" {
    type master;
    file "/var/lib/bind/zones/db.69.16.172";
    allow-update { none; };
    notify no;
};

// Утилиты: 172.16.70.0/24, VLAN 2040.
zone "70.16.172.in-addr.arpa" {
    type master;
    file "/var/lib/bind/zones/db.70.16.172";
    allow-update { none; };
    notify no;
};

// Утилиты: 172.16.71.0/24, вторая половина /23, VLAN 2040.
zone "71.16.172.in-addr.arpa" {
    type master;
    file "/var/lib/bind/zones/db.71.16.172";
    allow-update { none; };
    notify no;
};

// АСТУЭ: 172.17.14.0/24, VLAN 2006.
zone "14.17.172.in-addr.arpa" {
    type master;
    file "/var/lib/bind/zones/db.14.17.172";
    allow-update { none; };
    notify no;
};
EOF

allow-update { none; }; оставляет DDNS выключенным. notify no; отключает NOTIFY, потому что secondary DNS пока отсутствует.

15. Основные DNS-записи — расшифровка

Учебный раздел: короткие записи ниже объясняют типы RR и не заменяют проектные файлы. Полные фактические зоны для копирования приведены в разделе 14.

15.1. Общий формат

ИМЯ  TTL  КЛАСС  ТИП  ЗНАЧЕНИЕ
Элемент Смысл
$ORIGIN Базовый суффикс, который BIND добавляет к коротким именам
$TTL Время хранения ответа в кэше, в секундах
@ Вершина текущей зоны, то есть значение $ORIGIN
IN Класс Internet, используемый для обычных DNS-записей
Точка в конце имени Имя полное; $ORIGIN дописывать не нужно

15.2. SOA — паспорт зоны

SOA означает Start of Authority. Запись описывает конкретную зону:

  • MNAME — primary DNS-сервер зоны;
  • RNAME — контакт ответственного администратора;
  • serial — версия зоны;
  • refresh — как часто secondary проверяет serial;
  • retry — через сколько повторить неудачную проверку;
  • expire — когда secondary перестаёт считать старую копию действительной;
  • negative cache TTL — сколько кэшировать ответ об отсутствии имени.

15.3. NS — серверы зоны

NS означает Name Server. Запись перечисляет авторитетные DNS-серверы, которые обслуживают зону.

@ IN NS smr-srv-ot-dns.ot-samara.baltika.ru.

SOA у зоны одна, а NS-записей может быть несколько.

15.4. A и AAAA

A связывает имя с IPv4-адресом:

plc-001 IN A 172.16.66.100

AAAA является IPv6-аналогом A. В проекте IPv6 для DNS-службы не используется.

15.5. CNAME

CNAME создаёт псевдоним другого DNS-имени:

dns IN CNAME smr-srv-ot-dns

Имя, являющееся CNAME, не должно одновременно иметь A, PTR, MX и другие обычные записи.

15.6. PTR

PTR связывает IP-адрес с DNS-именем. Команда dig -x автоматически формирует обратное имя в in-addr.arpa.

172.16.66.53
→ 53.66.16.172.in-addr.arpa
→ smr-srv-ot-dns.ot-samara.baltika.ru.

15.7. MX

MX означает Mail Exchanger — сервер, принимающий электронную почту для домена.

@     IN MX 10 mail1.ot-samara.baltika.ru.
@     IN MX 20 mail2.ot-samara.baltika.ru.
mail1 IN A     172.16.66.25
mail2 IN A     172.16.66.26

Чем меньше число, тем выше приоритет. MX указывает на DNS-имя, а не на IP-адрес. Для текущей OT-зоны MX не нужен, поскольку она не предназначена для приёма почты.


16. Проверка конфигурации и зон

16.1. Проверка отдельной зоны

Каждое имя зоны проверяется вместе с конкретным файлом. Успешный результат для каждой команды заканчивается строкой OK.

# Прямая зона.
sudo named-checkzone ot-samara.baltika.ru /var/lib/bind/zones/db.ot-samara.baltika.ru

# Legacy OT.
sudo named-checkzone 255.10.in-addr.arpa /var/lib/bind/zones/db.255.10

# Пивопроизводство, две /24 зоны.
sudo named-checkzone 66.16.172.in-addr.arpa /var/lib/bind/zones/db.66.16.172
sudo named-checkzone 67.16.172.in-addr.arpa /var/lib/bind/zones/db.67.16.172

# Розлив, две /24 зоны.
sudo named-checkzone 68.16.172.in-addr.arpa /var/lib/bind/zones/db.68.16.172
sudo named-checkzone 69.16.172.in-addr.arpa /var/lib/bind/zones/db.69.16.172

# Утилиты, две /24 зоны.
sudo named-checkzone 70.16.172.in-addr.arpa /var/lib/bind/zones/db.70.16.172
sudo named-checkzone 71.16.172.in-addr.arpa /var/lib/bind/zones/db.71.16.172

# АСТУЭ.
sudo named-checkzone 14.17.172.in-addr.arpa /var/lib/bind/zones/db.14.17.172

16.2. Проверка всей конфигурации и загрузки зон

sudo named-checkconf
sudo named-checkconf -z

named-checkconf проверяет синтаксис конфигурации. Ключ -z дополнительно пытается загрузить все primary-зоны.

16.3. Запуск и состояние

sudo systemctl start named
systemctl is-active named
sudo rndc status
sudo journalctl -u named --since "3 minutes ago" --no-pager

Подтверждённое состояние:

number of zones: 14
server is up and running
query logging is OFF
recursive clients: 0

Число 14 складывается из девяти созданных зон — одной прямой и восьми обратных, — четырёх стандартных localhost-зон Ubuntu и одной служебной managed-keys zone.


17. Проверка через dig

17.1. SOA

dig @127.0.0.1 ot-samara.baltika.ru SOA +norecurse

17.2. NS

dig @127.0.0.1 ot-samara.baltika.ru NS +norecurse

17.3. A и CNAME

dig @127.0.0.1 smr-srv-ot-dns.ot-samara.baltika.ru A +norecurse
dig @127.0.0.1 dns.ot-samara.baltika.ru A +norecurse

17.4. PTR

dig @127.0.0.1 -x 10.255.0.53 +norecurse
dig @127.0.0.1 -x 172.16.66.53 +norecurse
dig @127.0.0.1 -x 172.16.68.53 +norecurse
dig @127.0.0.1 -x 172.16.70.53 +norecurse
dig @127.0.0.1 -x 172.17.14.53 +norecurse

17.5. Проверка через сервисный адрес АСТУЭ

dig @172.17.14.53 smr-srv-ot-dns.ot-samara.baltika.ru A +norecurse
dig @172.17.14.53 dns.ot-samara.baltika.ru A +norecurse
dig @172.17.14.53 -x 172.17.14.53 +norecurse
dig @172.17.14.53 14.17.172.in-addr.arpa SOA +tcp +norecurse

Фактически получено: пять A-записей; одна CNAME и пять A-записей; корректный PTR; SOA обратной зоны с serial 2026072702. Все ответы имеют NOERROR и флаг aa.

17.6. Внешнее имя

dig @127.0.0.1 ubuntu.com A +norecurse

Ожидаемая логика:

собственные зоны → status: NOERROR, флаг aa
внешние зоны     → status: REFUSED

17.7. Основные элементы вывода dig

Поле или флаг Смысл
NOERROR Запрос обработан без ошибки
NXDOMAIN Такого имени не существует
REFUSED Политика сервера запрещает запрос
SERVFAIL Сервер не смог обработать запрос
qr Пакет является ответом
aa Авторитетный ответ из собственной зоны
rd Клиент запросил рекурсию
ra Сервер предоставляет рекурсию; в данном проекте отсутствует
QUESTION Что было запрошено
ANSWER Непосредственный ответ
AUTHORITY Информация об авторитетной зоне
ADDITIONAL Дополнительные полезные записи и EDNS OPT

18. Важный нюанс нескольких A-записей DNS-сервера

Имя smr-srv-ot-dns.ot-samara.baltika.ru сейчас имеет пять A-записей: 10.255.0.53, 172.16.66.53, 172.16.68.53, 172.16.70.53 и 172.17.14.53. Это корректно для обычных авторитетных ответов, но между OT-подсетями отсутствует маршрутизация.

При будущем DDNS Windows-клиент может получить SOA MNAME, разрешить его в один из пяти адресов и выбрать адрес другой, недоступной подсети. Поэтому DDNS нельзя включать простым широким allow-update без проектного решения.

До включения DDNS нужно выбрать один из вариантов:

  • BIND views с разными ответами для разных сетей;
  • отдельные DNS-имена primary-сервера для каждого VLAN;
  • маршрутизация между OT-подсетями;
  • централизованные обновления через DHCP и TSIG.

Разрешение DDNS только по IP-адресу клиента без TSIG не обеспечивает аутентификацию. Любой узел с разрешённым адресом сможет изменять записи зоны.


19. Правила редактирования зон

Пока используется allow-update { none; };, файл зоны можно редактировать вручную. После каждого изменения:

  1. увеличить SOA serial;
  2. выполнить named-checkzone;
  3. перечитать нужную зону через rndc reload;
  4. проверить запись через dig.
sudo named-checkzone ot-samara.baltika.ru /var/lib/bind/zones/db.ot-samara.baltika.ru
sudo rndc reload ot-samara.baltika.ru
dig @127.0.0.1 ot-samara.baltika.ru SOA +norecurse

При статической зоне Webmin может сам выполнить защитную команду freeze, сохранить запись, увеличить SOA serial и перечитать конфигурацию. Это было подтверждено журналом named во время теста TXT-записи.

После включения DDNS появятся файлы .jnl. Тогда прямое редактирование работающей динамической зоны запрещается. Используется:

# 1. Сбрасываем journal в основной файл и запрещаем UPDATE на время правки.
sudo rndc freeze ot-samara.baltika.ru

# 2. Редактируем основной файл зоны и увеличиваем SOA serial.
sudo nano /var/lib/bind/zones/db.ot-samara.baltika.ru

# 3. До разморозки проверяем синтаксис изменённого файла.
sudo named-checkzone \
  ot-samara.baltika.ru \
  /var/lib/bind/zones/db.ot-samara.baltika.ru

# 4. Перечитываем файл и снова разрешаем UPDATE согласно allow-update/update-policy.
sudo rndc thaw ot-samara.baltika.ru

# 5. Проверяем состояние зоны глазами работающего named.
sudo rndc zonestatus ot-samara.baltika.ru

20. Установка и проверка Webmin

20.1. Назначение и границы использования

Webmin установлен как веб-интерфейс для администрирования уже работающего BIND9. Он не заменяет BIND и не создаёт отдельный DNS-сервис. Модуль Сервер DNS BIND читает существующие файлы /etc/bind/named.conf* и файлы зон в /var/lib/bind/zones.

На текущем этапе Webmin используется для просмотра конфигурации и редких ручных изменений записей. DDNS не включён. При будущем включении динамических обновлений ручное редактирование динамической зоны выполняется только по схеме Freeze → Edit → Check → Unfreeze.

20.2. Контрольная копия перед установкой

# Формируем имя каталога с датой и временем.
backup_dir="/root/bind9-before-webmin-$(date +%F-%H%M%S)"

# install -d создаёт каталог; -m 0700 оставляет доступ только root.
install -d -m 0700 "$backup_dir"

# cp -a копирует рекурсивно и сохраняет владельцев, права и временные метки.
cp -a \
  /etc/bind \
  /var/lib/bind/zones \
  /etc/netplan \
  /etc/ufw \
  "$backup_dir/"

# -C /root меняет рабочий каталог tar перед упаковкой.
# -c создаёт архив, -z включает gzip, -f задаёт имя файла.
tar -C /root -czf "${backup_dir}.tar.gz" "$(basename "$backup_dir")"

# Создаём и сразу проверяем контрольную сумму архива.
sha256sum "${backup_dir}.tar.gz" | tee "${backup_dir}.tar.gz.sha256"
sha256sum -c "${backup_dir}.tar.gz.sha256"

Фактическая резервная точка:

/root/bind9-before-webmin-2026-07-28-152931.tar.gz
SHA-256: 5e0db79047d44a7fca97c910c6d6656e250a90a6d0711065712acbf1c64897bd

Дополнительно были сохранены хеши 21 файла BIND. Пустой вывод последующего diff подтвердил, что сама установка Webmin не изменила конфигурацию DNS.

# find выбирает обычные файлы в двух каталогах.
# -exec sha256sum {} + передаёт их sha256sum группами.
# sort -k2 сортирует по второму полю — пути к файлу.
find /etc/bind /var/lib/bind/zones \
  -type f \
  -exec sha256sum {} + | \
sort -k2 > /root/bind-before-webmin.sha256

20.3. Доступ через UFW

Webmin доступен только через временную и production management-сети. На OT-интерфейсах TCP/10000 не разрешён.

# Доступ через временный management-интерфейс ens18.
ufw allow in on ens18 \
  proto tcp \
  from 192.168.1.0/24 \
  to 192.168.1.53 \
  port 10000 \
  comment 'Webmin temporary management HTTPS'

# Доступ через production management-интерфейс ens23.
ufw allow in on ens23 \
  proto tcp \
  from 10.44.100.0/24 \
  to 10.44.100.228 \
  port 10000 \
  comment 'Webmin production management HTTPS'

ufw reload
ufw status numbered

Смысл ограничений: правило совпадает только при одновременном выполнении условий по входному интерфейсу, сети источника, локальному адресу назначения, протоколу TCP и порту 10000.

20.4. Подключение официального stable-репозитория

cd /root

# --fail завершает curl ошибкой при HTTP 4xx/5xx.
# --location разрешает HTTPS-перенаправления.
# --proto '=https' запрещает загрузку по HTTP.
# --tlsv1.2 требует TLS 1.2 или новее.
curl \
  --fail \
  --location \
  --proto '=https' \
  --tlsv1.2 \
  --output /root/webmin-setup-repo.sh \
  https://raw.githubusercontent.com/webmin/webmin/master/webmin-setup-repo.sh

file /root/webmin-setup-repo.sh
head -n 20 /root/webmin-setup-repo.sh
sha256sum /root/webmin-setup-repo.sh
chmod 0700 /root/webmin-setup-repo.sh

# Скрипт добавляет stable-репозиторий и ключ подписи Webmin.
sh /root/webmin-setup-repo.sh

apt-get update
apt-cache policy webmin

Перед установкой был обнаружен пакет webmin 2.653 из репозитория https://download.webmin.com/download/newkey/repository.

20.5. Установка и проверка службы

# --install-recommends устанавливает рекомендуемые зависимости Webmin.
apt-get install webmin --install-recommends

# is-active проверяет текущее состояние процесса.
systemctl is-active webmin

# is-enabled проверяет запуск при загрузке ОС.
systemctl is-enabled webmin

# Показываем слушающий сокет TCP/10000 и процесс-владелец.
ss -lntp | grep ':10000'

# --insecure разрешён только для первичной проверки локального self-signed сертификата.
curl --insecure --head https://127.0.0.1:10000/

Подтверждённое состояние:

Webmin: 2.653
webmin.service: active, enabled
TCP/10000: LISTEN на 0.0.0.0 и [::]
HTTPS: HTTP/1.0 200 Document follows

Хотя процесс слушает все локальные адреса, входящий IPv4-доступ ограничен правилами UFW только management-сетями.

20.6. Проверка неизменности BIND после установки

# Создаём новый список хешей после установки.
find /etc/bind /var/lib/bind/zones \
  -type f \
  -exec sha256sum {} + | \
sort -k2 > /root/bind-after-webmin.sha256

# Пустой вывод diff означает полное совпадение списков.
diff -u \
  /root/bind-before-webmin.sha256 \
  /root/bind-after-webmin.sha256

named-checkconf -z
systemctl is-active named

grep -Rni \
  --include='named.conf*' \
  'allow-update' \
  /etc/bind

Проверка успешна: Webmin не изменил 21 контролируемый файл BIND, все зоны загрузились, named остался активен, а во всех девяти рабочих зонах сохранилось allow-update { none; };.

20.7. Первое открытие модуля BIND

Адреса интерфейса:

https://192.168.1.53:10000
https://10.44.100.228:10000

Вход выполняется под Linux-пользователем baltikadns. В меню Серверы → Сервер DNS BIND Webmin автоматически определил BIND 9.18.39, прямую зону, восемь обратных зон и стандартные локальные зоны. Создавать новую конфигурацию BIND не потребовалось.

Когда существующая конфигурация не обнаружена, нельзя нажимать Create Configuration: сначала проверяются пути модуля. В этой установке существующие зоны обнаружены корректно.

Если модуль не обнаружил существующие зоны, не нажимать Create Configuration. В Module Config должны использоваться проектные пути:

Main configuration file: /etc/bind/named.conf
Options file:            /etc/bind/named.conf.options
Local zones file:        /etc/bind/named.conf.local
Zone files directory:    /var/lib/bind/zones
named-checkconf:          /usr/sbin/named-checkconf
named-checkzone:          /usr/sbin/named-checkzone
rndc:                     /usr/sbin/rndc
systemd service:          named.service
Chroot:                   не используется

20.8. Функциональный тест редактирования зоны

После того как Webmin обнаружил существующие зоны, выполняется один безопасный тест записи. Он подтверждает, что веб-интерфейс изменяет правильный файл, увеличивает SOA serial и корректно перечитывает BIND.

  1. Создать временную TXT-запись webmin-test.ot-samara.baltika.ru со значением webmin-write-test. Индивидуальный TTL можно не задавать — тогда применяется глобальный $TTL зоны.
  2. Нажать Apply Configuration.
  3. Проверить файл зоны, синтаксис и авторитетный ответ.
  4. Удалить тестовую запись, снова применить конфигурацию и убедиться, что запрос возвращает NXDOMAIN.
# Ищем тестовую строку в файле; -n показывает номер строки.
grep -n 'webmin-test' /var/lib/bind/zones/db.ot-samara.baltika.ru

# Проверяем синтаксис одной зоны.
named-checkzone \
  ot-samara.baltika.ru \
  /var/lib/bind/zones/db.ot-samara.baltika.ru

# Проверяем все include-файлы и загрузку всех зон.
named-checkconf -z

# Запрашиваем TXT без рекурсии и оставляем в выводе заголовок и ANSWER.
dig @127.0.0.1 \
  webmin-test.ot-samara.baltika.ru \
  TXT \
  +norecurse \
  +noall \
  +comments \
  +answer

Ожидаемый результат после создания: named-checkzone возвращает OK, dig — NOERROR и флаг aa, а SOA serial становится больше предыдущего. После удаления ожидается авторитетный NXDOMAIN.

На этом сервере полный цикл создания и удаления тестовой TXT-записи выполнен успешно. Тестовая запись удалена. Webmin может выровнять формат SOA и убрать комментарии из файла зоны; DNS-данные при этом не меняются.

20.9. Официальные справочные материалы


21. Контроль полноты конфигурационных материалов

В этой редакции для каждого изменяемого файла приведена команда создания и полное содержимое. Исключение — конфигурация Proxmox-хоста: она документирована точной картой bridge/VLAN/MAC, но не заменяется универсальным файлом, чтобы не повредить другие ВМ и management-сеть узла.

Файл или объект Полный материал
/etc/cloud/cloud.cfg.d/99-disable-network-config.cfg Команда tee и полное содержимое
/etc/netplan/01-ot-dns.yaml Команда tee, семь интерфейсов, все адреса и комментарии VLAN
/etc/sysctl.d/90-ot-dns-no-forwarding.conf Команда tee и оба параметра forwarding
UFW Полный набор SSH, Webmin, UDP/53 и TCP/53 для каждой сети
/etc/bind/named.conf Команда tee и три include
/etc/bind/named.conf.options Команда tee, ACL, listen-on и авторитетный режим
/etc/bind/named.conf.local Команда tee, одна прямая и восемь обратных зон
/var/lib/bind/zones/db.ot-samara.baltika.ru Команда tee, полный SOA/NS/A/CNAME
Восемь файлов обратных зон Отдельная команда tee и полное содержимое каждого файла
Права файлов зон Явный список девяти файлов, владелец bind:bind, режим 0640
Windows end-to-end-тесты Пять отдельных блоков с точными DNS-адресами, без условных подстановок
Webmin Репозиторий, установка, UFW, проверка службы и точные пути модуля BIND

22. Текущее фактическое состояние

Компонент или проверка Подтверждённое состояние
Ubuntu Server 24.04.4 LTS, статическая многосетевая конфигурация Netplan применена
Proxmox/QEMU VirtIO-интерфейсы подключены к нужным bridge/VLAN; qemu-guest-agent активен
Маршрутизация Единственный default route проходит через временный management; IP forwarding IPv4/IPv6 отключён
UFW DNS UDP/53 и TCP/53 разрешён только из соответствующих OT-сетей; SSH и Webmin TCP/10000 — только из management-сетей
BIND9 9.18.39, named активен; одна прямая и восемь обратных рабочих зон проходят named-checkconf -z
Режим DNS Авторитетный сервер без рекурсии и forwarder; внешние имена получают ожидаемый REFUSED
Webmin 2.653 из official stable repository; существующая конфигурация BIND и все зоны обнаружены; создание и удаление тестовой TXT-записи проверены
DDNS Выключен; во всех девяти рабочих зонах сохранено allow-update { none; };
DNS-функции A, PTR и CNAME проверены через все пять сервисных адресов; подтверждена работа UDP/53 и TCP/53 с реальных Windows-клиентов
Известная особенность клиентов VPN-клиенты с защитой от DNS leak могут блокировать локальный DNS; это проверяется через tcpdump на сервере и отключение/исключения VPN на клиенте

23. Следующие этапы

  1. ограничить доступ дополнительным встроенным IP Access Control Webmin для сетей 192.168.1.0/24 и 10.44.100.0/24; оценить отключение ненужного IPv6-listener;
  2. при необходимости заменить локальный сертификат Webmin на доверенный внутренний сертификат;
  3. утвердить схему именования OT-оборудования и начать добавление рабочих пар A/PTR для ПЛК, HMI, счётчиков, серверов и инженерных станций через Webmin;
  4. для клиентов, которым нужны корпоративные или внешние имена, выбрать модель разрешения: условная пересылка конкретных зон либо доверенный forwarder; не превращать авторитетный сервер в открытый recursive resolver;
  5. настроить в AmneziaVPN постоянное исключение локальной сети и OT-DNS, чтобы VPN не блокировал локальные UDP/53 и TCP/53;
  6. после появления тестового узла в VLAN 2030 выполнить атомарную миграцию адреса 172.16.66.53/23 с enp2s1 на ens21, затем удалить устаревшие UFW-правила на enp2s1;
  7. перевести default route с временного management на production management после проверки маршрутизации, SSH и NTP;
  8. позднее включить DDNS для статически адресованных Windows-хостов только после отдельного теста схемы SOA MNAME и процедуры Freeze → Edit → Unfreeze; DNS-суффикс задавать через GUI Windows;
  9. спроектировать secondary DNS и разрешить контролируемые zone transfer.

Все изменения Netplan выполнять через netplan try. Перед изменением BIND создавать резервную копию, выполнять named-checkconf и named-checkzone, затем проверять результат через dig.


Контрольная точка редакции 7: авторитетный BIND9 и Webmin установлены, настроены и проверены. Все рабочие зоны загружаются, A/PTR/CNAME и оба транспорта DNS подтверждены с OT-клиентов, доступ к Webmin ограничен management-сетями. DDNS остаётся выключенным до отдельного этапа.