Для чего используется 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
Это делает следующее:
- Подключение к указанному серверу имен
- Удалите предыдущую A-входную запись для Ip вашей домашней сети
- Создать новый A-вход
- Отправить
Если у вас установлен пакет 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-сервер для этой цели.