Dynupdate no ip com что это
Перейти к содержимому

Dynupdate no ip com что это

  • автор:

Перенапрвление запроса к DDNS сервисам (DynDNS,NO-IP. ) на собсвенный DDNS-серверу

Имеется 30 систем видеонаблюдения удалённых от офиса. Не на каждой точке, где установлена система видеонаблюдения, имеется возможность получить статический IP-адрес. Не все видеорегистраторы могут работать с «Облаком» (Р2Р). На каждом видеорегистраторе есть возможность подключить DDNS сервис типа DynDNS,NO-IP, и т.д.

Также есть собственный DDNS-сервер. На точке, где стоит система видеонаблюдения, на компьютере, установлен клиент который раз в 5 минут обращается к DDNS-серверу и в случаи изменения IP-адреса обновляет свою зону на DDNS-сервере. Недостатки такой схемы очевидны (выключили комп, переустановили систему. ).

Хочу реализовать такую идею: 1. В настройках сети видео регистратора, в поле DNS указываем свой DNS-сервер.

2. На моём DNS-сервере создаём зону «domen».dyn.com или «domen».noip.com с IP-адресом моего DNS-сервера (или сервера который будет отвечать на запросы видеорегистраторов)

3. Скрипт, обработки запроса от видеорегистратора, определяет IP-адрес откуда пришёл запрос (по логину и паролю) и в случаи изменения IP-адреса обновляет зону.

Суть этих телодвижений заключается в том что не нужно платить провайдеру за статический IP, а также постоянно играться с разными DDNS-сервисами.

Вот теперь вопрос: Каким образом вычислить, что отсылает видеорегистратор настоящему (не моему) dyn.com и что должен получить видеорегистратор обратно?

NO-IP.COM

Как это работает. Вы регистрируетесь в этом сервисе, получаете логин и пароль, и далее, регистрируете через этот сервис доменное имя (Add a Host). Это доменное имя и будет использоваться вами для доступа к вашему комьютеру, вместо циферок динамического IP-адреса. Доменное имя может быть, например, таким: vasiliy-p.sytes.net.

Далее, каждый раз, когда изменяется ваш IP-адрес, об этом нужно будет сообщать серверу no-ip.com, чтобы он сопоставил зарегистрированное вами доменное имя с вашим динамическим адресом. Как это сделать? Очень просто: для этого достаточно выполнить такой запрос:
http://dynupdate.no-ip.com/dns?username=ваш_логин&password=ваш_пароль&hostname=ваше_доменное_имя
(подробнее об этом здесь)

Многие современные роутеры позволяют настроить свою работу с сервисами, подобными no-ip.com. Таким образом, вы можете сделать такие настройки на роутере и он сам будет обновлять адрес на no-ip.com.
У меня дома долгое время работал роутер D-Link DIR-620 с прошивкой DD-WRT и исправно обновлял адрес на no-ip.com после каждой перезагрузки и затем каждые пять минут. В настоящее время эту же операцию выполняет роутер ZyXEL Keenetic.

Однако, если у вас нет роутера или вы не знаете, как его настроить, или не хотите этим заниматься, делать запросы для обновления адреса можно и с комьютера, к которому вы планируете подключаться. Для этого в автозагрузку компьютера достаточно поместить такой скрипт:

Для Linux:

#!/bin/sh
while [ 1 -eq 1 ]
do
/usr/bin/wget -O — «http://dynupdate.no-ip.com/dns?username=ваш_логин&password=ваш_пароль&hostname=ваше_доменное_имя» >/dev/null 2>&1
sleep 5m
done

Для Windows (этот текст нужно сохранить с расширением .vbs):

Set oHTTP = CreateObject(«WinHttp.WinHttpRequest.5.1»)
do while true
oHTTP.Open «GET», «http://dynupdate.no-ip.com/dns?username=ваш_логин&password=ваш_пароль&hostname=ваше_доменное_имя», True
oHTTP.Send
WScript.Sleep(1000*5*60)
loop

В место этого скрипта можно скачать с сайта noip.com программу Dynamic DNS Update Client, которая будет выполнять эту же функцию (есть версии для Windows, Linux, Mac OSX).

Альтернативный способ — это использование программы IP-Sender.

Настройка ddns-client для Ubuntu

В данном руководстве описывается как настроить dynamic dns клиент для синхронизации вашего IP адреса с сервисом DDNS Zoneedit.com- самым дешевым сервисом DDNS (на момент написания абонентская плата составляла 1USD в месяц). Так же плюсом данного сервиса является то, что доменное имя при работе не искажается. А также с сервисом Noip.com.

Предполагаем, что у вас есть доменое имя (yourdomain.com) и аккаунт на Zoneedit(Noip), и что вы настроили записи для вашего домена на сайте Zoneedit.

В данном руководстве описывается настройка ddns-клиента для домена «yourdomain.com»

Установка

Для начала необходимо установить некоторые пакеты из официального репозитория Ubuntu:

sudo apt-get install ddclient ssh libio-socket-ssl-perl

В процессе установки будут заданы некоторые вопросы для предварительной настройки ddclient. такие как:

Выбирете DNS сервис: zoneedit.com
Имя пользователя для логина на сервисе:
Пароль для входа на сервисе:
Доменное имя: yourdomain.com
Интерфейс для работы (wlan0, eth0 и т.д.):

Настройка Zoneedit.com

После установки необходимдо дополнительно сконфигурировать

/etc/ddclient.conf
sudo vim /etc/ddclient.conf

Необходимо добавить записи для «daemon», «ssl» и заменить «use=if, if=web» with «use=web, web=’http://www.zoneedit.com/checkip.html/’, web-skip=’IP Address’» как показано в примере ниже:

# Configuration file for ddclient generated by debconf # # /etc/ddclient.conf daemon=300 pid=/var/run/ddclient.pid ssl=yes protocol=zoneedit1 ## use=if, if=web use=web, web='http://legacy.zoneedit.com/checkip.html/', web-skip='IP Address' ## server=www.zoneedit.com server=dynamic.zoneedit.com login= password='******* tux.yourdomain.com

Теперь открываем

/etc/default/ddclient
sudo vim /etc/default/ddclient

И проверяем, что файл содержит следующие строки:

run_ipup="false" run_daemon="true" daemon_interval="300"

Вы можете выставить интервал обновления IP (daemon_interval) меньше или больше, но он должен совпадать со значением, указанным в

/etc/ddclient.conf

Теперь необходимо перезапустить ddclient для применения изменений конфигурации:

sudo /etc/init.d/ddclient restart

Для того, что бы проверить статус службы ddclient, выполните

sudo /etc/init.d/ddclient status

Если при перезапуске вы не получаете ошибок, значит служба перезапускается корректно.

Корректный перезапуск службы не означает, что синхронизация вашего IP работает и настроена правильно. ddclient записывает свой лог в

/var/log/syslog

, поэтому для отслеживания состояния, необходимо использовать команду tail

tail -f /var/log/syslog

И дождаться очередной попытки обновить IP адрес, при обновлении вы получите вывод аналогичный следующему:

Feb 5 21:16:36 tux ddclient[12034]: SUCCESS: updating yourdomain.com: IP address set to (200: Update succeeded.)

при попытке обновить IP, когда он не менялся:

Feb 5 21:16:36 tux ddclient[12034]: SUCCESS: updating yourdomain.com: IP address set to (201: No records need updating.)

Это значит ddclient настроен и работает корректно. Поздравляем!

Ошибки

1

Если вы получаете сообщения в

/var/log/syslog
Feb 5 21:13:44 tux ddclient[11788]: WARNING: caught SIGTERM; exiting Feb 5 21:13:45 tux ddclient[11894]: FATAL: Error loading the Perl module IO::Socket::SSL needed for SSL connect.

Вам необходимо проверить конфигурационные файлы

/etc/ddclient.conf
/etc/default/ddclient

на соответствие изложенному выше описанию

Обратите внимание, что в

/etc/ddclient.conf

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

2

Другая распространенная ситуация, когда в

/var/log/syslog

получаете сообщения подобные следующему:

WARNING: file /var/cache/ddclient/ddclient.cache, line 3: Invalid Value for keyword 'ip' = ''

Для решения данной проблемы необходимо удалить файлы кэша ddclient

sudo rm /var/cache/ddclient/ddclient.cache sudo /etc/init.d/ddclient restart

3

Проблема может возникать при работе с сервисом zoneedit.com, связана она с частым изменением IP адреса больше 3 в течение 10 секунд или больше 5 в течение часа. В логах начнёт появляться ошибка

"FAILED: updating xxx.xxxxx.com: 702: Update failed: Too many updates too quickly, try again later.

Это связано с особенностями предоставления сервиса zoneedit.com. Официальный ответ техподдержки zoneedit.com:

«If you have received a 702 error while attempting to update the zone records, this indicates you are exceeding traffic thresholds set by our system. You are only able to send 3 requests in a 10-second window, no more than 5 requests in an hour. If the threshold is exceeded the zone will be locked from updates for one hour. The zone will only be unlocked once no update requests have been sent for a full hour.»

Что в вольном переводе означает: Если вы получаете ошибку 702 при попытке обновить записи зон, значит вы превысили лимит трафика, установленный нашей системой. Вы можете отправлять 3 запроса в 10-секундном окне не более 5 запросов в час. Если лимит трафика превышается, зона блокируется для обновлений на один час. Зона будет разблокирована только в том случае, если не будет получено запросов на обновление в течение полного часа.

Настройка Noip.com

Различия в настройке, только информация в ddclient.conf:

sudo nano /etc/ddclient.conf
protocol=noip use=if, if=ppp0 server=dynupdate.no-ip.com login=yourlogin password='password' example.yourdomain.com

Домашний хостинг сайтов с динамическим IP

У меня (как и у многих web-разработчиков) имеется с десяток сайтов которые необходимо где-то размещать (хостить).

Сайты практически не приносят прибыли, поскольку это какие-то старые работы (по разным причинам не пошедшие в продакшн), домашняя страница, сайт заведенный красивой почты и тому подобное. Но в то же время эти сайты жалко бросать, а потому приходится каждый месяц на них тратить вполне реальные деньги чтобы покупать хостинг. Деньги, прямо скажем небольшие, но тем не менее их жалко, поскольку отдачи от сайтов никакой нет.

В то-же время в наличии имеется:

  • Домашний сервер на Ubuntu
  • Быстрый ethernet-интернет от МТС

Разумеется есть всем известные Dynamic DNS сервисы вроде noip.com, но они успешно решают лишь задачу удаленного доступа к нашему серверу (по SSH или FTP), но для хостинга совершенно нам не подходят, поскольку в настройках домена на DNS-сервере нам нужно обязательно прописать A-запись с реальным IP-адресом (а не ссылку на наш виртуальный домен).

Что делать?

Я не буду останавливаться на том, как настроить linux сервер (и тем более как его выбрать), поскольку предполагаю, что он у вас уже есть. Также я не буду подробно расписывать настройки nginx и Apache, поскольку опять-таки предполагаю, что вы с этим справитесь самостоятельно.

Первое с чем у меня возникли проблемы — это как перенаправить посетителей с моих доменов (у меня есть 2 домена) на мой домашний сервер. То есть чтобы клиент который набрал domain.com попал ровно на мой домашний сервер с учетом того, что на нем каждый день меняется IP-адрес.

Для решения нам нужно настроить DNS-сервер, а именно следующие записи: SOA, NS, MX, A, CNAME. Важно чтобы мы имели возможность настройкой TTL (time to live), поскольку время жизни наших записей должно быть очень небольшим, буквально 60-120 секунд. В противном случае при смене IP-адреса сервера пользователи долго не смогут попасть на наш сервер (из-за кеширования).

Итак, нам нужен DNS сервер, варианты решения:

  1. Используем сервисы которые предоставляют нам DNS-хостинг
  2. Используем собственный DNS-сервер в связке с DDNS-доменом

Используем сервисы которые предоставляют нам DNS-хостинг

Для этого есть ряд бесплатных сервисов, из которых самым популярным является freedns.afraid.org. На таких сервисах можно добавить свой домен(ы) и получить возможность через API обновлять у них A-запись при помощи небольшого скрипта.

Выглядит вполне неплохо, но подвох в том, что эти сервисы оставляют за собой право довешивать к вашему домену поддомены третьего уровня. То есть вы зарегистрировали у них user.ru, а они спокойно довешают свои сайты вида hello.user.ru, shop.user.ru и так далее. Разумеется от этого можно отказаться, но… за деньги. Платить деньги за такие сервисы смысла я не вижу, поскольку за сравнимые деньги вы можете купить полноценный хостинг на каком-нибудь провайдере без всяких плясок вокруг DNS настроек.

Остальные сервисы рассматривать не будем, а сосредоточимся на втором варианте.

Используем собственный DNS-сервер в связке с DDNS-доменом

Для этого варианта у нас, во-первых, должен быть DDNS-домен (который обновляется при смене IP), например, domain.ddns.net, а во-вторых, придется установить и настроить BIND на нашем сервере.

Всего необходимо сделать ровно 5 шагов. Везде под словами «domain» или «domain.ru» подразумевается ваше имя домена (короткое или полное).

1. Настроить 2 или 3 DDNS-поддомена

Почему 2 или 3? Потому, что ряд регистрантов не разрешит вам использовать домен только с одним NS-сервером. Самое обидно, что не все про это скажут — ваш домен просто не будет работать, но вы не будете понимать почему.

Тут все просто — идем на noip.com, там регистрируем аккаунт и добавляем 3 бесплатных поддомена (больше 3 не даст).

2. Настраиваем собственный DNS-сервер
$ sudo apt-get install bind9

Создаем зоны (по одной зоне на каждый наш домен):

$ sudo nano /etc/bind/zones.my
zone "domain.ru" < type master; file "/etc/bind/db.domain.ru"; >;

и собственно файл с настройками зоны:

$ nano /etc/bind/db.domain.ru
; ; BIND data file for local loopback interface ; $TTL 60 @ IN SOA domain.ru. admin.domain.ru. ( 1477015437 ; Serial 10800 ; Refresh 3600 ; Retry 604800 ; Expire 1800 ) ; Negative Cache TTL @ IN NS domain.ddns.net. @ IN NS domain.ddnsking.com. @ IN NS domain.myftp.biz. @ IN MX 10 mx.yandex.net. @ IN A 1.2.3.4 mail IN CNAME domain.mail.yandex.net. * IN CNAME domain.ru. 

Примечание: обращаю внимание, что TTL устанавливаем равным 60 секунд. В файле /etc/bind/named.conf.local добавляем подключение нашей зоны:

include "/etc/bind/zones.my";

Все, рестартуем BIND:

$ sudo service bind9 restart

И глянем /var/log/syslog чтобы там не было сообщений об ошибках

3. Настроить наш домен(ы)

Идем в панель управления регистратора и там в настройках нашего домена в качестве NS-серверов указываем созданные DDNS-поддомены:

nameserver1 = domain.ddns.net nameserver2 = domain.ddnsking.com nameserver3 = domain.myftp.biz

После этого возможно придется подождать несколько часов (или даже сутки) пока настройки среплицируются между всеми серверами.

4. Настроить периодическое обновление IP-адресов

Мой роутер поддерживает обновление IP-адреса на одном домене, но мне нужно это делать сразу для 3-х доменов. Плюс нам надо обновлять IP-адрес в конфиге BIND’а, поэтому напишем скрипт который будет делать:

  1. Определять наш внешний IP-адрес
  2. Проверять изменился ли IP адрес, если не изменился, то ничего делать не надо
  3. Обновлять IP-адрес у всех DDNS-поддоменов через API сервиса noip.com
  4. Прописывать новый IP адрес в конфиг BIND’а
  5. Перезапускать BIND
#!/bin/sh # This script works via noip.com service + local Bind server # Settings ZONES_CONFIG=zones.my IP_FILE=./current_ip.txt DDNS_USER=user DDNS_PASS=password DDNS_HOST=domain.ddns.net DDNS_HOSTS=domain.ddns.net,domain.ddnsking.com,domain.myftp.biz # Start DATE=$(date +"%Y-%m-%d %H:%M:%S") # detect an external IP IP=$(dig +short $DDNS_HOST) if [ $? -ne 0 ] || [ -z $IP ] || [ $IP = "0.0.0.0" ] ; then echo "$DATE Can't detect a remote IP. Aborting." exit 1 fi # verify IP changing PREV_IP="(unknown)" if [ -e $IP_FILE ] ; then PREV_IP=$(cat $IP_FILE) fi if [ $IP = $PREV_IP ] ; then echo "$DATE IP '$IP' has not changed" else echo "$DATE IP has been changed from '$PREV_IP' to '$IP'" echo "$DATE IP will be updated on DDNS server" /usr/bin/curl -u $DDNS_USER:$DDNS_PASS "https://dynupdate.no-ip.com/nic/update?hostname=$DDNS_HOSTS&myip=$IP" fi echo $IP > $IP_FILE # check BIND config cd /etc/bind if [ ! -e $ZONES_CONFIG ] ; then echo "$DATE File $ZONES_CONFIG not found!" exit 1 fi # read the list of active zones ZONE_FILES=$(grep file $ZONES_CONFIG | grep -v ^# | perl -ne '/file "(.+)"/ && print "$1\n"') for ZONE_FILE in $ZONE_FILES; do echo "$DATE Process the zone config $ZONE_FILE" cat $ZONE_FILE | perl -ne "s/([\t ]+IN[\t ]+A[\t ]+)[\d\.]*/\$$/; print \$" > $ZONE_FILE.tmp if [ $(diff -w $ZONE_FILE $ZONE_FILE.tmp | wc -l) -ne 0 ] ; then # update serial number STAMP=$(date +%s) cat $ZONE_FILE.tmp | perl -ne "s/\d+(?=.+Serial)/$STAMP/; print \$" > $ZONE_FILE # reload BIND service bind9 reload echo "$DATE Config $ZONE_FILE is updated" else # nothing to do rm $ZONE_FILE.tmp echo "$DATE Config $ZONE_FILE is NOT changed" fi done 

Скрипт нужно запускать под рутом (чтобы ему хватило прав обновлять конфиги BIND’а и рестартовать его). Добавляем в crontab рута его запуск каждую минуту:

* * * * * cd /home/root && ./update_bind_config.sh >> /var/log/update_bind_config.log

Пару слов про определение текущего IP-адреса. В скрипте выше это делается через резолвинг DDNS-поддомена domain.ddns.net. То есть сначала наш роутер его туда прописывает, а потом мы читаем. Это не очень хороший вариант, поскольку мы завязываемся на роутер и можем потерять несколько минут пока на DDNS-поддомене обновится IP-адрес на актуальный. Все это время наш сервер будет недоступен.

Поэтому у себя я использовал улучшенный вариант, который заодно не лазит в интернет:

IP=$(perl -le 'use LWP::UserAgent; my $content=LWP::UserAgent->new->get("http://router")->decoded_content(); $content =~ q(([\d\.]+)); print $1')

В данном варианте мы загружаем главную страницу роутера (через http), дальше регэкспом находим на ней текущий IP-адрес. Разумеется, этот вариант подходит далеко не всем, но на DD-WRT прошивках работает.

5. Настройка роутера
  • HTTP — TCP, 80-ый порт
  • DNS — TCP+UDP, 53 порт

Вывод

Итак, что я получил в итоге:

  • Мои сайты живут на домашнем сервере, за который я никому не плачу;
  • Мои домены резолвятся через мой собственный DNS-сервер, время жизни записей 1 минута, то есть обновление происходит очень быстро;
  • В качестве NS-записей указаны не реальные IP-адреса (которые у меня часто меняются), а DDNS-поддомены;
  • Актуальность записей в DDNS-поддоменах и в конфиге моего DNS-сервера обеспечивается автоматически, без какого-либо вмешательства со моей стороны.

P.S. Если кому-то понравилась данная заметка, то я могу написать вторую часть, где расскажу как настроить работу с использованием DNS-хостинга Яндекса. Это позволит отказаться от собственного DNS-сервера, отказаться от DDNS-поддоменов, плюс чуть улучшит надежность работы (поскольку DNS-сервер никогда не будет менять свой IP). Именно такую схему я использую в настоящий момент.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *