Dynamic DNS

Есть много сервисов, предоставляющих dynamic DNS, но они все либо тупые, либо платные, либо и то и то. Инструкция, как поднять собственный ddns сервер инсайд.

Нам потребуются: DNS сервер, и веб-морда для управления DDNS. Также будет нужен хотя-бы один домен, в котором можно будет регистрировать клиентов. Данная инструкция базируется на веб-морде proutdns. К сожалению автор забил на нее, и даже не выложил ту недопиленную версию, которая стоит у него самого (с поддержкой IPv6, у выложенной ее нет). Но это можно победить. Итак.

DNS сервер (bind)

Действуем по инструкции

Веб-морда (apache+php+mysql)

Опять же действуем по инструкции. Но если хочется поддержку IPv6 то надо сделать следующее:

  • сделать так, чтобы веб морда отзывалась на ipv6 адрес. Тут на усмотрение задачи: можно сделать на чисто-ipv6 хосте, чтобы клиенты не могли обновлять ddns без ipv6, а можно сделать на гибридном ipv4+ipv6, чтобы клиент обновлял по возможности ipv6, но если оного нет, то ipv4. Последний вариант скорее всего будет бесполезен: если приходится делать ddns на ipv6, значит внешнего ipv4 адреса скорее всего нет вообще;
  • добавляем пару файликов из приложенного ipv6_hacks.zip в корень вебморды.

Клиенты

Для начала надо зарегистрировать пользователя через вебморду и добавить там субдомен. Запишем API ключ аккаунта.

Вручную или скриптом

Штатное обновление DNS записи осуществляется http get запросом вида: http://адрес.морды/upd.php?key=ключ&host=хост&ip=ип, где

  • ключ: API ключ аккаунта;
  • хост: полное имя хоста (включая домен) или слово all для обновление всех записей;
  • ип: ип адрес, который необходимо назначить хосту.

Это работает только для IPv4. В добавленном хаке есть еще один вариант обновления адреса, также http get запрос, но чуть другой: http://адрес.морды/my_update.php?key=ключ&host=хост&ip=ип&clean=1, где все параметры те же самые, за исключением:

  • ip=ип: необязательная часть (если не будет указано, то возьмется адрес, с которого был сделан запрос), также этот параметр можно указывать по имени address;
  • хост: полное имя, ключевых слов нет;
  • clean=1: необязательная часть, если указать — удалит записи другого типа (если был запрос на IPv6 запись, то удалит IPv4 и наоборот).

Готовые клиенты

  • Простейший bash скрипт. Не проверялся глубоко, имеет явные проблемы с проверкой активности, но элементарен:
    #!/bin/bash
    
    IPS=http://адрес.морды/ip.php
    
    while true; do
      # First, retrieve IP address
      CURIP=`curl -s $IPS | awk '{ print $1 }'`
      OLDIP=`cat /tmp/oldip`
    
      # Compare to previously saved IP
      [ "$CURIP" == "$OLDIP" ] && sleep 300 && continue
      echo $CURIP > /tmp/oldip
    
      curl --silent 'http://адрес.морды/my_update.php?key=ключ&host=хост&clean=1'
      # Sleeeeeeep I tell you
      # 300 = 5 minutes
      sleep 300
    done
    
  • inadyn-mt: продвинутый клиент, написанный на C. Пакеты для debian: i386 amd64 исходники. Конфигурация примерно следующая (в /etc/inadyn-mt.conf или в другом файле, но запускать тогда надо с параметром «--input_file файл конфига»):

    --retries 10
    --log_file inadyn_srv.log
    --dyndns_system default@freedns.afraid.org
    --alias хост,key=ключ&host=хост&clean=1
    --update_period 60000
    --dyndns_server_name адрес.морды
    --dyndns_server_url /my_update.php?
    --ip_server_name адрес.морды /ip.php
    
    

    В параметре alias хост указан два раза намеренно, иначе работать не будет. Демон запускается через init.d, так что будет работать автоматически при старте системы.