Собственный Dynamic DNS

    Иногда необходимо прописать DNS для компьютера с динамическим IP адресом. Простым путем для этого являются сервисы по типу dyndns, описанные в недавнем топике Связываем домен и динамический IP. Иногда такой подход работает достаточно плохо.

    Напрмер в моей ситуации, провайдер иногда меняет мой публичный IP адрес. Это иногда случается обычно раз в несколько месяцев. Кроме того, мой домашний компьютер перезагружается крайне редко. За это время сервис dyndns, которым я пользовался ранее успевал пару раз прислать мне оповещения о неактивности с целью отключить «неиспользуемый» аккаунт. Перейти на вручную прописываемую DNS зону также не получается, потому что иногда адрес все же меняется. Причем обычно об этом узнаешь когда нужен доступ к домашнему компьютеру здесь и сейчас.

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


    Итак:
    1. Имеем установленный сервер bind9 с доменом server.org
    2. Создаем зону client.server.org.zone:

    $ORIGIN .
    $TTL 10 ; 10 seconds
    client.server.net IN SOA ns1.server.net. hostmaster.server.net. (
    18 ; serial
    10800 ; refresh (3 hours)
    3600 ; retry (1 hour)
    604800 ; expire (1 week)
    10 ; minimum (10 seconds)
    )
    $TTL 3600 ; 1 hour
    NS ns1.server.net.
    NS ns2.server.net.
    MX 10 client.server.net.


    здесь сервера ns1.server.net и ns2.server.net — DNS сервера для нашей зоны, client.server.net — адрес нашего домашнего компьютера

    3. генерим ключи на клиенте:
    client# cd /etc/namedb/keys
    client# dnssec-keygen -b 512 -a HMAC-MD5 -v 2 -n HOST client.server.net.


    4. Создаем фаил с ключем на сервере:
    server# cd /var/named/chroot/etc
    server# vim keys.conf :


    key client.server.net. {
    algorithm "HMAC-MD5";
    secret "omr5O5so/tZB5XeGuBBf42rrRJRQZB8I9f+uIIxxei8qm7AVgNBprxtcU+FQMzBvU/Y+nyM2xbs/C8kF3eJQUA==";
    };


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

    Выставляем права доступа к фаилу с ключами:
    server# chmod 640 keys.conf
    server# chown root:named keys.conf


    5. добавляем нашу зону в named.conf:
    include "/etc/keys.conf"
    zone "client.server.net" {
    type master;
    file "zones/client.server.net";
    allow-update{
    key client.server.net;
    };
    };


    Здесь прописан параметр, который позволяет обновлять данные зоны. Вообще, почитав мануалы, можно найти опции этого параметра, позволяющие обновлять только одну запись в зоне для данного ключа. Т.е можно иметь зону с прописанными в ней поддоменами client1, client2, etc. которые будут авторизоваться с ключами key1, key2, etc.

    6. Перезапускаем DNS сервер:
    server# /etc/init.d/named reload

    7. Создаем на клиенте скрипт, который будет обновлять данные зоны:
    #!/bin/bash
    IFACE="wlan0"
    TTL=3600
    SERVER=ns1.example.com
    HOSTNAME=foo.example.com
    ZONE=example.com
    KEYFILE=/root/ddns-keys/Kfoo.example.com.+157+12345.private

    new_ip_address=`ifconfig $IFACE | grep "inet addr:" | awk '{print $2}' | awk -F ":" '{print $2}'`
    new_ip_address=${new_ip_address/ /}

    nsupdate -v -k $KEYFILE << EOF
    server $SERVER
    zone $ZONE
    update delete $HOSTNAME A
    update add $HOSTNAME $TTL A $new_ip_address
    send
    EOF


    В начале скрипта описаны соответствующие параметры: интерфейс, имена сервера и зоны, местоположение фаила с ключем.

    8. Осталось только настроить автозапуск/автоматическую смену адреса при смене DNS.
    Мы это сделаем при помощи скрипта для NetworkManager:
    создадим фаил /etc/NetworkManager/dispatcher.d/20-dyndns.sh:
    #!/bin/sh

    iface=$1
    state=$2

    if [ "x$state" == "xup" ] ; then
    /etc/namedb/ddns-update
    elif [ "x$state" == "xdown" ]; then
    true
    fi


    Сделаем его исполняемым и принадлежащим пользователю root.

    Запускаем-проверяем-пользуемся.

    Upd: Если не работает — проверяем (устанавливаем) на сервере права named на записть в папку в которой лежит фаил client.server.org.zone
    named будет создавать там фаил client.server.org.zone.jnl

    Использованы следующие материалы:
    http://www.freebsdwiki.net/index.php/BIND,_dynamic_DNS
    http://blog.jasonantman.com/2010/04/bind9-dynamic-dns/
    http://www.oceanwave.com/technical-resources/unix-admin/nsupdate.html
    Приведенный ключ взят оттуда же.
    Метки:
    Поделиться публикацией
    Похожие публикации
    Реклама помогает поддерживать и развивать наши сервисы

    Подробнее
    Реклама
    Комментарии 21
    • 0
      $TTL 10; 10 seconds
      По-моему, минимальный TTL в DNS — 60 секунд.
      • 0
        Хм… Ну конкретно эти настройки я копипастил чтобы было где посмотреть, и куда дальше копать. У меня на сервере прописано следующее:

        client.server.com IN SOA server.com. root.server.com. (
        2010060504; serial
        600; refresh (10 minutes)
        600; retry (10 minutes)
        86400; expire (1 day)
        3600; minimum (1 hour)
        )

        Вообще, это по желанию можно менять в разумных пределах.
        • 0
          Не скопировалось все…
          $TTL 3600
          • +1
            хо, час — это дефолтное значение у бинда. Много для динамического домена, я обычно 300 секунд ставлю, и нагрузка на ДНС еще небольшая (если домен популярный) и 5 минут — приемлемое время. Для непопулярных доменов ставлю 60 секунд.
            • 0
              Ну у меня это домашний компьютер, ничего интересного-публичного на нем не висит, IP меняется реже раза в месяц — так что меня такая конфигурация устраивает. Хотя можно и 60 секунд повесить.
              • 0
                вам точно ясен смысл TTL в DNS? Это время жизни кеша (на других ДНС-серверах, куда ляжет в кеш эта запись и на локальных рекурсорах компьютеров). Неважно, как редко меняется ваш ip, TTL означает, как скоро вы узнаете о том, что он сменился, через час или через минуту.
                • 0
                  Ну теперь стало немного понятнее. Как я уже писал выше, у меня IP меняется раз в несколько месяцев, так что попасть на часовую задержку сложно, да и не очень страшно, меня это устраивает. Хотя значение в 300 секунд выглядит более оправданным.
      • НЛО прилетело и опубликовало эту надпись здесь
        • +1
          Я такие полезные вещи собираю на домашнем компьютере ввиде небольших статей со ссылками на первоисточники либо списка действий что-где-прописывать. Так что по сути статья — копипаста с «домашнего» блога, разбавленная введением и небольшими комментариями где я что-то интересное упомнил.
          • НЛО прилетело и опубликовало эту надпись здесь
            • 0
              Спасибо-спасибо.
              Но про блюлюдечко вы преувеличиваете. Скорее представлено наличие альтернативного метода и описано его применение в конкретном случае. Для других случаев это будет только стартовой точной. Для других операционных систем — я вообще затрудняюсь как это будет реализовано.
        • 0
          Помнится около года назад задавался таким вопросом, вот мой вариант решения данной задачи.
          • 0
            Ну, если не вдаваться в детали, метот тот же.
            Да, у вас упомянуто про доступ к папке named, я про это забыл написать, хотя сам имел с этим проблеммы, пока не настроил правильно.
            • 0
              Если честно, я неделю мучился, по сути за неимением полной информации(а особенно не желанию её искать) приходилось идти наобум. В итоге сделал записку для себя чтобы не наступать больше на грабли. К сожалению не додумался тогда выложить на хабр.
              Кстати, больше всего времени было убито именно из-за неверных прав на /var/named/ ^_^
          • +1
            > Напрмер в моей ситуации, провайдер иногда меняет мой публичный IP адрес. Это иногда случается обычно раз в несколько месяцев. Кроме того, мой домашний компьютер перезагружается крайне редко. За это время сервис dyndns, которым я пользовался ранее успевал пару раз прислать мне оповещения о неактивности с целью отключить «неиспользуемый» аккаунт.

            Если это единственная проблема, то пользуйтесь afraid.org
            • 0
              честно говоря удивительно что у вас не ловится изменения ip (или плохо). У меня не одна машина на stream которая меняет ip стабильно 1 раз в сутки.
              может стоит сменить клиент dyndns?
              • 0
                В том то и дело, что у меня машина не меняет IP по нескольку месяцев. (если меняет — все замечательно). dyndns в этом случае начинает волноваться о неактивности клиента, и предлагает удалить учетную запись.

                Но основная мысль в том, что имеется «домашняя» альтернатива dyndns. И кому-то это может оказаться полезно.
              • 0
                Есть гораздо более простой метод, если DNS имя не критично:
                Ставится скрипт, который проверяет внешний адрес, и если он меняется — высылает новый на почту.
                • 0
                  ну ведь лень же… а так настроил все один раз, нажимаешь на кнопочку — и ты там.
                  • 0
                    Ну так…
                    И кстати, у того же dyndns есть платный сервис за 15$/год (т.е. в месяц 1,25$ или чуть меньше 40 рублей), где аккаунты могут висеть сколько угодно на одном IP.
                    Думаю стоит добавить в пост, есстественно с добавлением «но если у вас есть внешний DNS и жалко 40руб/месяц...» =)
                    • 0
                      Я сослался в начале на недавний пост про dyndns. И для многих ситуаций он вполне хорош.
                      Но здесь я обсуждаю альтернативный подход. Потому что если у вас есть сервер с DNS — какой смысл платить деньги дяде, когда можно использовать свой субдомен.

                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.