30 окт. 2012 г.

Сам себе dyn-dns через bash и pdd.yandex.ru

Задача

Сделать статическое доменное имя для своего домешнего сервера с динамическим IP-адресом

Исходные данные

У меня есть домен rekby.ru, делегированный на DNS-сервера yandex, домашний сервер на ubuntu-сервер, интернет-провайдер билайн с l2tp-соединением.

Варианты

  1. dyndns.org им подобные
  2. Работа через Яндекс-API
Вариант 1 раньше был хорошо и удобен, потом интерфейс, регистрации и т.п. так замудрили, что стало сложно разобраться как там добраться до бесплатной DNS-записи, так что он не подошел.

Настройка автообновления IP на DNS-серверах yandex

Для начала создайте A-запись с нужным поддоменом и любым IP-адресом в интерфейсе pdd.yandex.ru

Потом нужно получить токен для доступа к API: 
https://pddimp.yandex.ru/get_token.xml?domain_name=ВашДомен 
там нужно авторизоваться своей учеткой яндекса, в ответ будет выдан xml из которого нужен только token, он там виден.

Затем нужно перейти на страницу 
https://pddimp.yandex.ru/nsapi/get_domain_records.xml?token=ТокенСПрошлогоШана&domain=ВашДомен
Тут нужно посмотреть record_id вашего поддомена.
Скрипт bash для обновления IP-Адреса:
#!/bin/bash
TOKEN=ВашТокен
RECORD_ID=ВашRecordID
DOMAIN=ВашДомен
SUBDOMAIN=ВашПоддомен
LINE=`ifconfig ppp | grep --color=never "inet addr"`
# extract IP from line: inet addr:2.93.172.129  P-t-P:85.21.208.191  Mask:255.255.255.255
LINE=( $LINE )
IPADDR=${LINE[1]}
IPADDR=${IPADDR:5}
wget -O /dev/null "https://pddimp.yandex.ru/nsapi/edit_a_record.xml?token=$TOKEN&domain=$DOMAIN&subdomain=$SUBDOMAIN&record_id=7136651&content=$IPADDR&ttl=900" 2>/dev/null
Дайте скрипту права выполнения и поставьте на выполнение после сразу после поднятия соединения или просто поставьте в CRON раз в 5 минут. Чаще смысла не имеет, т.к. TTL=900 секунд, т.е. 15 минут, меньше яндекс поставить не дает.

11 комментариев:

  1. Привет. можно задать пару вопросов по скрипту?

    ОтветитьУдалить
    Ответы
    1. Просто я выполняю скрипт для пробы
      wget -O /dev/null "https://pddimp.yandex.ru/nsapi/edit_a_record.xml?token=xxx9f2031a7d8bcdfa431dxxx7dc84018c12edbf3a2554603b3a8fd04&domain=site.ru&subdomain=subdomain&record_id=6511554&content=192.168.1.1&ttl=900" 2>/dev/null

      Но в яндексе ни чего не обновляется..(((

      Удалить
    2. попробуйте сделать wget -O - ... чтобы чтобы цпуе выдал ответ на стандартный вывод и посмотрите что он напишет или сохраните его ответ в файл и посмотрите файл.

      Удалить
    3. Все дело в том что я хочу заставить работать этот запрос на роутере dd-wrt там урезанный linux

      На полноценной системе все прекрасно работает, но только с использованием ключа --no-check-certificate вместе с wget, а в роутере пишет что этот ключ неизвестен... можно ли как то заставить работать этот запрос по http и без проверки сертификата?

      Удалить
    4. проверил, у меня на ddwrt wget вообще молчит о причине ошибки, но ip да - тоже не меняет и на ключ ругается.

      Вообще у меня с настройками внутри ddwrt не сложилось - они не сохраняются при перезагрузке роутера, так что этот скрипт я запускаю с домашнего сервера. Можно запускать с домашнего компьютера или еще чего-то - с того к чему нужно обеспечивать доступ и где есть полная система с настройками, информацией обошибках, полными версиями wget и т.п.

      Если домашние компьютеры под виндой - можно поставить cygwin, там вполне работает cron, wget и прочие удобные вещи.

      Удалить
    5. Wget на роутере просто нужно запускать без опций -o и /dev/null а просто wget --no-check-certificate тогда отругается.

      У меня нет домашнего сервера, хочу поднять втп на роутере вставив в него флешку, и лить бэкапы сайта туда...

      Пришлось седня пока настроить no-ip org

      Удалить
    6. тело коментария сожрало ковычки
      вот так нужно выполнять чтоб отругался:
      wget --no-check-certificate ссылка

      Удалить
    7. с ddwrt подробно, так что проконсультировать не смогу.
      Из общих соображений - попробовать самостоятельно скомпилировать туда wget из исходников с поддержкой этой опции или поставить что-то вроде curl и попробовать выполнять запросы через них.
      В крайнем случае если вы программист - написать простенькую программку которая это будет делать на python, php, c

      Удалить
    8. в общем решил вопрос подключение флешки и установки на нее wget-ssl после этого команда нормально отрабатывает и кстати вот вариант скрипта который работает:

      #!/bin/bash
      IPADDR=`ifconfig ppp0 | sed -n '/inet /{s/.*addr://;s/ .*//;p}'`
      wget -O /dev/null "https://pddimp.yandex.ru/nsapi/edit_a_record.xml?token=СЮДАПИШЕМСВОЙТОКЕН&domain=НАЗВАНИЕВАШЕГОДОМЕНАТОЧКАРУ&subdomain=НАЗВАНИЕПОДДОМЕНА&record_id=ИДЗАПИСИПОДДОМЕНА&content=$IPADDR&ttl=900" 2>/dev/null

      Просто в том виде что у Вас не хочет он работать ни как

      Удалить
    9. Возможно, у меня он работает на Linux Ubuntu :)

      Удалить
  2. тулза под винду для смены А-записи домена делегированного на яндекс есть тут http://dns-ip.ru/Home/DynDns/, там же описание по установке

    ОтветитьУдалить