Домен второго уровня для домашнего хостинга или DNS от Яндекса без использования службы DDNS на примере 1cru.ru
В данной статье рассматривается один из способов организации доступа к вашему домашнему веб-серверу из сети интернет с использованием любого технически возможного доменного имени.
Суть проблемы заключается в том, что большинство крупных провайдеров выделяют по стандартным тарифам динамические публичные адреса. Что делает невозможным классическое использование привязки доменного имени к конкретному адресу без использовании стороннего DNS-сервера. Проблему можно решить с помощью денежных вливаний или с помощью бюджетных способов.
Можно купить у провайдера статический публичный адрес. Стоимость в среднем 150 рублей в месяц. И воспользоваться услугой DNS-хостинга от 50 руб в месяц. Т.е. в месяц надо выделять по 200 рублей.
Но, есть жаба которая душит и говорит, что один из московских провайдеров предлагает всего за 150 рублей в месяц безлимитный интернет на скорости 12 Мбит/сек, а так же локальную сеть и т.д. Достаточно ли такой скорости для веб-сервера? Это тема для другой статьи, но цена за интернет доступ заметно дешевле чем дополнительные услуги по обеспечению доступности веб сервера из вне.
Рассмотрим бюджетные варианты. Есть хорошо известные службы такие как dyndns.org, no-ip.com и др. С помощью таких служб и специального ПО мы получаем постоянный доступ к серверу по доменному имени, но получаем домен третьего уровня и из списка тех которые предлагают данные службы.
А, что если есть необходимость в использование короткого домена второго уровня? Например, 1cru.ru. Опять платить за DNS-сервер?
С появлением бесплатного DNS-хостинга от Яндекса https://pdd.yandex.ru/help/section9/ появилась возможность прозрачного использования стандартного интернет подключения при условиях применения публичных динамических адресов и отсутствие фильтрации трафика у провайдера. И, что самое приятное нет необходимости в dyndns.org.
Если у вас нет почты от Яндекса, то зарегистрируйтесь т.к. большинство сервисов русского гугла такие как: Яндекс деньги, маркет, работа, вебмастер, директ и многое другое включая DNS-хостинг используют одну учетную запись.
http://passport.yandex.ru/passport?mode=register
В этой статье предполагается, что вы знакомы с системой регистрации и работы с доменными именами, а так же у вас уже есть как минимум один оплаченный домен. В качестве примера в этой статье используется мой сервер 1cru.ru и вся служебная информация такая как методы API DNS – не забываете менять данные на свои!
Авторизуемся на Яндексе и идем по адресу добавления домена.
https://pdd.yandex.ru/domains_add/
Вводим название Вашего домена и нажимаем кнопку подключить.
Далее нам надо сделать подтверждение владение доменом. Предлагается три способа. Для меня самый удобный способ, это подтверждение с помощью email:
Код: Выделить всё
Укажите адрес allseen+1a2b3c4d5f6e@yandex.ru в качестве контактного почтового адреса для вашего домена (если этот адрес ваш регистратор не принимает, то укажите вместо него 1a2b3c4d5f6e@yandex.ru). Эта операция производится при помощи инструментов вашего регистратора доменов.
В кабинете изменяем контактный email на указанный Яндексом allseen+1a2b3c4d5f6e@yandex.ru, несмотря на формат почта на данный ящик будет приходить без проблем. Более того, после процедуры подтверждения контактный email можно будет сменить, таким образом есть возможность переноса нескольких доменов.
Далее в кабинете регистратора делегируем домен серверам Яндекса:
Код: Выделить всё
dns1.yandex.ru
dns2.yandex.ru
После делегирования в кабинете Яндекса в разделе «Мои домены» запись 1cru.ru из чёрного цвета окрашена в зеленый цвет – это говорит о том что домен проверен и можно перейди в удобный редактор DNS.
В моем случае достаточно добавить только запись типа А и указать в ней мой адрес 95.24.3.162.
После сохранения записи в редакторе идем в консоль FreeBSD проверяем:
Код: Выделить всё
www# host 1cru.ru
1cru.ru has address 95.24.3.162
1cru.ru mail is handled by 10 mx.yandex.ru.
Встает резонный вопрос: Как обновлять эту запись автоматически? Тут помогут методы API DNS Яндекса, список которых можно посмотреть тут http://api.yandex.ru/pdd/doc/api-dns/re ... pi-dns.xml
В нашем случае наибольший интерес представляет метод edit_a_record позволяющий изменять запись типа А
Синтаксис запроса
Код: Выделить всё
https://pddimp.yandex.ru/nsapi/edit_a_record.xml ?
token=<токен пользователя>
& domain=<имя домена>
& record_id=<id записи>
& content=<содержимое записи>
domain - Имя домена, для которого добавляется или меняется DNS-запись.
record_id - Идентификатор (id) изменяемой записи. Берется из аттрибута id. id можно получить можно с помощью метода get_domain_records (чтение записей зоны домена).
content - Cодержимое DNS-записи.
Форма ответа на удачно выполненный запрос
Код: Выделить всё
<page>
<domains>
<domain>
<name>...</name>
</domain>
<error>ok|...</error>
</domains>
</page>
1. Получение в реальном в времени информации о нашем настоящем адресе
2. Отправка этого адреса на DNS-сервер Яндекса.
1. Задача решается легко если ваш сервер напрямую подключен к кабелю - в данном случае поможет команда ifconfig в связке с grep и awk. Но, в моем случае сервер подключен через роутер. Можно запросить адрес и у роутера, но роутеры все разные и методы будут не универсальны.
Можно узнать свой адрес в интернете например по адресу http://www.2ip.ru. Но, страница там слишком весомая, придётся много парсить, да и трафика может много уходить в зависимости от частоты проверок. Поэтому мною был найден сайт с возможностью отображения только ip в текстовом формате:
http://www.showmyip.com/simple
2. Чтобы взаимодействовать с Яндексом, в частности менять записи типа А для начала необходимо получить секретный код «token». Для этого открываем любимый браузер, авторизируемся на Яндексе и вводим в адресную строку:
Код: Выделить всё
https://pddimp.yandex.ru/get_token.xml?domain_name=1cru.ru
Необходимо просмотреть исходный код страницы где, собственно и будет спрятан наш token:
Код: Выделить всё
<?xml version="1.0" encoding="utf-8"?>
<page><ok xmlns:x="http://www.yandex.ru/xscript" xmlns:xi="http://www.w3.org/2001/XInclude" token="1a2b3c4d5e6f7a8b9c10d11l12f13a14b15c"/></page>
Также нам необходимо получить id записи типа А.
С помощью браузера получаем все записи нашей зоны:
Код: Выделить всё
https://pddimp.yandex.ru/nsapi/get_domain_records.xml?token=1a2b3c4d5e6f7a8b9c10d11l12f13a14b15c&domain=1cru.ru
Получаем ответ:
Код: Выделить всё
1cru.ru95.24.3.162dns1.yandex.ru.v=spf1 redirect=_spf.yandex.rudomain.mail.yandex.net.domain-xmpp.ya.ru.domain-xmpp.ya.ru.domain-xmpp.ya.ru.domain-xmpp.ya.ru.dns1.yandex.ru.dns2.yandex.ru.mx.yandex.ru.ok
Код: Выделить всё
<?xml version="1.0" encoding="windows-1251"?>
<page>
<domains><domain><name>1cru.ru</name><response><record domain="1cru.ru" priority="" ttl="21600" subdomain="@" type="A" id="5099342">95.24.3.162</record><record domain="1cru.ru" priority="" ttl="21600" subdomain="@" type="SOA" id="5099109" refresh="14400" retry="900"
.........
.........
</page>
Приступаем к написанию скрипта на шелле с применением клиентской программы умеющей работать с URL такой как fetch, wget или curl. Остановлюсь на curl, который в минимальной установке BSD не предусмотрен поэтому выполняем:
Код: Выделить всё
www# cd /usr/ports/ftp/curl
www# make install
Код: Выделить всё
www# cd /usr/local/etc/rc.d
www# vi ip.sh
#!/bin/sh
MYIP=`curl -s http://212.117.175.194/simple/`
NSIP=`host 1cru.ru | grep address | awk '{print $4}'`
if [ $MYIP == $NSIP ]
then
exit 1
else
curl -s "https://pddimp.yandex.ru/nsapi/edit_a_record.xml?token=1a2b3c4d5e6f7a8b9c10d11l12f13a14b15c&domain=1cru.ru&record_id=5099342&content=$MYIP"
fi
token= a2b3c4d5e6f7a8b9c10d11l12f13a14b15c
record_id=5099342
Делаем созданный файл исполняемым, что бы он выполнялся при загрузке в случае системных сбоев
Код: Выделить всё
www# chmod 555 ip.sh
Код: Выделить всё
www# crontab –e
# my public ip address send to yandex.ru every 10 min
*/10 * * * * /usr/local/etc/rc.d/ip.sh
Прошу прощения за возможные ошибки – это моя первая статья. Жду ваши отзывы, предложения, пожелания.