Альтернатива DynDns или своя реализация

Материал из support.qbpro.ru
Версия от 22:44, 9 сентября 2013; imported>Vix (Новая страница: «Иногда необходимо прописать DNS для компьютера с динамическим IP адресом. Простым путем дл…»)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)

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