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
- VyOS мониторит IP-адрес на указанном интерфейсе
- При изменении IP обнаруживается изменение
- VyOS отправляет обновление DDNS-провайдеру через API/протокол
- Провайдер обновляет DNS-запись
- 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
saveCloudflare 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
saveGoogle 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
saveNamecheap 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
saveIPv6 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.orghttps://ifconfig.me/iphttps://icanhazip.comhttps://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-IP | noip | 3 hostname бесплатно, требует подтверждения раз в 30 дней |
| DuckDNS | duckdns | Бесплатно, без ограничений, простой |
| FreeDNS | freedns | Множество доменов, бесплатно |
| Dynu | dynu | 4 hostname бесплатно |
Платные/Freemium сервисы
| Провайдер | Протокол | Особенности |
|---|---|---|
| Cloudflare | cloudflare | Бесплатный план + DNS management |
| Google Domains | googledomains | Требует домен в Google Domains |
| Namecheap | namecheap | DDNS для доменов Namecheap |
| DynDNS | dyndns2 | Платный сервис, надежный |
Конфигурация для популярных провайдеров
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 eth0FreeDNS:
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 eth0Dynu:
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 duckdns2. Резервирование 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.org3. Безопасное хранение паролей
Не используйте простые пароли:
# Плохо
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 info6. Правильный интервал обновления
Не устанавливайте слишком частые обновления:
# Рекомендуется 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 +short10. Автоматизация для множественных устройств
Используйте 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.10DDNS + 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-адресов, что критично для малых офисов, филиалов и домашних сетей.