20 мая, 2017

Dynamic DNS используя Cloudflare

Сервер с динамическим IP через DNS от Сloudflare, с помощью ddclient

Для начала:

  • Создаем учетную запись на cloudflare.com.
  • Добавляем в этот сервис свой домен (например mydomen.tld).
  • NS записи домена указываем на сервера этого сервиса.
  • Далее воспользуемся интересным скриптом на Perl под названием ddclient. Он будет обновлять наш IP в настройках Сloudflare, используя API этого сервиса. Скрипт поддерживает множество сервисов и несколько способов определения IP.

Обновляем A-запись поддомена актуальным динамическим IP

  • Добавляем A-запись поддомена в настройках Сloudflare, указывая любой IP и небольшой TTL (например home.mydomen.tld).
  • Скачиваем ddclient (если нужно устанавливаем в системе).
  • Настраиваем файл конфигурации [/etc/ddclient/]ddclient.conf (пример ниже).
  • Примеры запуска:
    # Тестируем. Пытается определить IP разными способами.
    [sudo /usr/sbin/]ddclient -query
    
    # Все еще тестируем. Использует файл конфигурации
    # и выводит много информации о своей работе.
    [sudo /usr/sbin/]ddclient -daemon=0 -debug -verbose -noquiet
    
    # Запускаем и проверяем значение A-записи на странице Сloudflare,
    # а также nslookup DOMA.MYDOMEN.TLD
    [sudo /usr/sbin/]ddclient -daemon 300 -syslog
  • Прикручиваем к автозапуску, к планировщику

Установка версии из репозитория для Ubuntu

Пример установки и настройки ddclient для Ubuntu:

# Возможно вам понадобиться установить дополнительные пакеты для Perl
# JSON::Any, Data::Validate::IP, IO::Socket::SSL
sudo apt-get install libjson-any-perl libdata-validate-ip-perl libio-socket-ssl-perl

# Скачиваем, копируем куда нужно и устанавливаем атрибут исполняемого файла
# Создаем нужные для работы папки
cd ~
wget https://raw.githubusercontent.com/wimpunk/ddclient/master/ddclient
sudo cp ddclient /usr/sbin/ddclient
sudo chmod +x /usr/sbin/ddclient
sudo mkdir /var/cache/ddclient
sudo mkdir /etc/ddclient
# Создаем файл конфигурации, пример ниже
sudo nano /etc/ddclient/ddclient.conf
# ПИШЕМ И СОХРАНЯЕМ КОНФИГУРАЦИЮ

# Добавляем в автозагрузку, используя пример с оф. сайта
wget https://raw.githubusercontent.com/wimpunk/ddclient/master/sample-etc_rc.d_init.d_ddclient.ubuntu
sudo cp sample-etc_rc.d_init.d_ddclient.ubuntu /etc/init.d/ddclient
sudo chmod +x /etc/init.d/ddclient
sudo update-rc.d ddclient defaults
sudo service ddclient start

Файл конфигурации

# /etc/ddclient/ddclient.conf
daemon=1h
syslog=yes
use=web, web=dnspark
ssl=yes
protocol=cloudflare
server=api.cloudflare.com/client/v4
zone=MYDOMEN.TLD
login=CLOUDFLARE_ACCOUNT_MAIL
# See API-KEY https://www.cloudflare.com/a/account/my-account
password=CLOUDFLARE_ACCOUNT_GLOBAL_API_KEY
DOMA.MYDOMEN.TLD
  • Актуальное значение server есть в исходном коде скрипта. Где-то в документации оно было указано неверно.
  • Ссылка для получения cloudflare-api-key: https://www.cloudflare.com/a/account/my-account.
  • Параметры в файле конфигурации могут быть в одной строке, разделяемые запятой. Их также можно задать в командной строке при запуске ddclient. Если файл конфигурации не в стандартном месте, то путь можно также указать в командной строке.
  • Значение use задает способ определения актуального IP. Сloudflare не позволяет установить IP с которого обращаемся к API. Примеры, а подробнее в документации:
      
      # Через онлайн сервисы типа "YOUR-IP".
      # Есть предустановленные как web=dnspark,
      # для которых web-skip не нужен.
      use=web, web=PROVIDER|URL, web-skip=PATTERN
      
      # Выполнить команду и прочитает ее вывод. Смотри пример ниже.
      use=cmd, cmd=COMMAND, cmd-skip=PATTERN
      
      # Задать IP явно, например через командную строку или внутри скрипта.
      use=ip, ip=IP-ADDRESS
      
      # Работа с предустановленными роутерами.
      # Можно использовать:
      # - fw-skip=PATTERN
      # - fw-login=LOGIN
      # - fw-password=PASS
      # Web интерфейс роутера нужно переключить на английский.
      use=ROUTER_NAME, fw=IP-ADDRESS
      
      # Взять IP в настройках интерфейса.
      # Если мы не за NAT, а сессию к провайдеру поднял текущий комп.
      use=if, if=INTERFACE, if-skip=PATTERN
      
      # Все IP в тексте до этой строки-шаблона будут проигнорированы,
      # т.е. использован первый найденный после.
      nnn-skip=PATTERN
      

Определение WAN IP в роутере Linksys E900 через UPnP/SSDP

Если мы сидим за NAT и сессию к провайдеру подняли не с локального интерфейса. И при этом нет желания каждый раз за своим IP идти в интернет. А "запароленный" роутер становиться проблемой для ddclient при попытке добраться через HTTP до страницы с информацией о подключении. То можно воспользоваться UPnP в роутере. Например для Linksys E900 сделать так:

  • Включить UPnP в настройках роутера.
  • В файле конфигурации для удобства можно не указывать длинную строку для определения IP, а вынести ее в sh-скрипт:
    use=cmd, cmd=/usr/sbin/wanip_linksys_e900_upnp.sh, cmd-skip=NewExternalIPAddress
  • И сама команда для чтения данных из роутера внутри wanip_linksys_e900_upnp.sh:
    curl -H "SOAPAction: urn:schemas-upnp-org:service:WANIPConnection:1#GetExternalIPAddress" -d "<?xml version="1.0"?><s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:GetExternalIPAddress xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1"></u:GetExternalIPAddress></s:Body></s:Envelope>" http://192.168.1.1:1780/control?WANIPConnection

Интересно

Скрипт поддерживает немалое количество сервисов, позволяющих относительно легко менять A-запись для домена. У него есть свое сообщество, которое будет поддерживать список сервисов в актуальном состоянии. Код можно изучить и использовать при написании своих утилит.

Ссылки и документация

Файлы из статью:

Комментариев нет:

Отправка комментария