Альтернатива DynDns или своя реализация
Иногда необходимо прописать 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
Использованы следующие материалы: 1 2 3 Приведенный ключ взят оттуда же.