Поиск по сайту:

Как развернуть динамический DNS-сервер с помощью Docker в Debian 10


На этой странице

  1. Требования
  2. Создание записей DNS.
  3. Установка
    1. Шаг 1. Обновление и установка зависимостей.
    2. Шаг 2. Установите Docker CE.
    3. Шаг 3. Загрузите и соберите docker-ddns.
    4. Шаг 4. Служба Systemd (необязательно)
    5. Шаг 5. Проверка сервера
    6. Шаг 6. Обратный прокси-сервер
    7. Шаг 7. Настройка клиента

    Динамический DNS — это сетевой сервис для сопоставления доменных имен с динамическими (временными, часто меняющимися) IP-адресами. Он используется для доступа к компьютерам, не имеющим статического IP-адреса, например, в сетях SOHO (Small Office/Home Office), и часто используется в сочетании с переадресацией портов для доступа к системам, которые находятся за брандмауэрами NAT. Эта статья проведет вас через полную настройку динамического DNS-сервера в контейнере Docker в системе Debian 10, включая настройку необходимых записей DNS, размещение API управления за обратным прокси-сервером Nginx HTTPS и автоматизацию DNS на стороне клиента. записывать обновления.

    Требования

    • Один сервер Debian 10, опционально с подключением по IPv6. (192.0.2.2 и 2001:0db8::0db9 будут использоваться в качестве заполнителей для серверов IPv4 и IPv6 соответственно.)
    • Доступ к пользователю root или пользователю с привилегиями sudo.
    • На хосте должны быть доступны порты tcp/53 и udp/53.
    • Зарегистрированное доменное имя и доступ к его серверам имен/файлу зоны. Создайте записи DNS для этого домена, как показано в следующем разделе.
    • Должна быть установлена переменная среды $EDITOR.
    • При необходимости любая клиентская система Linux/Unix для настройки автоматического обновления записей DNS.

    Создание DNS-записей.

    Вам нужно будет создать как минимум 2 DNS-записи для работы вашего динамического DNS-сервера. Сначала выберите поддомен, например ns1.your_domain, который будет указывать на IPv4-адрес вашего сервера. Во-вторых, выберите поддомен, такой как ddns.your_domain, который будет делегирован ns1.your_domain.

    Ваш динамический DNS-сервер будет обрабатывать все записи в разделе ddns.your_domain. Третья запись типа AAAA не является обязательной. Соответствующие записи выглядят следующим образом:

    ns1.your_domain A 192.0.2.2
    ddns.your_domain NS ns1.your_domain
    ns1.your_domain AAAA 2001:0db8::0db9 (optional)
    
    

    Вы должны создать эти записи в панели управления вашего регистратора домена. Обратите внимание, что распространение этих записей может занять до 24 часов, но обычно это занимает несколько минут.

    Установка

    Если вы не используете root-пользователя, мы рекомендуем вам запустить временную корневую оболочку, поскольку для большинства команд, показанных в этом руководстве, требуются повышенные привилегии. Чтобы запустить корневую оболочку, используйте одну из следующих команд:

    sudo su - root
    sudo -s

    Шаг 1: Обновление и установка зависимостей.

    Всегда рекомендуется сначала обновить систему:

    apt update
    apt upgrade -y
    reboot

    После перезагрузки установите пакеты программного обеспечения, необходимые для этой настройки:

    • certbot будет использоваться для получения сертификатов SSL/TLS.
    • make требуется для создания образа Docker, в котором будет работать сервер DDNS.
    • apt-transport-https, ca-certificates, curl, gnupg2 и software-properties-common необходимы для установки репозитория Docker и соответствующего ему ключа GPG.
    • dnsutils предоставляет dig, который будет использоваться для тестирования.

    apt install -y certbot make apt-transport-https curl ca-certificates software-properties-common gnupg2 dnsutils

    Шаг 2: Установите Docker CE.

    Добавьте ключ Dockers GPG:

    curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -

    Установите репозиторий докеров:

    add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian buster stable"

    Обновите кеш репозитория Debian, затем установите докер и его зависимости:

    apt update
    apt install -y docker-ce docker-ce-cli containerd.io

    После завершения установки убедитесь, что служба Docker включена и работает следующим образом:

    systemctl enable --now docker.service

    Шаг 3: Скачайте и соберите docker-ddns

    Наш динамический DNS-сервер будет работать на базе док-контейнера, который использует Bind в качестве DNS-сервера и API управления, написанный на Go. Сначала клонируйте репозиторий Github и создайте образ контейнера с помощью следующих команд:

    git clone https://github.com/dprandzioch/docker-ddns.git
    cd docker-ddns
    make image

    Дождитесь завершения процесса, который может занять некоторое время, затем откройте файл envfile в текстовом редакторе:

    $EDITOR envfile

    И введите следующее:

    SHARED_SECRET=your_secret 
    ZONE=ddns.your_domain
    RECORD_TTL=60

    Общий секрет — это пароль, который будет использоваться для аутентификации с помощью API управления. ZONE указывает, за какую зону DNS будет отвечать ваш сервер, а TTL записи указывает, как долго записи DNS могут кэшироваться. TTL 60 секунд рекомендуется для часто меняющихся динамических IP-адресов.

    При необходимости вы можете сгенерировать случайную 40-символьную строку для секрета, используя следующую команду:

    cat /dev/urandom | tr -dc "a-zA-Z0-9" | fold -w 40 | head -1

    Теперь мы можем создать контейнер:

    docker create -it -p 127.0.0.1:8080:8080 -p 53:53 -p 53:53/udp --env-file envfile -v /mnt/ddns-data:/var/cache/bind --name ddns-server davd/docker-ddns

    Эта команда создаст контейнер с именем ddns-server из созданного нами ранее образа и сопоставит порты 8080/tcp, 53/tcp и 53/udp с хоста на контейнер. Он также смонтирует каталог /mnt/ddns-data с хоста в /var/cache/bind в файловой системе контейнеров. Это используется для сохранения данных DNS при воссоздании контейнера.

    Убедитесь, что контейнер был создан с помощью команды:

    docker container ls -a
    

    Единственная запись должна быть выведена с именем ddns-server.

    Шаг 4: Служба Systemd (необязательно)

    Этот шаг предназначен для упрощения управления, но не является строго обязательным. Если вы решите не использовать службу systemd, вам придется управлять контейнером вручную или использовать другое решение для управления. Обратите внимание, что для более крупных и сложных развертываний контейнеров рекомендуется решение для оркестрации, такое как Kubernetes или Docker Swarm. В этом случае служба systemd идеально подходит, так как мы запускаем только один контейнер.

    Чтобы иметь возможность управлять этим контейнером как системной службой, оберните его в модуль systemd. Создайте файл /etc/systemd/system/ddns-server-ct.service в текстовом редакторе:

    $EDITOR /etc/systemd/system/ddns-server-ct.service
    

    И добавьте следующее:

    [Unit]
    Description=DDNS Server Docker Container
    After=docker.service
    Requires=docker.service
    Requires=network.target
    [Service]
    Type=oneshot
    TimeoutStartSec=240
    Restart=no
    RemainAfterExit=yes
    ExecStart=/usr/bin/docker start ddns-server
    ExecStop=/usr/bin/docker stop ddns-server
    [Install]
    WantedBy=multi-user.target

    Сохраните и выйдите, затем установите правильные разрешения для этого файла модуля:

    chmod 664 /etc/systemd/system/ddns-server-ct.service

    Загрузите новый служебный файл с помощью следующей команды:

    systemctl daemon-reload

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

    Если вы хотите, чтобы сервер DDNS запускался автоматически при загрузке системы, выполните следующее:

    systemctl enable ddns-server-ct.service

    Шаг 5: Тестирование вашего сервера

    Прежде чем приступить к настройке, хорошо протестируйте API управления локально. Запустите контейнер:

    systemctl start ddns-server-ct.service

    Отправьте GET-запрос к API, чтобы создать новую запись:

    ПРИМЕЧАНИЕ. API в настоящее время доступен только локально (т. е. с локального хоста).

    curl "http://127.0.0.1:8080/update?secret=your_secret&domain=test1&addr=1.1.1.1"

    Curl должен вернуть следующий ответ:

    {"Success":true,"Message":"Updated A record for test1 to IP address 1.1.1.1","Domain":"test1","Domains":["test1"],"Address":"1.1.1.1","AddrType":"A"}

    ПРИМЕЧАНИЕ. Домен test1 относится к test1.ddns.your_domain. так как сервер обрабатывает ddns.your_domain. зона.

    Выполните поиск DNS, чтобы убедиться, что запись действительно была создана, и проверить разрешение DNS:

    dig +short -t A test1.ddns.your_domain @127.0.0.1

    Вывод должен быть 1.1.1.1.

    Шаг 6: Обратный прокси

    Поскольку API работает через HTTP, ваш секрет аутентификации потенциально может быть перехвачен всякий раз, когда вы отправляете запрос по сети. Затем злоумышленник может манипулировать вашими DNS-записями, используя ваш секрет. Хорошо настройте обратный прокси-сервер с помощью Nginx и защитите его с помощью HTTPS. Сначала получите SSL-сертификат от Lets Encrypt с помощью certbot:

    certbot certonly --standalone --agree-tos -m  -d ns1.your_domain

    Будет подтверждено право собственности на ваш домен и выдан сертификат. Затем установите Nginx и убедитесь, что он включен и работает:

    apt install -y nginx systemctl enable --now nginx.service

    Затем отключите файл блока сервера по умолчанию, так как он не нужен:

    unlink /etc/nginx/sites-enabled/default

    Теперь мы создадим новый файл конфигурации для обратного прокси, например:

    $EDITOR /etc/nginx/sites-available/ddns-api-proxy.conf

    И вставьте следующее, убедившись, что вы заменили IP-адреса и доменные имена своими собственными:

    server {
    listen 192.0.2.2:8080;
    server_name ns1.your_domain;
    ssl on;
    ssl_certificate /etc/letsencrypt/live/ns1.your_domain/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/ns1.your_domain/privkey.pem;

    location /update {
    proxy_pass http://127.0.0.1:8080;
    }
    location / {
    return 404;
    }
    access_log /var/log/nginx/ddns-api-access.log;
    error_log /var/log/nginx/ddns-api-error.log;
    }

    Необязательно: если вы хотите, чтобы API был доступен через IPv6, добавьте следующую строку после существующей директивы listen:

    listen [2001:0db8::0db9]:8080;

    Включите эту конфигурацию и примените изменения, перезагрузив Nginx:

    ln -s /etc/nginx/sites-available/ddns-api-proxy.conf /etc/nginx/sites-enabled/
    systemctl reload nginx.service

    Теперь API должен быть доступен через Интернет и принимать только соединения HTTPS. Чтобы проверить это, введите команду:

    curl "https://ns1.your_domain:8080/update?secret=your_secret&domain=test2&addr=1.1.1.2"

    Он должен вернуть следующее:

    {"Success":true,"Message":"Updated A record for test2 to IP address 1.1.1.2","Domain":"test2","Domains":["test2"],"Address":"1.1.1.2","AddrType":"A"}

    Шаг 7: Настройка клиента

    Вы можете настроить автоматическое обновление записей на любом маршрутизаторе, поддерживающем настраиваемых поставщиков динамических DNS, таких как Pfsense. Вы также можете настроить их на большинстве других устройств в офисе или домашней сети. Чтобы обновить или создать запись, необходимо отправить запрос GET на следующую конечную точку:

    https://ns1.your_domain:8080/update?secret=your_secret&domain=your_subdomain&addr=your_ip_address

    Вы также можете обновить записи нескольких субдоменов одним запросом. Например, чтобы создать/обновить записи для sub1.ddns.your_domain и sub2.ddns.your_domain с IP-адресом 198.51.100.100, вы должны отправить запрос GET на этот URL-адрес:

    Параметр addr также может содержать адрес IPv6 для создания/обновления записей DNS AAAA, например:

    https://ns1.your_domain:8080/update?secret=your_secret&domain=cheese&addr=2001:0db8:aaaa::

    Чтобы автоматизировать эти обновления на клиенте Linux, сохраните следующий сценарий bash как /opt/ddns-update.sh:

    #!/bin/bash

    while [ -z $CURRENTIP ] do
    CURRENTIP=`dig -r +short myip.opendns.com @resolver1.opendns.com 2>/dev/null`
    sleep 1
    done
    curl -s "https://ns1.your_domain:8080/update?secret=your_secret&domain=your_subdomain&addr=${CURRENTIP}"

    Этот сценарий использует цикл while, обернутый вокруг команды dig, которая получает общедоступный IP-адрес клиента и сохраняет его в переменной. Цикл гарантирует, что общедоступный IP-адрес выбран правильно. Затем cURL используется для отправки запроса API для обновления записи DNS с помощью этого вновь полученного IP-адреса. Убедитесь, что вы заменили значения для your_secret и your_subdomain.

    Затем сделайте этот скрипт исполняемым:

    chmod +x /opt/ddns-update.sh

    Затем запустите редактор crontab:

    crontab -e

    Добавьте следующую строку в конец вашего crontab:

    */2 * * * * /opt/ddns-update.sh

    Сохранить и выйти. Сценарий теперь будет запускаться каждые две минуты, обновляя вашу динамическую запись DNS с последним общедоступным IP-адресом клиента.

    Дальнейшее чтение

    • Статья Википедии о динамическом DNS
    • docker-ddns на Github