С открытием в другом городе филиала офиса потребовалось настроить туда сервер. Всё бы хорошо, но там нет статического IP-адреса. Конечно же можно много чего придумывать: например, можно использовать решение третьих компаний (dyndns), использовать канал OpenVPN оттуда и заходить удаленно именно через vpn. Но эти решения также имеют свои недостатки. К слову и их также я применил, но данная статья вовсе не об этом.
Итак. Что нам нужно? Нам нужен DNS-сервер (благо у меня имеются) на постоянном IP-шнике. Там крутится Bind9, потому всё будет применимо именно к такой версии.
Что будет? Сервер будет получать адрес по dhcpcd. Он должен оповестить DNS-сервер об этом: изменить ему зону, удалив старый IP-адрес и добавив запись с новым. Теперь загляним под копот.
Для начала надо определиться с зоной ДНС. Можно выбрать зону совершенно независимо от реальных. Назовём её, скажем, dynamics.lan
Теперь сгенерерируем ключи, необходимые серверу, для обновления зоны на DNS:
dnssec-keygen -a HMAC-MD5 -b 512 -n USER dyn
Мы получили 2 файла – *.key и *.private. По опыту могу сказать, что сразу надо проверить идентичность ключей (иногда вставляется лишний пробел).
Файл *.private положем на DNS-сервер в папку /etc/bind
и добавим в /etc/bind/named.conf описание зоны:
key dyn {
algorithm hmac-md5;
secret "ключ";
};
.........................
zone "dynamics.lan" {
type master;
file "/var/cache/bind/dynamics.lan.zone";
allow-update {
key dyn;
};
};
Дописываем зону :
$ORIGIN .
$TTL 86400 ; 1 day
dynamics.lan IN SOA localhost. vash.dns.server. (
7 ; serial
10800 ; refresh (3 hours)
3600 ; retry (1 hour)
6048 ; expire (1 hour 40 minutes 48 seconds)
600 ; minimum (10 minutes)
)
NS localhost.
NS vash.dns.server.
A 192.168.0.11
$ORIGIN dynamics.lan.
$TTL 600 ; 10 minutes
router1 A 192.168.0.10
Обновив Bind9, можно приступать к настройке на сервере для филиала:
создаём скрипт в /opt/update_ip:
#!/bin/bash
ip=`ifconfig eth0|awk '/inet addr/ {print($2)}'|awk -F\: '/addr/ {print($2)}'` && echo "server vash.dns.server. 53\n zone dynamics.lan.\n update delete router1.dynamics.lan. A\n update add router1.dynamics.lan. 600 A $ip\n show\n send \n"|/usr/bin/nsupdate -k /etc/bind/Kdyn.+157+55093.private -vv
Разберём немного код. В переменную ip в результате разбора текста попадает текущий адрес, полученный сервером на интерфейсе eth0. Далее генерится файлик, похожий на:
server vash.dns.server. 53
zone dynamics.lan.
update delete router1.dynamics.lan. A
update add router1.dynamics.lan. 600 A 192.168.0.10
show
send
Ну и последняя команда берет эти данные и файл с ключём /etc/bind/Kdyn.+157+55093.private и передаёт их на DNS-сервер.
DNS-сервер, получив такой запрос, удаляет запись со старым адресом и добавляет запись с новым.
Добавим в крон задание:
*/5 * * * * root /opt/update_ip >> /var/log/update_ip.log
Теперь мы автоматизировали процесс.
А на рабочей машине можно написать такой скрипт /opt/sshrt1:
ssh -l имя_юзера `host router1.dynamics.lan адрес_вашего_DNS |grep has|awk '/has/ {print($4)}'`
Теперь, лишь набрав /opt/sshrt1, мы попадём на приглашение ssh нашего сервера вне зависимости, от его текущего
Июль 23, 2009 в 2:33 пп |
Вау!!!!! Колесо это круто!!!!!!!!!!!!!!!!!!!
Сентябрь 5, 2009 в 7:02 пп |
Маленький еще.