Я пытаюсь настроить клиент Dynamic DNS на своем маршрутизаторе с прошивкой dd-wrt (v24-sp2), чтобы он динамически изменял IP-адрес в одной из записей DNS. К сожалению, я столкнулся с проблемой… Вот пример запроса от их конфигурация ddclient:
https://www.cloudflare.com/api.html?a=DIUP&u=<my_login>&tkn=<my_token>&ip=<my_ip>&hosts=<my_record>
Он работает, если я использую его в браузере, но в dd-wrt я получаю такой результат:
Tue Jan 24 00:36:47 2012: INADYN: Started 'INADYN Advanced version 1.96-ADV' - dynamic DNS updater.
Tue Jan 24 00:36:47 2012: I:INADYN: IP address for alias '<my_record>' needs update to '<my_ip>'
Tue Jan 24 00:36:48 2012: W:INADYN: Error validating DYNDNS svr answer. Check usr,pass,hostname! (HTTP/1.1 303 See Other
Server: cloudflare-nginx
Date: Mon, 23 Jan 2012 14:36:48 GMT
Content-Type: text/plain
Connection: close
Expires: Sun, 25 Jan 1981 05:00:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Location: https://www.cloudflare.com/api.html?a=DIUP&u=<my_login>&tkn=<my_token>&ip=<my_ip>&hosts=<my_record>
Vary: Accept-Encoding
Set-Cookie: __cfduid=<id>; expires=Mon, 23-Dec-2019 23:50:00 GMT; path=/; domain=.cloudflare.com
Set-Cookie: __cfduid=<id>; expires=Mon, 23-Dec-2019 23:50:00 GMT; path=/; domain=.www.cloudflare.com
You must include an `a' paramiter, with a value of DIUP|wl|chl|nul|ban|comm_news|devmode|sec_lvl|ipv46|ob|cache_lvl|fpurge_ts|async|pre_purge|minify|stats|direct|zone_check|zone_ips|zone_errors|zone_agg|zone_search|zone_time|zone_grab|app|rec_se
URL из «Location» работает отлично, и параметр «a» включен. В чем проблема?
Я не думаю, что вы можете настроить его там, где DD-WRT напрямую вызывает CloudFlare. Я настроил его так, чтобы DD-WRT вызывал PHP-скрипт на удаленном веб-сервере, который затем определяет IP-адрес клиента и отправляет запрос обновления в CloudFlare через их API.
DDNS Service: Custom
DYNDNS Server: <yourserver.com>
Username: <anything>
Password: <anything>
Host Name: <your domain name to update on cloudflare>
URL: /cloudflare_update.php?key=<your secret key>&hostname=
if(empty($_GET['key']) || ($_GET['key'] != "<your secret key>")) die;
$hostname = $_GET['hostname'];
$ip = $_SERVER['REMOTE_ADDR'];
$username = "<yourcloudflareusername@email.com>";
$api = "<your cloudflare api key>";
$curl = "https://www.cloudflare.com/api_json.html?a=DIUP&hosts=$hostname&u=$username&tkn=$api&ip=$ip";
$ch = curl_init($curl);
curl_exec($ch);
curl_close($ch);
Вместо использования базовой аутентификации HTTP я просто использую случайный ключ.
Убедитесь, что вы создали запись DNS для доменного имени, которое хотите обновить, в CloudFlare; параметр действия DIUP обновит IP только для уже существующей записи.
Если вы хотите выполнить обновление со своего маршрутизатора, то не обойдется и без того факта, что вам понадобится небольшое дополнительное `` что-то '' в середине, чтобы преобразовать ваш вызов в формат CloudFlare (если только DNS-O-Matic добавит их в их поддерживаемые услуги ...). Вместо того, чтобы самостоятельно размещать промежуточный скрипт, вы можете просто использовать Google AppEngine (который является бесплатным), чтобы сделать эту повторную публикацию за вас. Я использую это:
https://cloudflare-updater.appspot.com/
Хорошо, вам все равно нужно вызвать что-то другое, кроме CloudFlare, чтобы выпустить обновление, но, по крайней мере, вам не нужно запускать дополнительный хост или VPS и т.д., чтобы сделать это самостоятельно. Он полностью прозрачен - проблема только в том, что вы не получаете сообщения об ошибках, поэтому вам нужно проверить его работу самостоятельно. Как только он заработает, он должен просто запустить и запустить.
Заметим, что все это устарело и теперь для работы требуется код API v4.
проверено выше и не работает - плохой пользователь, пароль, информация xxxx.
обзор этого метода https://github.com/ScottHelme/CloudFlareDDNS
Удалось заставить это работать, используя это: https://github.com/dcerisano/Cloudflare-dynamic-dns
После настройки учетной записи Cloudflare необходимую информацию легко найти:
Вам нужно: ID зоны
Ключ авторизации (он же глобальный ключ API)
Идентификатор A-записи для вашего домена (его можно получить, запустив сценарий cloudflare-dns-id.sh). Мне пришлось немного обрезать сценарий, чтобы он заработал ..
curl -X GET "https://api.cloudflare.com/client/v4/zones/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/dns_records?type=A&name=dynamic"\ -H" X-Auth-Email: you@youremail.com "\ -H" X-Auth-Key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx "\ -H" Content-Type: application / json "
Я сохранил оба сценария в / jffs, сделав их исполняемыми.
Что касается Cloudflare, я настраиваю в соответствии с этим руководством только для доменных записей Cloudflare:
В Cloudflare необходимо установить следующие рекорды:
Тип: A | Имя: динамический | Значение: «ваш IP-адрес в глобальной сети» ***
Тип: CNAME | Имя: «yourdomain.xyz» | Значение: динамический. "Yourdomain.xyz"
Тип: CNAME | Имя: www | Значение: yourdomain.xyz
Я настраиваю задание cron для запуска cloudflare-ddns.sh каждые 5 минут для проверки изменений IP.
Мой маршрутизатор DD-WRT теперь автоматически обновляет Cloudflare при изменении IP-адреса WAN ...
Установка выше занимает около 10 минут.