Dynamic DNS (DDNS) в VyOS

Dynamic DNS (DDNS) - это сервис автоматического обновления DNS-записей при изменении IP-адреса. VyOS включает встроенный клиент DDNS, который может обновлять записи у различных провайдеров динамического DNS, что критично для удаленного доступа к устройствам с динамическими IP-адресами.

Обзор

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

  • Домашние/малые офисы: Доступ к сети через динамический IP от провайдера
  • Филиалы: Удаленный доступ без статических IP-адресов
  • VPN-подключения: Стабильные endpoint’ы для VPN туннелей
  • Удаленное управление: Постоянное DNS-имя для SSH/HTTPS доступа
  • Self-hosted сервисы: Доступ к веб-серверам, камерам, NAS на домашнем IP

Как работает DDNS

  1. VyOS мониторит IP-адрес на указанном интерфейсе
  2. При изменении IP обнаруживается изменение
  3. VyOS отправляет обновление DDNS-провайдеру через API/протокол
  4. Провайдер обновляет DNS-запись
  5. DNS-имя теперь указывает на новый IP-адрес

Поддерживаемые протоколы

VyOS поддерживает множество DDNS-провайдеров и протоколов:

  • Standard protocols: DynDNS2, Cloudflare, Namecheap, No-IP, Google Domains
  • Custom protocols: RFC2136 (DNS UPDATE), custom HTTP/HTTPS APIs
  • Multiple providers: Одновременно несколько провайдеров и записей

Базовая конфигурация

DynDNS2 протокол (No-IP, DynDNS)

# Конфигурация DDNS для No-IP
set service dns dynamic name noip service noip
set service dns dynamic name noip host-name myrouter.ddns.net
set service dns dynamic name noip username myusername
set service dns dynamic name noip password mypassword
set service dns dynamic name noip interface eth0

commit
save

Cloudflare DDNS

# Cloudflare использует email + API key
set service dns dynamic name cloudflare service cloudflare
set service dns dynamic name cloudflare host-name myrouter.example.com
set service dns dynamic name cloudflare username email@example.com
set service dns dynamic name cloudflare password cloudflare-api-key
set service dns dynamic name cloudflare zone example.com
set service dns dynamic name cloudflare interface eth0

commit
save

Google Domains DDNS

# Google Domains DDNS
set service dns dynamic name google service googledomains
set service dns dynamic name google host-name myrouter.example.com
set service dns dynamic name google username generated-username
set service dns dynamic name google password generated-password
set service dns dynamic name google interface eth0

commit
save

Namecheap DDNS

# Namecheap DDNS
set service dns dynamic name namecheap service namecheap
set service dns dynamic name namecheap host-name myrouter
set service dns dynamic name namecheap username example.com
set service dns dynamic name namecheap password ddns-password
set service dns dynamic name namecheap interface eth0

commit
save

Расширенная конфигурация

RFC2136 (DNS UPDATE)

RFC2136 позволяет напрямую обновлять DNS-записи на сервере, поддерживающем динамические обновления (например, BIND).

# Настройка RFC2136
set service dns dynamic name rfc2136 service rfc2136
set service dns dynamic name rfc2136 server ns1.example.com
set service dns dynamic name rfc2136 zone example.com
set service dns dynamic name rfc2136 host-name router.example.com
set service dns dynamic name rfc2136 key /config/auth/ddns-key.txt
set service dns dynamic name rfc2136 ttl 60
set service dns dynamic name rfc2136 interface eth0

commit
save

Файл ключа /config/auth/ddns-key.txt (TSIG key):

key "ddns-key" {
    algorithm hmac-sha256;
    secret "base64-encoded-secret-here==";
};

Множественные DDNS записи

# Первый провайдер (No-IP для основного доступа)
set service dns dynamic name primary service noip
set service dns dynamic name primary host-name myrouter.ddns.net
set service dns dynamic name primary username user1
set service dns dynamic name primary password pass1
set service dns dynamic name primary interface eth0

# Второй провайдер (DuckDNS для резерва)
set service dns dynamic name backup service duckdns
set service dns dynamic name backup host-name myrouter.duckdns.org
set service dns dynamic name backup password duckdns-token
set service dns dynamic name backup interface eth0

# Третий провайдер (Cloudflare для корпоративного домена)
set service dns dynamic name corporate service cloudflare
set service dns dynamic name corporate host-name vpn.company.com
set service dns dynamic name corporate username admin@company.com
set service dns dynamic name corporate password cloudflare-api-key
set service dns dynamic name corporate zone company.com
set service dns dynamic name corporate interface eth0

commit
save

Мониторинг через web-интерфейс провайдера

# Конфигурация с IP-check URL (для определения внешнего IP)
set service dns dynamic name myservice service custom
set service dns dynamic name myservice host-name myhost.example.com
set service dns dynamic name myservice username myuser
set service dns dynamic name myservice password mypass
set service dns dynamic name myservice interface eth0
set service dns dynamic name myservice protocol dyndns2
set service dns dynamic name myservice server updates.example.com

commit
save

Использование web-запроса для получения IP

Если роутер за NAT и нужно определить внешний IP:

# Настройка DDNS с web-методом определения IP
set service dns dynamic name myservice service noip
set service dns dynamic name myservice host-name myrouter.ddns.net
set service dns dynamic name myservice username myuser
set service dns dynamic name myservice password mypass
set service dns dynamic name myservice interface eth0
set service dns dynamic name myservice ip-check web
set service dns dynamic name myservice web-url https://api.ipify.org

commit
save

Интервал обновления

# Установить интервал проверки (в секундах, по умолчанию 300)
set service dns dynamic name myservice service noip
set service dns dynamic name myservice host-name myrouter.ddns.net
set service dns dynamic name myservice username myuser
set service dns dynamic name myservice password mypass
set service dns dynamic name myservice interface eth0
set service dns dynamic name myservice timeout 600  # Проверка каждые 10 минут

commit
save

IPv6 DDNS

# DDNS для IPv6 адреса
set service dns dynamic name ipv6ddns service cloudflare
set service dns dynamic name ipv6ddns host-name myrouter-v6.example.com
set service dns dynamic name ipv6ddns username email@example.com
set service dns dynamic name ipv6ddns password cloudflare-api-key
set service dns dynamic name ipv6ddns zone example.com
set service dns dynamic name ipv6ddns interface eth0
set service dns dynamic name ipv6ddns ip-version ipv6

commit
save

Примеры конфигураций

Пример 1: Домашний роутер с No-IP

# Простая конфигурация для домашнего доступа
set service dns dynamic name home service noip
set service dns dynamic name home host-name myhome.ddns.net
set service dns dynamic name home username homeuser
set service dns dynamic name home password HomePass123!
set service dns dynamic name home interface eth0

commit
save

Проверка:

show dns dynamic status

Пример 2: VPN endpoint с Cloudflare

# DDNS для VPN endpoint на корпоративном домене
set service dns dynamic name vpn-endpoint service cloudflare
set service dns dynamic name vpn-endpoint host-name vpn.company.com
set service dns dynamic name vpn-endpoint username admin@company.com
set service dns dynamic name vpn-endpoint password cf_api_key_here
set service dns dynamic name vpn-endpoint zone company.com
set service dns dynamic name vpn-endpoint interface eth0

# WireGuard VPN endpoint использует этот DNS
set interfaces wireguard wg0 address 10.10.0.1/24
set interfaces wireguard wg0 listen-port 51820
set interfaces wireguard wg0 peer client1 allowed-ips 10.10.0.2/32
set interfaces wireguard wg0 peer client1 public-key 'peer-public-key-here'

commit
save

Клиент WireGuard конфигурация:

[Interface]
PrivateKey = client-private-key
Address = 10.10.0.2/24

[Peer]
PublicKey = server-public-key
Endpoint = vpn.company.com:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25

Пример 3: Множественные филиалы

# Головной офис
set service dns dynamic name hq service cloudflare
set service dns dynamic name hq host-name hq-router.company.com
set service dns dynamic name hq username admin@company.com
set service dns dynamic name hq password cloudflare-key
set service dns dynamic name hq zone company.com
set service dns dynamic name hq interface eth0

# Резервная запись на бесплатном сервисе
set service dns dynamic name hq-backup service duckdns
set service dns dynamic name hq-backup host-name company-hq.duckdns.org
set service dns dynamic name hq-backup password duckdns-token
set service dns dynamic name hq-backup interface eth0

commit
save

Пример 4: Self-hosted сервисы (web, mail)

# DDNS для веб-сервера
set service dns dynamic name webserver service cloudflare
set service dns dynamic name webserver host-name www.example.com
set service dns dynamic name webserver username admin@example.com
set service dns dynamic name webserver password cloudflare-api-key
set service dns dynamic name webserver zone example.com
set service dns dynamic name webserver interface eth0

# Port forwarding для веб-сервера
set nat destination rule 100 description 'Port forward HTTP'
set nat destination rule 100 inbound-interface name eth0
set nat destination rule 100 destination port 80
set nat destination rule 100 protocol tcp
set nat destination rule 100 translation address 192.168.1.10

set nat destination rule 110 description 'Port forward HTTPS'
set nat destination rule 110 inbound-interface name eth0
set nat destination rule 110 destination port 443
set nat destination rule 110 protocol tcp
set nat destination rule 110 translation address 192.168.1.10

commit
save

Пример 5: RFC2136 с собственным DNS-сервером

# BIND DNS сервер с поддержкой динамических обновлений
set service dns dynamic name internal service rfc2136
set service dns dynamic name internal server 192.168.1.53
set service dns dynamic name internal zone internal.company.com
set service dns dynamic name internal host-name router.internal.company.com
set service dns dynamic name internal key /config/auth/ddns-update-key.txt
set service dns dynamic name internal ttl 300
set service dns dynamic name internal interface eth1

commit
save

На BIND сервере (/etc/bind/named.conf.local):

key "ddns-key" {
    algorithm hmac-sha256;
    secret "your-base64-secret==";
};

zone "internal.company.com" {
    type master;
    file "/var/lib/bind/db.internal.company.com";
    allow-update { key ddns-key; };
};

Пример 6: Dual-stack (IPv4 + IPv6)

# IPv4 DDNS
set service dns dynamic name dual-v4 service cloudflare
set service dns dynamic name dual-v4 host-name router.example.com
set service dns dynamic name dual-v4 username admin@example.com
set service dns dynamic name dual-v4 password cloudflare-key
set service dns dynamic name dual-v4 zone example.com
set service dns dynamic name dual-v4 interface eth0
set service dns dynamic name dual-v4 ip-version ipv4

# IPv6 DDNS (AAAA запись)
set service dns dynamic name dual-v6 service cloudflare
set service dns dynamic name dual-v6 host-name router.example.com
set service dns dynamic name dual-v6 username admin@example.com
set service dns dynamic name dual-v6 password cloudflare-key
set service dns dynamic name dual-v6 zone example.com
set service dns dynamic name dual-v6 interface eth0
set service dns dynamic name dual-v6 ip-version ipv6

commit
save

Мониторинг и диагностика

Просмотр статуса DDNS

# Показать статус всех DDNS сервисов
show dns dynamic status

# Вывод включает:
# - Имя сервиса
# - Hostname
# - Текущий IP
# - Последнее обновление
# - Статус (good, nochange, error)

Пример вывода:

service: cloudflare
hostname: myrouter.example.com
address: 203.0.113.45
status: good
last update: Mon Jan 15 10:30:45 2024

Принудительное обновление

# Принудительно обновить конкретный сервис
update dns dynamic interface eth0

# Это заставит VyOS сразу отправить обновление всем настроенным провайдерам

Просмотр логов DDNS

# Логи DDNS в syslog
show log | match ddclient

# Последние 50 записей
show log tail 50 | match ddclient

# Real-time мониторинг
monitor log | match ddclient

Проверка текущего IP

# Текущий IP на интерфейсе
show interfaces ethernet eth0 | grep "inet "

# Внешний IP (если за NAT)
curl ifconfig.me
curl api.ipify.org

Проверка DNS резолва

# Проверить, что DNS запись обновилась
nslookup myrouter.ddns.net

# Или с использованием dig
dig myrouter.ddns.net +short

# Проверка через конкретный DNS-сервер
dig @8.8.8.8 myrouter.ddns.net

Отладка проблем

# Проверка конфигурации
show configuration service dns dynamic

# Детальные логи (включить debug)
set system syslog file ddns.log facility daemon level debug
commit

# Просмотр логов
tail -f /var/log/ddns.log

# Отключить debug после отладки
delete system syslog file ddns.log facility daemon level debug
commit

Мониторинг через скрипт

#!/bin/bash
# /config/scripts/monitor-ddns.sh

HOSTNAME="myrouter.ddns.net"
EXPECTED_IP=$(curl -s ifconfig.me)
RESOLVED_IP=$(dig +short $HOSTNAME | head -n1)

if [ "$EXPECTED_IP" != "$RESOLVED_IP" ]; then
    echo "DDNS mismatch: Expected $EXPECTED_IP, Got $RESOLVED_IP"
    logger -t ddns-monitor "DDNS mismatch detected"
    # Отправка алерта
    echo "DDNS issue on $(hostname)" | mail -s "DDNS Alert" admin@example.com
else
    logger -t ddns-monitor "DDNS check OK: $RESOLVED_IP"
fi

Добавить в Task Scheduler:

set system task-scheduler task ddns-monitor interval '*/15 * * * *'
set system task-scheduler task ddns-monitor executable path '/config/scripts/monitor-ddns.sh'
commit
save

Устранение неполадок

Проблема: DDNS не обновляется

Диагностика:

# 1. Проверка конфигурации
show configuration service dns dynamic

# 2. Проверка статуса
show dns dynamic status

# 3. Проверка логов
show log | match ddclient

# 4. Проверка интерфейса
show interfaces ethernet eth0

# 5. Проверка связности с провайдером
ping updates.no-ip.com

Решение:

# Проверить credentials
set service dns dynamic name myservice username correct-username
set service dns dynamic name myservice password correct-password

# Принудительное обновление
update dns dynamic interface eth0

# Перезапуск сервиса (если необходимо)
sudo systemctl restart ddclient

commit
save

Проблема: IP определяется неправильно (за NAT)

Причина: VyOS использует IP интерфейса вместо внешнего IP.

Решение:

# Использовать web-метод для определения IP
set service dns dynamic name myservice ip-check web
set service dns dynamic name myservice web-url https://api.ipify.org

commit
save

Альтернативные URL для определения IP:

  • https://api.ipify.org
  • https://ifconfig.me/ip
  • https://icanhazip.com
  • https://checkip.amazonaws.com

Проблема: Слишком частые обновления

Причина: Провайдер может блокировать за abuse (слишком частые запросы).

Решение:

# Увеличить интервал проверки
set service dns dynamic name myservice timeout 3600  # 1 час

commit
save

Проблема: Аутентификация не проходит

Диагностика:

# Проверка логов
show log | match "authentication failed"
show log | match ddclient

Решение:

# Проверить правильность учетных данных в web-интерфейсе провайдера

# Пересоздать конфигурацию с правильными credentials
delete service dns dynamic name myservice
set service dns dynamic name myservice service noip
set service dns dynamic name myservice host-name myrouter.ddns.net
set service dns dynamic name myservice username correct-username
set service dns dynamic name myservice password correct-password
set service dns dynamic name myservice interface eth0

commit
save

# Принудительное обновление
update dns dynamic interface eth0

Проблема: Hostname не обновляется на Cloudflare

Причина: Cloudflare требует указания zone.

Решение:

# Убедиться, что zone указана
set service dns dynamic name cloudflare zone example.com

# Убедиться, что используется правильный API key (не API token)
# Для Cloudflare нужен Global API Key, не Scoped API Token

commit
save

Проблема: RFC2136 обновления не работают

Диагностика:

# Проверка доступности DNS сервера
ping 192.168.1.53

# Проверка порта 53 UDP
nc -vu 192.168.1.53 53

# Проверка ключа
cat /config/auth/ddns-key.txt

Решение:

# Убедиться, что ключ правильно сконфигурирован на обеих сторонах

# На VyOS - файл ключа должен содержать:
# key "ddns-key" {
#     algorithm hmac-sha256;
#     secret "base64-secret==";
# };

# На BIND - зона должна разрешать обновления:
# allow-update { key ddns-key; };

# Тестирование обновления вручную с клиента
nsupdate -k /config/auth/ddns-key.txt
> server 192.168.1.53
> zone example.com
> update add test.example.com 300 A 192.168.1.100
> send
> quit

Популярные DDNS провайдеры

Бесплатные сервисы

ПровайдерПротоколОсобенности
No-IPnoip3 hostname бесплатно, требует подтверждения раз в 30 дней
DuckDNSduckdnsБесплатно, без ограничений, простой
FreeDNSfreednsМножество доменов, бесплатно
Dynudynu4 hostname бесплатно

Платные/Freemium сервисы

ПровайдерПротоколОсобенности
CloudflarecloudflareБесплатный план + DNS management
Google DomainsgoogledomainsТребует домен в Google Domains
NamecheapnamecheapDDNS для доменов Namecheap
DynDNSdyndns2Платный сервис, надежный

Конфигурация для популярных провайдеров

DuckDNS:

set service dns dynamic name duckdns service duckdns
set service dns dynamic name duckdns host-name mysubdomain.duckdns.org
set service dns dynamic name duckdns password token-from-duckdns
set service dns dynamic name duckdns interface eth0

FreeDNS:

set service dns dynamic name freedns service freedns
set service dns dynamic name freedns host-name myhost.freeddns.org
set service dns dynamic name freedns password update-token
set service dns dynamic name freedns interface eth0

Dynu:

set service dns dynamic name dynu service dynu
set service dns dynamic name dynu host-name myhost.dynu.net
set service dns dynamic name dynu username dynu-username
set service dns dynamic name dynu password dynu-password
set service dns dynamic name dynu interface eth0

Лучшие практики

1. Использование надежных провайдеров

Выбирайте проверенных провайдеров с хорошим SLA:

# Для production - Cloudflare или Google Domains
set service dns dynamic name primary service cloudflare

# Для home/lab - DuckDNS или No-IP
set service dns dynamic name home service duckdns

2. Резервирование DDNS

Настройте множественные провайдеры для резервирования:

# Основной
set service dns dynamic name primary service cloudflare
set service dns dynamic name primary host-name router.example.com

# Резерв
set service dns dynamic name backup service duckdns
set service dns dynamic name backup host-name router-backup.duckdns.org

3. Безопасное хранение паролей

Не используйте простые пароли:

# Плохо
set service dns dynamic name myservice password 123456

# Хорошо - используйте сложные токены/ключи
set service dns dynamic name myservice password 'aB3$kL9@mN5&pQ2#'

4. Мониторинг DDNS

Настройте мониторинг для критичных hostname:

# Task Scheduler для проверки
set system task-scheduler task ddns-check interval '*/15 * * * *'
set system task-scheduler task ddns-check executable path '/config/scripts/check-ddns.sh'

5. Логирование

Включите логирование DDNS для аудита:

set system syslog file ddns.log facility daemon level info

6. Правильный интервал обновления

Не устанавливайте слишком частые обновления:

# Рекомендуется 5-15 минут для динамических IP
set service dns dynamic name myservice timeout 600  # 10 минут

7. TTL для DNS записей

Используйте низкий TTL для DDNS записей:

# Для RFC2136
set service dns dynamic name internal ttl 60  # 1 минута

8. Документирование

Документируйте используемые DDNS hostname:

# Используйте описательные имена в конфигурации
set service dns dynamic name vpn-endpoint ...
set service dns dynamic name web-server ...
set service dns dynamic name remote-access ...

9. Тестирование после настройки

Всегда тестируйте DDNS после настройки:

# Принудительное обновление
update dns dynamic interface eth0

# Проверка статуса
show dns dynamic status

# Проверка DNS
dig myrouter.ddns.net +short

10. Автоматизация для множественных устройств

Используйте Ansible для управления DDNS на множестве роутеров:

- name: Configure DDNS
  vyos.vyos.vyos_config:
    lines:
      - set service dns dynamic name {{ ddns_name }} service {{ ddns_provider }}
      - set service dns dynamic name {{ ddns_name }} host-name {{ ddns_hostname }}
      - set service dns dynamic name {{ ddns_name }} username {{ ddns_username }}
      - set service dns dynamic name {{ ddns_name }} password {{ ddns_password }}
      - set service dns dynamic name {{ ddns_name }} interface {{ ddns_interface }}

Полезные команды

# Показать статус DDNS
show dns dynamic status

# Принудительное обновление
update dns dynamic interface eth0

# Конфигурация DDNS
show configuration service dns dynamic

# Логи DDNS
show log | match ddclient
show log tail 50 | match ddclient

# Real-time мониторинг логов
monitor log | match ddclient

# Проверка DNS резолва
nslookup myrouter.ddns.net
dig myrouter.ddns.net +short

# Проверка внешнего IP
curl ifconfig.me
curl api.ipify.org

# Перезапуск DDNS клиента (если нужно)
sudo systemctl restart ddclient

# Статус сервиса
sudo systemctl status ddclient

# Просмотр конфигурации ddclient
sudo cat /etc/ddclient/ddclient.conf

Интеграция с другими функциями

DDNS + VPN

# DDNS для WireGuard endpoint
set service dns dynamic name wg-endpoint service cloudflare
set service dns dynamic name wg-endpoint host-name wg.example.com
set service dns dynamic name wg-endpoint username admin@example.com
set service dns dynamic name wg-endpoint password cloudflare-key
set service dns dynamic name wg-endpoint zone example.com
set service dns dynamic name wg-endpoint interface eth0

# WireGuard конфигурация
set interfaces wireguard wg0 address 10.10.0.1/24
set interfaces wireguard wg0 listen-port 51820

Клиенты используют wg.example.com:51820 как endpoint.

DDNS + Port Forwarding

# DDNS для self-hosted сервисов
set service dns dynamic name web service cloudflare
set service dns dynamic name web host-name web.example.com

# NAT для HTTP/HTTPS
set nat destination rule 100 inbound-interface name eth0
set nat destination rule 100 destination port 80
set nat destination rule 100 protocol tcp
set nat destination rule 100 translation address 192.168.1.10

set nat destination rule 110 inbound-interface name eth0
set nat destination rule 110 destination port 443
set nat destination rule 110 protocol tcp
set nat destination rule 110 translation address 192.168.1.10

DDNS + Let’s Encrypt

# DDNS обновляет DNS для Let's Encrypt DNS-01 challenge
set service dns dynamic name acme service cloudflare
set service dns dynamic name acme host-name router.example.com

# Let's Encrypt может проверять владение доменом через DNS

Заключение

Dynamic DNS в VyOS - это надежное решение для поддержания доступности устройств с динамическими IP-адресами. Встроенный DDNS-клиент поддерживает все основные провайдеры и протоколы, обеспечивая гибкость и надежность.

Основные преимущества DDNS в VyOS:

  • Поддержка множественных провайдеров одновременно
  • Автоматическое обновление при изменении IP
  • Интеграция с VPN, web-сервисами, удаленным доступом
  • RFC2136 для интеграции с собственными DNS-серверами
  • Dual-stack поддержка (IPv4 + IPv6)

Рекомендации для production:

  • Используйте надежных провайдеров (Cloudflare, Google Domains)
  • Настройте резервные DDNS записи
  • Мониторьте статус DDNS обновлений
  • Используйте правильный интервал обновления (5-15 минут)
  • Документируйте все DDNS hostname
  • Тестируйте после каждого изменения конфигурации

Dynamic DNS в VyOS обеспечивает стабильный удаленный доступ к сетевой инфраструктуре без необходимости статических IP-адресов, что критично для малых офисов, филиалов и домашних сетей.