
Описание решения
Доступ к серверу осуществляется по доменному имени, в качестве DNS-хостинга используется CloudFlare, о котором тут как-то уже писали. Беглый поиск по настройкам аккаунта привел меня к описанию API, из которого я понял, что зону можно обновлять без помощи web-интерфейса.
Для начала нам необходимо получить токен для доступа к API, он есть в настройках аккаунта CloudFlare, там же его можно изменить. Также, для прохождения авторизации при запросах к API необходимо использовать email, на который зарегистрирован ваш аккаунт CloudFlare.
После этого необходимо выполнить запрос всех параметров DNS для заданного нам домена, которые нам пригодятся в дальнейшем. Сделать это можно просто через адресную строчку бразуера:
https://www.cloudflare.com/api_json.html?a=rec_load_all&tkn=ваш_токен&email=ваш_emailm&z=ваш_домен
Ответ на этот запрос, на первый взгляд, может показаться непонятным. Нужно внимательно в него приглядеться и найти нужную нам А-запись (вообще, подразумевается, что она там одна). Для этой записи необходимо найти следующие параметры: rec_id, zone_name, name.
Далее, нам нужно определиться, как мы будем получать наш текущий внешний IP-адрес. Для решения этой задачи я воспользовался специальным сервисом от Яндекса.
Для того чтобы обращаться из командной строки к различным URL я использовал программу curl, которую предварительно скачал. Для корректной работы нам нужна версия с поддержкой SSL.
Программирование BAT-файла
Используя все вышеописанное формируем bat-файл и ставим его на исполнение каждые 5 минут в планировщике задач Windows.
@echo off
rem Обнуляем переменную IP на всякий случай
set IP=''
rem Задаем путь к curl, указываем ключ -s чтобы отключить лишний вывод
set curl=C:\Windows\System32\curl.exe -s
rem Задаем url для скачивания своего IP, воспользуемся сервисом от Яндекса
set ip_url=http://ipv4.internet.yandex.ru/api/v0/ip
rem Присваиваем результат выполнения команды curl переменной IP
for /F %%f in ('%curl% %ip_url%') DO set IP=%%f
rem Обрезаем от переменной IP слева и справа по одному символу, так как изначально Яндекс отдает значение в кавычках
set IP=%IP:~1,-1%
echo My IP: %IP%
set tkn=ваш_токен
set email=ваш_email
set a=rec_edit
set id=тут_вставляем_значение_rec_id_полученное_ранее
set z=тут_вставляем_значение_name_полученное_ранее
set type=A
set name=тут_вставляем_значение_zone_name_полученное_ранее
rem Service_mode выставляем в 0, это отключает встроенное в Cloudflare проксирование и выставляет для домена реальный IP
set service_mode=0
rem Минимальный TTL, который позволяет задать Clodflre - 120 секунд
set ttl=120
set content=%IP%
rem Запускаем обновление зоны с заданными параметрами, указываем ключ -k чтобы отключить проверку подлинности сертификатов домена Cloudflare
%curl% -k "https://www.cloudflare.com/api_json.html?tkn=%tkn%&email=%email%&a=%a%&id=%id%&z=%z%&type=%type%&name=%name%&service_mode=%service_mode%&ttl=%ttl%&content=%IP%"
Результат
Таким образом, в результате выполнения скрипта, каждые 5 минут будет обновляться DNS вашего доменного имени, куда будет записываться внешний IP-адрес компьютера, на котором выполняется скрипт.
После всего этого остается проблема, что при выполнении этого скрипта на рабочей машине каждые 5 минут на секунду будет появляться черное окошко с консолью. Так как я не работаю непосредственно за этим компьютером, то не стал решать эту проблему и оставил все как есть. Однако, если это необходимо, то решения есть, нужно просто воспользоваться поиском.