IPv6, miredo, dynamic DNS AAAA

Привязка любого домена к динамическому IPv4

Захотелось странного — чтоб мои IPv6-enabled (miredo) хосты еще и динамически обновляемую DNS запись имели. Поизучав вопрос выяснил, что многие распространённые dyndns сервисы или не предоставляют возможность регистрации AAAA (IPv6 эквивалент записи типа A для IPv4), или не предоставляют её бесплатно, или имеют мутные настройки динамического обновления неизвестного уровня безопасности (или вовсе http/plaintext). Перепробовал с десяток сервисов и решил остановиться на freedns.afraid.org


Плюсы:

  • Человеко-понятная админка (без всяких «купить AAAA за $0 USD»)
  • Бесплатно дают AAAA
  • Безопасное (https) обновление
  • URL-based обновление (не приходится испытывать сомнений о конфиге для агентов типа ddclient)

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

<code class="bash">cat /etc/cron.d/freedns-watcher 
<code class="bash">PATH=/sbin:/usr/sbin:/bin:/usr/bin

* * * * * root ipv6=$(ip a |grep -s -i -o <span class="string">'2001\:[a-f0-9\.:]*'</span>) &&
 <span class="test_condition">[ <span class="string">"$(nslookup -query=AAAA myhost.mooo.com ns1.afraid.org |grep -s -i -o '2001\:[a-f0-9\.:]*')"</span> != <span class="string">"<span class="variable">$ipv6</span>"</span> ]</span> &&
 curl -m 30 https://freedns.afraid.org/dynamic/update.php?bnJxM3kxMHRHF1p4B0NmSXJDfEFLc0NJOjEzMTEyNjv2\&address=<span class="variable">$ipv6
</span> 2>/dev/null |grep Updated && date >> /var/log/freedns.log &> /dev/null

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

<code class="bash">* * * * *

5 звёздочек — информация для cron «запускать это каждую минуту»

<code class="bash">root

сами решайте под какой учёткой запускать

<code class="bash">ipv6=$(ip a |grep -s -i -o <span class="string">'2001\:[a-f0-9\.:]*'</span>)

Достаем из выхлопа ip teredo-адрес, работает примерно так:

<code class="bash">ip a |grep -s -i -o <span class="string">'2001\:[a-f0-9\.:]*'</span>
2001:0:52ab:53b:2ab4:555e:23d0:1dc9

Если адрес найден — помещаем его в переменную $ipv6, если не найден — присвоение фейлится и дальнейших трудов по обновлению записи AAAA не производится (ведь типичная причина отсутствия teredo адреса — отсутствие подключения (IPv4) к Интернету, да и обновлять собственно особо не на что)

<code class="bash"><span class="test_condition">[ <span class="string">"$(nslookup -query=AAAA myhost.mooo.com ns1.afraid.org |grep -s -i -o '2001\:[a-f0-9\.:]*')"</span> != <span class="string">"<span class="variable">$ipv6</span>"</span> ]</span>

Опрашиваем сервер ns1.afraid.org на предмет «какой там нынче IP адрес у вас записан для моего AAAA?» и сравниваем с тем, что нам сконфигурил на данный момент miredo. Если совпадает — ни чего делать не надо, выполнение скрипта прерывается. Почему указан их DNS сервер вместо системного? Что бы минимизировать задержку нотификации нашего скрипта об изменение записи. На других DNS серверах изменение будет с большой задержкой. Можно было бы ни чего не проверять а тупо долбить ежеминутно по указанному URL, но по-моему это хамство. С другой стороны отправка DNS запросов о вашем AAAA это в каком-то смысле палево, поэтому данная часть скрипта может считаться опциональной.

<code class="bash">curl -m 30 https://freedns.afraid.org/dynamic/update.php?bnJxM3kxMHRHF1p4B0NmSXJDfEFLc0NJOjEzMTEyNjv2\&address=<span class="variable">$ipv6</span> 2>/dev/null 
|grep Updated
  • Обновляем нашу AAAA запись (по https заметьте)
  • bnJxM3kxMHRHF1p4B0NmSXJDfEFLc0NJOjEzMTEyNjv2 — персональный ключ для обновления нашего хоста, найдете в админке freedns.afraid.org в разделе Dynamic DNS -> Direct URL
  • &address=$ipv6 — собственно передаем параметром наш teredo IPv6 найденный в самом начале скрипта
  • 2>/dev/null |grep Updated — проверяем успешность обновления. В случае успешного, сервер выдаст что-то вроде
    <code class="bash">Updated 1 host(s) myhost.mooo.com to 2001:0:52ab:53b:2ab4:555e:23d0:1dc9 <span class="keyword">in</span> 0.008 seconds
    
<code class="bash">date >> /var/log/freedns.log

пишем в лог дату успешного обновления AAAA

<code class="bash">&> /dev/null

cron, не беспокойся пожалуйста и не присылай нам письмо каждую минуту по поводу запуска этого скрипта

Запись опубликована в рубрике *Soft, *Unix,*Linux, *Сети. Добавьте в закладки постоянную ссылку.

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

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

Я не спамер This plugin created by Alexei91