Настройте собственный DDNS-сервер с помощью bind9 и вперед


Для чего используется DDNS?

Службы динамического DNS (DDNS) позволяют выходить на сети, которые не имеют статического IP-адреса от своего провайдера.
Чтобы обеспечить надежную связь, например, с вашей домашней сетью, DDNS-провайдер обычно предоставляет вам (под)домен, на котором работает обычный DNS-сервер и обновляется веб-сервис. Клиент в Интернете может получить доступ к домашней сети, просто подключившись к предоставленному DDNS-url. Для обновления DNS-сервера url update-webservice помещается в маршрутизатор или запускается вручную с устройства внутри домашней сети.

Более подробное объяснение см. в разделе Динамический DNS.

Цель данного руководства

Существует множество руководств по DDNS. Но мне было очень трудно найти простой, последовательный и актуальный. Я хотел бы обобщить свои находки в этом руководстве.
Я буду использовать фрагменты кода, вдохновленные другими учебниками, но постараюсь указать всех авторов. Если я ошибусь в указании авторов, не стесняйтесь связаться со мной.

Как реализовать собственную конфигурацию DDNS

Отказ от ответственности: я не являюсь экспертом по IT-безопасности. Если вы найдете какие-либо уязвимости в этой конфигурации, пожалуйста, свяжитесь со мной!

Услуги DDNS часто стоят столько же, сколько отдельный сервер виртуальной машины linux. Поэтому, если у вас уже есть такой сервер, почему бы не настроить его самостоятельно.

Это руководство предназначено только для машин linux. В частности, я делал это на виртуальной машине debian 11.

Я буду использовать bind9, так как это один из самых популярных DNS-серверов. Установите его с помощью вашего любимого менеджера пакетов, например apt:

# apt install bind9

Если вы собираетесь использовать go для сервера обновлений, установите его, используя официальные инструкции.

Настройка DNS и брандмауэра

Перейдите к вашему провайдеру домена/DNS и отредактируйте настройки DNS-сервера следующим образом:

home.ddns.example.com 3600 IN NS ns.example.com
Войдите в полноэкранный режим Выйти из полноэкранного режима

home.ddns.example.com будет url, под которым вы сможете подключиться к вашей домашней сети.
Я использую поддомен ddns, потому что ваша конфигурация будет более читаемой, если вы планируете добавить несколько домашних сетей.

ns.example.com 3600 IN A <Your Server IP>
Вход в полноэкранный режим Выход из полноэкранного режима

Это сервер имен, под которым работает ваш DNS-сервер. Он будет обслуживать A-вход (IP) для вашей домашней сети.
Введите статический IP-адрес сервера вашей виртуальной машины.

update-ddns.example.com 3600 IN A <Your Server IP>
Вход в полноэкранный режим Выход из полноэкранного режима

Эта запись будет веб-сервисом, который позволит вам обновить запись DNS для вашей домашней сети.

Убедитесь, что вы разрешили доступ к порту 53-udp для DNS и порту 80/443-tcp (http/https) для обновления «A»-записи в вашем DNS-сервере в вашем брандмауэре.

Конфигурация Bind9

Ниже приведена относительно обычная конфигурация DNS за некоторыми исключениями.

На этом этапе другие часто используют утилиту dnssec-keygen для генерации симметричного ключа. В моей версии этой утилиты алгоритмы hmac не были включены. Поэтому я использовал утилиту tsig-keygen.

Для генерации симметричного ключа используйте:

# tsig-keygen ddnskey >> /secrets/ddnskey
key "ddnskey" {
    algorithm hmac-sha256;
    secret "BASE64=";
};
Войдите в полноэкранный режим Выйти из полноэкранного режима

ddnskey — это имя ключа, которое можно выбрать по своему усмотрению. Этот ключ (значение рядом с secret) вы передаете инструменту обновления DNS, чтобы он мог обновить записи DNS.
Подробнее об этом позже.
Обязательно измените права доступа к этому файлу так, чтобы пользователь, который позже запустит веб-сервис, имел к нему доступ на чтение.

Далее отредактируйте /etc/bind/named.conf для настройки bind9. Этот файл может находиться в другом месте, если вы используете не debian, а что-то другое.

Добавьте в файл следующее содержимое:

key "ddnskey" {
        algorithm hmac-sha256;
        secret "BASE64=";
};

zone home.ddns.example.com. {
    type master;
    file "/var/lib/bind/db.home.example.com";
    allow-update { key ddnskey; };
};
Войти в полноэкранный режим Выйти из полноэкранного режима

Первая запись — это вывод ключа, который мы только что сгенерировали. Вторая запись — это определение новой зоны DNS. Зона должна быть определена в файле, указанном рядом с file. У меня были проблемы с правами при создании файла в папке /etc/bind, поскольку bind выполняется под собственным пользователем. Файлы zone-файлов обычно должны находиться в указанной выше папке.

Давайте создадим этот файл:

$ORIGIN .
$TTL 200        ; 3 minutes 20 seconds
home.ddns.example.com IN SOA ns.example.com. alex.example.com. (
                                6          ; serial
                                500        ; refresh (8 minutes 20 seconds)
                                500        ; retry (8 minutes 20 seconds)
                                86400      ; expire (1 day)
                                500        ; minimum (8 minutes 20 seconds)
                                )
                        NS      ns.example.com.
                        A       1.2.3.4
Вход в полноэкранный режим Выход из полноэкранного режима

Здесь я использовал файл зоны в качестве базового шаблона. Файлы зон не являются основной темой данного руководства, но они представляют собой фактическую конфигурацию DNS-сервера для данной конкретной зоны. Доступ к этой информации можно получить, запросив сервер. Они имеют строгие правила форматирования. Я нашел веб-инструмент, который облегчает работу с ними.

Важные детали: TTL должен быть относительно коротким, поскольку IP может быть очень недолговечным. В записи A просто введите что угодно, поскольку она будет перезаписана нашим скриптом обновления и, надеюсь, всегда будет представлять IP домашней сети.

Замените alex.example.com. на ваш email.

Перезагрузите службу bind9 с помощью:

# systemctl restart bind9

и протестируйте с помощью

nsupdate -k /secrets/ddnskey 
> server ns.example.com
> update delete home.ddns.example.com A
> update add home.ddns.example.com 200 A 1.2.3.4
> send
Войдите в полноэкранный режим Выйти из полноэкранного режима

Это делает следующее:

  1. Подключение к указанному серверу имен
  2. Удалите предыдущую A-входную запись для Ip вашей домашней сети
  3. Создать новый A-вход
  4. Отправить

Если у вас установлен пакет dnsutils, вы можете проверить, была ли обновлена запись A с помощью

dig +trace home.ddns.example.com @8.8.8.8
Войти в полноэкранный режим Выйти из полноэкранного режима

Я нашел скрипт в другом учебнике, который я немного изменил, но я, к сожалению, не нашел автора. Пожалуйста, дайте мне знать, если вы знаете автора, и я укажу его имя.

Ниже приведен вышеупомянутый скрипт:

KEYFILE=/secrets/ddnskey
NAMESERVER="ns.example.com"
ZONE="home.ddns.example.com"
TTL="200"

if [ -z "$1" ]
then
  IPADDR="`curl -s ifconfig.me`"
else
  IPADDR="$1"
fi

(
  echo "server $NAMESERVER"
  echo "update delete $ZONE A"
  echo "update add $ZONE $TTL A $IPADDR"
  echo "send"
) | nsupdate -k /secrets/ddnskey

# EOF
Войти в полноэкранный режим Выход из полноэкранного режима

Если вы хотите обновлять сервер по http(s): я написал go-сервер для этой цели.

Оцените статью
Procodings.ru
Добавить комментарий