Динамический IP адрес и бесплатный домен второго уровня

UPD 2020.03.01: Наконец-то вышло большое обновление этой статьи пятилетней давности (от 2015.04.14). Всё поменялось и надо всё актуализировать, а то чего мы в самом деле…

Введение

В данной статье предлагается способ организации полноценного домена второго уровня domen.tk. Связка будет работать с Яндекс Почтой и DNS API. Манипуляции будут применимы для Apache 2.2 и nginx (nginx сейчас актуальнее, поэтому актуальные конфиги на нём). Операционная система — Debian для Apache, и Ubuntu для nginx. Сам веб-сервер имеет динамический внешний ip адрес и подразумевается, что это ваш домашний сервер.

Немного теории

Пользователь Unix рано или поздно задается вопросом создания своего интернет-сервера:

  • для экспериментов с системой;
  • для тестирования/размещения веб-сайтов;
  • для организации доступа к своим сервисам от FTP до VoIP.
  • и многое другое.

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

  • NAT
  • Маршрутизация
  • Через прокси сервер

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

  • постоянный (динамический)
  • временный (статический)
    Сам адрес в свою очередь может быть:
  • внешним (публичным, реальным, белым)
  • внутренним (приватным, не реальным, серым)

При подключение к сети через NAT пользователь получает внутренний адрес. В редких случаях при NAT может быть получен внешний адрес как соответствие внутреннему. Большинство крупных интернет провайдеров предлагают относительно качественный доступ к сети по выделенной линии с использованием именно маршрутизации и внешнего временного адреса. Для проверки пользователя и защиты информации часто пользователю требуется настройка соединения по виртуальному каналу (VPN, PPPoE), этот способ относится тоже к маршрутизации. Пользователи не обладающие внешними IP адресами, организовать доступ к своим серверам извне не смогут. Так же могут возникнуть проблемы, если провайдер блокирует порты.

Самым легким вариантом для организации доступа является наличие у пользователя статического внешнего IP адреса, но не все провайдеры предоставляют такую услугу для физлиц, а те кто предоставляет постоянный адрес делает это на платной основе – 130 рублей в месяц у Билайна (г. Иваново, 2015 г.) или 100 рублей в месяц у Дом.ru (г. Санкт-Петербург, 2019 г.). Деньги не большие, но ощутимые. По причинам легкости и платности вариант со статикой рассмотрен не будет.
К серверу извне можно обратиться зная его внешний временный адрес, но, во первых его не удобно запоминать, во вторых адрес может смениться в любой момент и в третьих на одном адресе можно запустить тысячи веб-сайтов и простое обращение к адресу не откроет нужный сайт. Для удобства использования и расширения функционала есть доменное имя, т.е. буквенное обозначение присвоенное цифровому значению ip адреса.
Доменное имя может быть:

  • первого уровня .ru .com .tk (как правило, обозначает сокращение страны)
  • второго уровня domen.ru, domen.com, domen.tk
  • третьего уровня sub.domen.ru, sub.domen.com, sub.domen.tk
  • и т.д.

Внешний временный адрес можно легко привязать к домену третьего уровня sub.dyndns.org с помощью одной из множества служб DDNS:

Наиболее предпочтителен домен второго уровня вида domen.ru, т.к. легче запомнить и набрать в адресной строке, в рамках такого домена можно создать множество субдоменов третьего уровня вида sub.domen.ru, более того домен второго уровня более престижен.
У большинства служб DDNS есть возможность привязки адреса к домену второго уровня, но на платной основе. Отчасти решает проблему «многоуровневая» связка — динамический адрес регистрируется на dyndns и далее на zoneedit. В итоге получаем обычную переадресацию, т.е. при наборе адреса типа domen.tk происходит перенаправление на domen.dyndns.org.
Многоуровневая связка имеет ряд недостатков:

  • отсутствие обратной зоны
  • увеличенное время отклика от DNS сервера
  • зарубежный трафик
  • чем больше звеньев тем меньше надежность
  • обязательства, например DynDNS требует обязательного посещение пользователем личного кабинета в течение 30 дней
  • ограниченное количество записей (в DynDNS можно добавить всего один хост, а после последнего обновления условий использования, доступна только платная подписка)
  • в некоторых случаях отсутствует единоличное право на свой домен, например на FreeDNS.Afraid.org любой может создать субдомен третьего уровня к вашему второго уровня.

по отзывам, имеющиеся бесплатные службы DDNS часто сбоят.
Возможно существуют службы (в том числе из перечисленных выше), которые лишены всех этих недостатков, но мне все их проверить не довелось, т.к. я сразу нашел и стал использовать, вот уже полтора года, ДНС от Яндекс Почты.
Используя Яндекс мы избавляемся от всех недостатков и получаем доступ к полноценному ДНС серверу, с возможностью бесплатного хранения почты.
Есть у Яндекса один минус, это более сложная настройка – необходимы манипуляции связанные с Яндекс API.  Предложенные в данной статье разъяснения и скрипты превращают минус в плюс, открывая огромное количество скрытых возможностей.

От теории к практике

Алгоритм действий следующий:
1. Создание виртуального хоста на Apache или nginx
2. Регистрация доменного имени и редактирование зоны
3. Регистрация в Яндексе и подтверждение права на домен
4. Делегирование ДНС серверов
5. Получение токена
6. Узнаем свой адрес
7. Пишем скрипт

Подробнее о каждом пункте.

1. Регистрация домена

Регистратор – организация, предоставляющая доменные имена пользователям.
Самый известный российский регистратор NIC.ru, но все имена предоставляются им за плату. Есть один регистратор предоставляющей большинство доменных имен второго уровня в зоне .tk бесплатно – это Dot.tk. (сам сайт при регистрации\авторизации перенаправляет на freenom.com — это норма)
tk – домен первого уровня островов Токелау (между Новой Зеландией и Гавайями)
Зарегистрироваться очень просто, либо создаем новую учетную запись, либо пользуемся уже имеющимися аккаунтами от Google или Facebook.
После регистрации выбираем любое понравившееся имя

Интерфейс, показывающий какие ещё домены можно выбрать

Красивые имена типа linux.tk и solaris.tk стоят 1000 USD за 2 года. А все остальные,  не имеющие схожести с английскими словами – бесплатно, например kurazhov.tk на момент написания и обновления статьи был свободен. Его можно зарегистрировать как бесплатно, так и платно за 9,95 евро. У бесплатного варианта есть обязательство: 25 посещений за 90 дней – вещь совершенно реальная для некоммерческих сайтов, у платного есть возможность продажи и переноса другому регистратору. Количество бесплатных доменов для одного пользователя не ограничено.
После добавления домена в панели управления выбираем ДНС от DotTK (Dot TK DNS Service)

и выбираем «Use default nameservers»

Создаем записи для домена и поддомена www (типа соответствие древним соглашениям, когда нужно www в начале, кто его вообще набирает). Тип записи — А. Указываем свой IP-адрес на данный момент. Для этого заходим во вкладку «Manage Freenom DNS»

Свой ip адрес можно посмотреть в интернете, например тут http://2ip.ru.
После сохранения настроек ДНС – необходимо убедиться что соответствие работает

$ host kurazhov.tk
kurazhov.tk has address 109.195.85.43

Процедура обновления зоны может занять продолжительное время – до нескольких дней. В моем случае на нескольких доменах это заняло пять минут. В любом случае, не закончив этот шаг, не следует приступать к следующему.
Если все в порядке, необходимо убедиться, что наш веб-сервер отвечает. Для этого на веб-сервер загружаем любой контент (достаточно одного файла index.html) и заходим через адресную строку по нашему новому адресу. Если наш контент отображается, значит настройка ДНС от DotTk успешна и наш провайдер не блокирует 80 порт – это важно, т.к. без этого будет сложно доказать свои права на домен.

2. Создание виртуального хоста

Основная цель создания веб-сервера — возможность запуска большого количества сайтов. Для каждого нового сайта нужно добавить файл с названием сайта в имени (для удобства) в /etc/nginx/sites-enabled/ для nginx

2а. Создание виртуального хоста на nginx
Приведу самую-самую простейшую конфигурацию для nginx, взятую из файла default. Секция server:

server {
        listen 80;
        listen [::]:80;
        root /srv/www/domain.tk;
        server_name domain.tk www.domain.tk;
        location / {
             try_files $uri $uri/ =404;
        }
}

Строка listen 80 позволяет принимать запросы на любой адрес, присвоенный провайдером.

2б. Создание виртуального хоста на Apache
Для Apache надо вписать в файл /etc/apache2/apache2.conf текст ниже

<VirtualHost *:80>
    ServerAdmin user@mail.ru
    DocumentRoot "/home/domen.tk/www/"
    ServerName domain.tk
    ServerAlias www.domain.tk
    ErrorLog "/var/log/domain.tk-error_log"
    CustomLog "/var/log/domain.tk-access_log" common
</VirtualHost>

Инструкция VirtualHost *:80 позволяет принимать запросы на любой адрес, присвоенный провайдером.

3. Регистрация на Яндексе

Процедуру регистрации на Яндексе не рассматриваем. Можно воспользоваться существующей записью от Яндекс почты.
Авторизуемся на Яндексе и переходим по адресу https://connect.yandex.ru/portal/services/webmaster.
Выбираем пункт «Добавить домен». Вводим адрес нашего домена domen.tk и нажимаем «Добавить».
Далее нам необходимо подтвердить владение доменом. Это можно сделать тремя способами:

  • с помощью DNS
  • С помощью html-файла
  • с помощью метатега
  • с помощью информации о почте владельца из базы WHOIS

Самый простой и надежный способ это первый. Но надо будет подождать пока обновится DNS-запись. Второй способ довольно прост — надо всего лишь положить в корень нашего веб-сервера html файл с определенным именем. Третий способ ещё проще, так как вам достаточно только изменить файл главной страницы сайта. Четвёртый способ может не сработать по причине непостоянства формата базы Whois или сокрытия e-mail в нём.
Поэтому пойдём старым путём и создадим на нашем веб-сервере в корне предложенный Яндексом файл .html и записываем в него информацию. После сохранения файла запросите подтверждение и Яндекс проверит веб-сайт с нашим доменом на наличие файла – тем самым подтвердится право на обладание доменом. Не обращаем внимание на то, что Яндекс ругается на mx – запись:

4. Делегирование ДНС серверов

Переходим на сайт регистратора dot.tk для делегирования.
Входим в личный кабинет и в настройках домена (Manage domain) выбираем наш ДНС (Management Tools — Nameservers).  Вводим следующие записи:

dns1.yandex.net
dns2.yandex.net

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

5. Получение токена

Если наш ip-адрес сменится, можно поменять записи ДНС через личный кабинет, что не удобно делать каждый раз. Можно автоматизировать процесс с помощью API DNS -специальных команд передающихся поверх протокола http, т.е. с помощью большого количества приложений, включая адресную строку браузера, можно поменять любое значение без редактора ДНС в личном кабинете Яндекса. Список этих команд можно посмотреть тут.
Для того, чтобы записи ДНС были защищены применяется специальный пароль, называемый токеном (token). Прежде чем приступить к выполнению команд необходимо сгенерировать этот самый токен. Авторизуемся на Яндексе и в адресной строке вводим адрес (команду):

https://pddimp.yandex.ru/api2/admin/get_token

Вводим капчу и свой домен (естественно должны быть залогинены в яндексе)
Жмём кнопку Get token
Yandex выдаёт простую страницу, где будет показан ваш уникальный токен домена. Он нам скоро пригодится.

Теперь, согласно документации API от Яндекса опробуем наш токен – введем в консоли:

curl -H 'PddToken: 123456789ABCDEF0000000000000000000000000000000000000' 'https://pddimp.yandex.ru/api2/admin/dns/list?domain=domain.com'

Получаем что то типа этого:

{ "domain": "{имя домена}", "records": [ { "record_id": "{идентификатор записи}", "type": "{тип записи}", "domain": "{имя домена}", "fqdn": "{полное имя домена}", "ttl": "{время жизни записи}", "subdomain": "{имя поддомена}", "content": "{содержимое записи}", "priority": "{приоритет записи}" }, … ], "success": "{статус выполнения запроса}" }

Для более читаемого отображения информации после команды добавьте «| json_pp», это придаст выводу json-образную форму. В дальнейшем так и буду делать

{
   "domain": "{имя домена}",
   "records": 
   [ 
     {
       "record_id": "{идентификатор записи}",
       "type": "{тип записи}",     
       "domain": "{имя домена}",
       "fqdn": "{полное имя домена}",    
       "ttl": "{время жизни записи}",     
       "subdomain": "{имя поддомена}",     
       "content": "{содержимое записи}",
       "priority": "{приоритет записи}"    
     }, 
     …
   ], 
   "success": "{статус выполнения запроса}"
 }

В полученной информации ищем записи типа А для домена и для поддомена www.  Нам нужны их id – это поля «record_id. У каждого домена и у каждого пользователя id будут другими.
У нас есть токен и у нас есть id – этого достаточно чтобы c помощью команды DNS API edit_a_record заменять ip для нашего домена.
Можно попробовать поменять наш ip 8.8.8.8
Выполним запрос через консоль, используя тот же синтаксис:

curl -H 'PddToken: 123456789ABCDEF0000000000000000000000000000000000000' -d 'domain=domain.com&record_id=1&subdomain=@&ttl=14400&content=8.8.8.8' 'https://pddimp.yandex.ru/api2/admin/dns/edit' | json_pp

При правильном выполнении на выходе получаем следующее:

{
   "domain": "{имя домена}", 
   "record_id": "{идентификатор записи}",  
   "record":
   {
     "record_id": "{идентификатор записи}",
     "type": "{тип записи}",     
     "domain": "{имя домена}"
     "fqdn": {"полное имя домена"},    
     "ttl": "{время жизни записи}",     
     "subdomain": "{имя поддомена}",     
     "content": "{содержимое записи}",
     "priority": "{приоритет записи}",
     "operation": "{editing}"    
   },
   "success": "{статус выполнения запроса}"
 }

Если что-то пошло не так, то на выходе будет это:

{
   "domain": "{имя домена}", 
   "success": "{статус выполнения запроса}", 
   "error": "{код ошибки}"
 }

Проверяем результат в кабинете Яндекса и убедившись в том, что запись изменена, возвращаем назад старый адрес.
Для полноценной работы необходимо менять две записи. Для поддомена www тоже. То есть для основного домена после subdomain= должен стоять символ «@», а для www — соответственно «www».

Данный процесс можно автоматизировать написав скрипт и поместив его в cron, либо создав демона.
Но, для начала нужно узнать свой ip-адрес.

6. Узнаем свой адрес

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

  • с помощью ifconfig
  • с помощью SNMP
  • и с помощью сайтов-информаторов

Самый легкий способ это периодический заход на сайты “информаторы” типа:

  • http://ipecho.net/plain
  • http://checkip.dyndns.org

Почему эти сайты, а не популярные 2ip.ru или internet.yandex.ru? Открыв предложенные мной сайты вы поймете, что на них содержится только ваш ip, т.е. при написании скрипта вам не нужно очищать ненужную информацию и как следствие, каждый раз у нас будет уходить меньше трафика при обновлении информации. Данный способ подойдет для всех и кто подключен через роутер и напрямую. Но, есть и свои минусы, данный способ перестает работать если наш сайт «информатор» не работает, либо нет доступа к определенным сегментам сети интернет, либо некорректно работает ДНС сервер провайдера.
Команда в консоли покажет ваш адрес [1]:

wget -qO- http://ipecho.net/plain ; echo

или

 curl ipecho.net/plain ; echo 

Способ с ifconfig самый правильный, достоверный и надежный, но он не работает если мы за роутером (NAT).

ifconfig ppp0 | grep inet | awk '{print $2}' | grep -o '[^addr:].*'
или
curl ifconfig.co

Сетевой интерфейс ppp0 – меняем на свой.
И компромиссный, но самый сложный в плане настройки вариант логирование по SNMP с нашего роутера (данный способ лично я не проверял). С одной стороны данный метод обладает большей надежностью по сравнению с сайтами-информаторами, а с другой ему не страшен NAT. Есть и недостатки не все роутеры поддерживают SNMP и почти у всех отличается формат вывода, к тому же данный способ потребует от пользователя дополнительной настройки роутера и серверной системы.
Большинство роутеров в своих настройка позволяют вести журнал событий (логирование) во внутреннюю память самого устройства и на внешний источник (сервер) по протоколу SNMP. Логирование по SNMP нужно включить в настройках роутера, указав внутренний адрес сервера и уровень логирования (рекомендую ставить максимальный уровень). На сервере FreeBSD в /etc/rc.conf добавить:

syslogd_enable="YES"
syslogd_flags="-f /etc/syslog.conf"

В /etc/syslog.conf добавить внутренний адрес роутера, а под ним указать файл куда сохранять логи:

+192.168.0.1
*.*	/var/log/router.log

И перезапустить систему логирования. Подробнее можно почитать тут.
Из-за разных форматов логирования нет единого стандарта команды для обработки информации из логов. Пример команды для получения своего адреса у роутеров DLINK:

$tail -40 /var/log/router.log | grep IP= | awk '{print $11}' \
| sed -e 's/IP=//'| sed -e 's/,//' | tail -1
8.8.8.8

7. Пишем скрипт

Для успешной работы скрипта необходимо наличие программы curl и jq. Если их ещё по какой-либо причине нет, то ставим:

# sudo apt-get install curl jq -y

Сам скрипт для поддержания его в актуальном состоянии находится на Github.

Не забываем сделать скрипт исполняемым:

# chmod +x yandex-connect-dns.sh 

Скрипт делится на две части: переменные и программа. Переменные берутся из файла settings.ini. Окружение предназначено для Debian-подобных систем, пользователи Linux легко могут адаптировать скрипт под свою систему.

Заключение

Данная статья является сильно переработанной редакцией другой публикации, размещенной на форуме http://forum.lissyara.su/viewtopic.php?t=35711.
В данной статье использован как пример домен domen.tk к которому я не имею отношения, и домен kurazhov.tk к которому я имею непосредственное отношение.
IP адрес 8.8.8.8 тоже ко мне никакого отношения не имеет – это многими известный ДНС сервер от Гугла – часто им пользуюсь для проверки доменных имен, т.к. легко запомнить.
Пару слов про сам Яндекс — не являюсь сотрудником или сильным поклонником данной компании, но факты вещь упрямая: за все это время служба ДНС работала без сбоев. Но хотелось бы упомянуть досадную проблему со сменой API, когда пришлось переписывать весь скрипт.
Есть еще бесплатная функция от Яндекса, которая будет полезна владельцу веб-сервера — это Яндекс.Метрика, позволяющая смотреть детальную статистику своего сайта (вплоть до движения мышки посетителя – вебвизор).
Для кого была написана данная статья? Данная статья возможно содержит излишние подробности, кому-то может показаться скучной и давно пройденным материалом. Но, на просторах интернета не встречал аналогов. Была в одной статье попытка связать noip.com и ДНС Яндекса как многоуровневую систему, без использования API, и как результат баги и неполный функционал. Встречал много статей про привязку к Яндексу статики и ни слова про динамику.  В силу уникальности материал будет полезен не только студентам и школьникам, но и всем кто хочет организовать домашний хостинг. Статья не является переводом зарубежного материала, не является пересказом, а является полностью трудом автора – поэтому желательно при копировании и размещении на своих ресурсах делать ссылочку на оригинал.
Что хотел получить от публикации? Web API является активно развивающимся направлением почти у всех социальных сетей и порталов таких как Яндекс, Google, Facebook, Mail.ru и многих других. Если кто-то заметил, что с помощью Web API той или иной системы можно получить доступ к бесплатным либо интересным сервисам, то жду ваши мысли и идеи.

Видео по созданию домена и переноса на Яндекс

PS:

Хотел бы выразить благодарность автору с форума выше за столь подробное изложение, да и просто за сам факт наличия такой инструкции/помощи. Хотя сам скрипт и инструкция мной сильно переработаны, всё же с этой статьи всё и началось.

[1] https://www.ekzorchik.ru/2014/03/how-to-learn-the-external-ip-from-the-console/
Источник и оригинал статьи: http://www.lissyara.su/?id=2242

10 thoughts on “Динамический IP адрес и бесплатный домен второго уровня

  1. azg

    Можно сделать проще. Зарегистрироваться в сервисе динамических днс dynu.com. Зарегистрировать домен на dot.tk (freenom). Зарегистрированный домен добавить в личный кабинет dynu.com. В личном кабинете freenom прописать NSы dynu.com. Всё. Теперь можно не вздрагивать каждый раз при мысли, что у яндекс опять поменяется апи.

  2. DiDim Автор записи

    Статья теперь актуальна для нового API Яндекса. Что удобно, используется минимум средств для работы с ним: bash, токен для домена и утилита jq.

  3. Dmitry

    После мигрирования в яндекс коннект, эта полезная приблуда перестала работать.
    Надобно обновить инструкцию под современные реалии. Есть идеи?

    1. DiDim Автор записи

      Идей пока нет, так как у API коннекта нет методов для изменения записей DNS. Дико печалит это, но что поделать. Есть на гитхабе проект под коннект — https://github.com/Yukioru/yandex-connect-ddns — но, как там написано, модуль не работает.
      Пока особо не напрягает это, так как IP у меня меняется довольно редко. А если и поменяется, то есть записи на http://freedns.afraid.org и из них уже можно руками в личном кабинете коннекта менять IP.
      Можно попробовать обратиться в поддержку яндекса, чтобы перекинули обратно. Здесь писали об этом — https://toster.ru/q/544909

      1. Dmitry

        С кинектом то-же все работает:

        # команда замены IP в ДНС яндекса для домена $DOMEN_ORG
        curl -H «PddToken: $DOMEN_TOK_ORG» -d «domain=$DOMEN_ORG&record_id=$DOMEN_ID_ORG&content=$MYIP» «https://pddimp.yandex.ru/api2/admin/dns/edit»
        echo «`date +%d-%m-%Y` `date +%H:%M:%S` $DOMEN_ORG : Внешний IP адрес изменен: — $MYIP» >>$LOG

        1. DiDim Автор записи

          О, они наконец-то запилили эту возможность! Круто. Теперь можно актуализировать статью.
          Спасибо большое за информацию.

  4. Иван

    Вот небольшой лайфхак по удаленному доступу. На даче стоит старый компьютер с камерой. Хочу получить к нему удаленный доступ. В деревне у провайдера нет «белого IP» и приобрести его невозможно.
    DDNS работает, но и это бесполезно, потому что соединения извне тупо закрыты провайдером.
    Поэтому использую вот такой VPN сервис — https://vpnki.ru Они не предоставляют выход в интернет, но объединяют мои туннели — один с дачи, другой с смартфона.
    Вдруг кому-то это поможет.

  5. Mikesox

    Домен pilo.tk отвалился. Начал гуглить как получить свой айпи, наткнулся на самый удобный способ тем же курлом curl ifconfig.co В ответ строка с адресом. Спасибо за скрипт, пришлось адаптировать под себя.

    1. DiDim Автор записи

      Добавил этот способ в статью. Спасибо.
      Но опять же этот способ не вечный, возможна та же ситуация, что и с pilo.tk.

Добавить комментарий для DiDim Отменить ответ

Ваш адрес email не будет опубликован.