
🚀 Как настроить динамический DNS через Cloudflare на Raspberry Pi
Ваш домашний сервер на Raspberry Pi работает круглосуточно, но провайдер меняет внешний IP каждый день. Стучиться по новому адресу вручную, занятие для археолога. А DynDNS и No-IP достали письмами: «зайдите раз в месяц, иначе отключим бесплатный аккаунт».
Оказывается, Cloudflare умеет работать как динамический DNS, без рекламных рассылок, без ограничений по частоте обновлений и без сторонних поддоменов. У вас уже есть домен на Cloudflare? Тогда всё, что нужно, API-токен и bash-скрипт на Raspberry Pi. За полчаса поднимаете схему, которая сама обновляет A-запись при каждой смене IP.
А если хочется не просто «попасть в консоль», а развернуть полноценный сайт для разработки, на том же WordPress, эта связка становится фундаментом: вы получаете доступ к своему серверу из любой точки мира по красивому поддомену вроде home.example.com.
💡 Быстрый обзор:
- Шаг 1: Создаём A-запись в DNS-панели Cloudflare с тестовым IP
0.0.0.0 - Шаг 2: Получаем API-токен (не глобальный ключ, токен безопаснее и отзывается в один клик)
- Шаг 3: Запускаем bash-скрипт, который опрашивает текущий IP и пушит его в Cloudflare API
- Шаг 4: Ставим задание cron, и забываем про ручное обновление навсегда
Что понадобится
- Домен, добавленный в Cloudflare и управляемый через их DNS
- Raspberry Pi (подойдёт любая модель, Pi 3, Pi 4, Pi Zero 2 W) с Raspbian или Raspberry Pi OS
- Статический локальный IP для Raspberry Pi (настраивается в GUI ОС или через роутер)
- Доступ к терминалу Pi по SSH или напрямую
Какие именно сервисы вы хостите на Raspberry Pi и как пробрасываете порты на роутере, отдельная тема, выходящая за рамки этого туториала. Схема работает одинаково что для веб-сервера с WordPress, что для VNC-доступа или камеры наблюдения.
1. Создаём A-запись для домашнего сервера
Придумайте поддомен, он станет постоянной точкой входа. Я использую home, но вы можете выбрать любой: dev, lab, cam.
- Зайдите в дашборд Cloudflare и выберите домен
- Перейдите на вкладку DNS
- Нажмите Add record, тип, A
- В поле Name введите поддомен (например,
home) - В поле **IPv4 **address укажите
0.0.0.0, временно, чтобы проверить работу скрипта позже - Оставьте Proxy status выключенным (серое облако), кеширование и прокси для DDNS не нужны

Запись готова. Теперь получим ключ доступа к API.
2. Получаем API-токен Cloudflare
Раньше все инструкции предлагали глобальный API-ключ, он даёт полный доступ ко всем доменам аккаунта. Это опасно: утечёт ключ, утечёт всё. Сейчас Cloudflare рекомендует API-токены с гранулярными правами. Токен можно ограничить конкретным доменом и действием, а в случае компрометации, отозвать одним нажатием.
- В дашборде Cloudflare перейдите: My Profile → API Tokens
- Нажмите Create Token
- Выберите шаблон Edit zone DNS (или создайте кастомный)
- В разделе Zone Resources укажите конкретный домен, тот, для которого настраиваете DDNS
- Нажмите Continue to summary → Create Token
- Скопируйте токен, он показывается только один раз
Токен выглядит как длинная строка, начинающаяся с cfut_. Храните его в безопасном месте, скрипту на Raspberry Pi он понадобится через минуту.
3. Скрипт автообновления на Raspberry Pi
Подключитесь к Raspberry Pi по SSH или откройте терминал. Создадим папку для скрипта:
1 mkdir -p ~/cf && cd ~/cf
Теперь, сам скрипт. Создайте файл cloudflare-ddns.sh:
1 nano ~/cf/cloudflare-ddns.sh
Скопируйте в него следующий код:
1 #!/bin/bash 2 3 ## Настройки (замените на свои) 4 AUTH_EMAIL="[email protected]" 5 API_TOKEN="cfut_ваш_токен" 6 ZONE_NAME="example.com" 7 RECORD_NAME="home.example.com" 8 9 ## Получаем текущий публичный IP 10 CURRENT_IP=$(curl -s https://api.ipify.org) 11 12 ## Получаем Zone ID 13 ZONE_ID=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones?name=$ZONE_NAME" \ 14 -H "Authorization: Bearer $API_TOKEN" \ 15 -H "Content-Type: application/json" | grep -o '"id":"[^"]*"' | head -1 | cut -d'"' -f4) 16 17 ## Получаем Record ID и текущий IP записи 18 RECORD=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records?name=$RECORD_NAME" \ 19 -H "Authorization: Bearer $API_TOKEN" \ 20 -H "Content-Type: application/json") 21 22 RECORD_ID=$(echo "$RECORD" | grep -o '"id":"[^"]*"' | head -1 | cut -d'"' -f4) 23 DNS_IP=$(echo "$RECORD" | grep -o '"content":"[^"]*"' | head -1 | cut -d'"' -f4) 24 25 ## Обновляем запись, если IP изменился 26 if [ "$CURRENT_IP" != "$DNS_IP" ]; then 27 UPDATE=$(curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records/$RECORD_ID" \ 28 -H "Authorization: Bearer $API_TOKEN" \ 29 -H "Content-Type: application/json" \ 30 --data "{\"type\":\"A\",\"name\":\"$RECORD_NAME\",\"content\":\"$CURRENT_IP\",\"ttl\":120}") 31 32 echo "$(date): IP changed from $DNS_IP to $CURRENT_IP — updated" >> ~/cf/cloudflare-ddns.log 33 else 34 echo "$(date): IP unchanged ($CURRENT_IP)" >> ~/cf/cloudflare-ddns.log 35 fi
Замените четыре переменные в блоке «Настройки» на свои реальные значения. Email, тот же, что для входа в Cloudflare. Токен, тот, что скопировали на шаге 2. Название зоны, ваш домен без http://. Имя записи, полный поддомен.
Сохраните файл (Ctrl+O, Enter, Ctrl+X в nano) и сделайте его исполняемым:
1 chmod +x ~/cf/cloudflare-ddns.sh
Запустите вручную для проверки:
1 ~/cf/cloudflare-ddns.sh
Если всё настроено верно, зайдите в DNS-панель Cloudflare, IP-адрес A-записи должен смениться с 0.0.0.0 на ваш реальный публичный IP. Лог пишется в ~/cf/cloudflare-ddns.log, загляните туда, если что-то пошло не так.
4. Автоматизация через cron
Ручной запуск, только для проверки. Дальше работает cron.
1 crontab -e
Если система попросит выбрать редактор, берите nano (обычно под номером 2, он самый простой). Добавьте строку в конец файла:
1 0 */6 * * * /bin/bash /home/pi/cf/cloudflare-ddns.sh
Эта запись запускает скрипт каждые 6 часов. Даже если провайдер меняет IP раз в несколько месяцев, шестичасовое окно, разумный компромисс между актуальностью и нагрузкой на API.
Если хотите чаще, замените на */30 * * * * (каждые 30 минут). Но помните: бесплатный лимит Cloudflare API, 1200 запросов в минуту, так что даже поминутный вызов не страшен для одного домена.
Сохраните (Ctrl+X, Y, Enter). Cron подхватит изменения автоматически, перезагружать службу не нужно. Разберитесь с расшифровкой звёздочек поможет crontab.guru.
Короткая видеоинструкция по этой же теме, от NetworkChuck, с демонстрацией на реальном Raspberry Pi и пояснением каждого шага:
Что делать, если скрипт не нашёл Zone ID или Record ID
Иногда API не возвращает идентификаторы автоматически, особенно если в аккаунте много доменов или записей с похожими именами. Тогда получите их вручную:
- Зайдите в дашборд Cloudflare, выберите домен, вкладку DNS
- Откройте инструменты разработчика в браузере (
F12→ вкладка Network → подвкладка XHR) - Нажмите на значок облака рядом с вашей A-записью, в сетевой панели появится запрос к API
- Кликните по нему правой кнопкой → Copy → Copy link address (Chrome) или Copy URL (Firefox)
- В скопированной ссылке найдите часть после
zones/, это Zone ID, послеdns_records/, Record ID
Подставьте их в переменные ZONE_ID и RECORD_ID в скрипте, и всё заработает. Убедитесь, что облако в DNS-панели серое (прокси выключен): Cloudflare не должен кешировать IP для DDNS.
⁉️🤔 Частые вопросы
Обязательно ли использовать API-токен, а не глобальный ключ?
Глобальный ключ до сих пор работает, но токен, современный и безопасный вариант. Токен можно ограничить одним доменом и правом на редактирование DNS. Глобальный ключ даёт доступ ко всему аккаунту. Если скрипт или Pi скомпрометированы, токен вы просто отзываете, а ключ пришлось бы менять везде.
Чем этот подход отличается от DuckDNS или No-IP?
Сторонние DDNS-сервисы дают поддомен третьего уровня вроде
myhome.duckdns.org. Cloudflare-подход использует ваш собственный домен (home.example.com), это выглядит профессиональнее, не зависит от чужого сервиса и не требует ежемесячного захода для подтверждения активности. Плюс вы получаете доступ ко всей экосистеме Cloudflare: защита от DDoS, SSL-сертификаты, правила фаервола.
Нужно ли пробрасывать порты на роутере?
Да, чтобы достучаться до Raspberry Pi из интернета. DDNS лишь гарантирует, что домен всегда указывает на актуальный IP. А чтобы трафик с этого IP попал на Pi, нужно настроить port forwarding на роутере для нужных портов (22 для SSH, 80/443 для веба, и так далее).
Что делать, если Raspberry Pi за NAT провайдера?
Некоторые провайдеры используют Carrier-Grade NAT (CGNAT), тогда у вас нет собственного публичного IP и DDNS не поможет. Решение: запросить у провайдера белый IP (часто это бесплатно по заявке) либо использовать Cloudflare Tunnel, он создаёт зашифрованный канал от Pi к Cloudflare без проброса портов.
Сколько стоит такое решение?
Ноль. Cloudflare DNS бесплатен для неограниченного количества A-записей. Raspberry Pi вы уже купили. Потребление электричества Pi 3/4 под нагрузкой, около 3-5 Вт, в год это примерно 250-400 $.
Можно ли обновлять несколько поддоменов?
Да, дублируйте блоки с
RECORD_NAMEиDNS_IPв скрипте для каждого поддомена или оберните логику в цикл по массиву имён.
Динамический DNS на Cloudflare: что ставить в 2026 году
Схема с Cloudflare API и cron пережила уже несколько поколений Raspberry Pi и не потеряла актуальности. Вы получаете собственный поддомен, не зависите от сторонних DDNS-провайдеров и не платите ни копейки.
Если хочется пойти дальше, посмотрите в сторону готовых Docker-образов: oznu/cloudflare-ddns обновляет IP каждые 5 минут и настраивается через переменные окружения. Для тех, кто предпочитает Python, есть aribasadme/rpi-cloudflare-ddns, заточен специально под Raspberry Pi.
Главное, что вы сделали сегодня: Raspberry Pi теперь доступен из любой точки мира по постоянному адресу. А это, фундамент для чего угодно: от dev-сервера WordPress до собственного облачного хранилища.



