15%

Сэкономьте 15% на всех хостинговых услугах

Проверьте свои навыки и получите скидку на любой тарифный план

Используйте код:

Skills
Начать
14.10.2024

Динамический DNS (DDNS): Полное техническое руководство по настройке, архитектуре и безопасности

Dynamic DNS (DDNS) — это сервис, который автоматически обновляет DNS-запись доменного имени при каждом изменении связанного IP-адреса, обеспечивая постоянное разрешение имён хостов для устройств с нестатическими публичными IP. В отличие от традиционного статического DNS, где администратор вручную обновляет запись A или AAAA, DDNS использует аутентифицированный вызов API — как правило, инициируемый лёгким клиентом или прошивкой роутера — для передачи нового адреса на авторитативный сервер имён в течение нескольких секунд после обнаружения изменения.

Для домашних пользователей, малого бизнеса и операторов собственной инфраструктуры DDNS устраняет необходимость приобретать статический IP у провайдера, сохраняя при этом надёжный доступ к удалённым сервисам по имени. Практический результат: ваш домен home.example.com разрешается корректно независимо от того, сменил ли провайдер ваш адрес в 2 часа ночи или нет.

Как система доменных имён обрабатывает динамические адреса

Чтобы понять, почему DDNS важен, полезно разобраться, где стандартный DNS даёт сбой. Обычная DNS-запись A сопоставляет имя хоста с IPv4-адресом и значением Time-to-Live (TTL), которое указывает резолверам, как долго кэшировать это соответствие. Когда провайдер переназначает ваш публичный IP — что может происходить при каждом обновлении аренды DHCP, перезагрузке модема или после принудительного 24-часового цикла переподключения, распространённого на европейских рынках — кэшированная запись устаревает. Каждый резолвер, закэшировавший старый адрес, продолжает направлять трафик на недоступный узел до истечения TTL.

DDNS решает эту проблему следующим образом:

  • Поддерживает очень низкое значение TTL (как правило, 60–300 секунд), чтобы устаревшие записи быстро истекали.
  • Запускает клиентский агент, который обнаруживает изменения IP и немедленно отправляет аутентифицированное обновление на авторитативный сервер имён DDNS-провайдера.
  • Завершает полный цикл обновления — обнаружение, вызов API, распространение на сервер имён — обычно в течение одной-двух минут.

Архитектура обновления DDNS в деталях

Понимание полной цепочки обновлений помогает диагностировать сбои и оптимизировать надёжность.

Обнаружение изменения IP

DDNS-клиент определяет текущий публичный IP одним из трёх методов:

  1. Прямой запрос WAN-интерфейса — Клиент считывает IP, назначенный WAN-интерфейсу роутера, напрямую. Это наиболее точный метод, не требующий обращения к сторонним сервисам.
  2. Внешний сервис определения IP — Клиент обращается к сервису вроде https://api.ipify.org или https://checkip.amazonaws.com. Это работает даже когда клиент запущен на внутреннем хосте за NAT, но создаёт зависимость от стороннего узла.
  3. Опрос API роутера — Продвинутые клиенты запрашивают API управления роутером (UPnP, TR-069 или специфичный для производителя REST-эндпоинт) для получения WAN IP без выхода за пределы локальной сети.

Запрос на обновление

После обнаружения изменения клиент отправляет аутентифицированный HTTP или HTTPS запрос к API обновления DDNS-провайдера. Де-факто стандартом является протокол HTTP-обновления DynDNS, который большинство провайдеров реализуют для совместимости:

https://username:password@dynupdate.provider.com/nic/update?hostname=home.example.com&myip=203.0.113.45

Сервер отвечает строкой статуса (good, nochg, nohost, badauth и т.д.), которую клиент анализирует для подтверждения успеха или записи ошибки в журнал.

Распространение на сервер имён

После того как бэкенд провайдера получает обновление, он записывает новый IP в зонный файл авторитативного сервера имён и сбрасывает TTL записи. Поскольку DDNS-провайдеры управляют собственными авторитативными серверами имён, распространение на авторитативный источник происходит мгновенно. Оставшаяся задержка — это исключительно истечение кэша резолвера, поэтому низкое значение TTL (60–120 секунд) критически важно для быстрого переключения при отказе.

Динамический DNS против статического IP: техническое сравнение

ПараметрСтатический IP-адресДинамический DNS (DDNS)
Стабильность IPПостоянный, никогда не меняетсяМеняется периодически; имя хоста остаётся неизменным
Ежемесячная стоимостьДоплата провайдеру (как правило, $10–$30/месяц)Бесплатно или низкая стоимость ($0–$5/месяц для большинства случаев)
Управление DNS-записямиРучное или автоматизированное; редкие обновленияАвтоматизированное, обновления в режиме реального времени
Задержка распространения после смены IPН/П (IP никогда не меняется)1–5 минут при низком TTL
Пригодность для производственных сервисовОтличнаяДостаточная для трафика низкого и среднего уровня; не идеальна для сервисов с SLA
Обратный DNS (PTR-записи)Настраивается у провайдераРедко доступен; зависит от провайдера
Поддержка IPv6Зависит от провайдераБольшинство современных DDNS-клиентов поддерживают обновление записей `AAAA`
Маршрутизация BGP/anycastВозможна с выделенными IPНе применимо
Рекомендуется дляКритически важные бизнес-серверы, платёжные шлюзыДомашние лаборатории, удалённый доступ, IoT, небольшие самостоятельно размещаемые сервисы

Для производственных нагрузок, требующих гарантированного SLA по времени работы, Выделенный сервер со статическим блоком IP остаётся правильной архитектурой. DDNS — это прагматичный мост для сценариев, где статический IP либо недоступен, либо экономически нецелесообразен.

Основные сценарии использования Dynamic DNS

Удалённый доступ к домашней инфраструктуре

Наиболее распространённое применение: доступ к NAS, DVR камер видеонаблюдения, серверу Plex или экземпляру Home Assistant из-за пределов домашней сети. DDNS предоставляет стабильное имя хоста, чтобы вам никогда не приходилось искать текущий IP перед подключением.

Самостоятельно размещаемые VPN-эндпоинты

При запуске WireGuard или OpenVPN на домашнем роутере или Raspberry Pi конфигурация VPN-клиента ссылается на имя хоста, а не на IP. Без DDNS каждая смена IP одновременно нарушает работу всех конфигураций клиентов. С DDNS имя хоста разрешается в новый IP в течение нескольких минут после смены, и клиенты автоматически переподключаются при следующей попытке установления соединения.

Домашние лаборатории и серверы разработки

Разработчики, запускающие локальные среды тестирования, Git-серверы или CI/CD-конвейеры с доступом из удалённых мест, используют DDNS для поддержания согласованных URL-адресов вебхуков и SSH-эндпоинтов. Это особенно эффективно в сочетании со средой VPS-хостинга, выступающей в роли обратного прокси или промежуточного хоста, перенаправляющего трафик в домашнюю лабораторию через туннель.

IoT и сети удалённых датчиков

Встроенные устройства, передающие данные центральному коллектору, или граничные узлы, которым необходимо получать команды, требуют стабильного адреса. DDNS обеспечивает уровень имён хостов; надлежащие правила брандмауэра и TLS обеспечивают уровень безопасности.

Сервисы малого бизнеса без бюджета на статический IP

Малый бизнес, использующий внутренний почтовый ретранслятор, SFTP-хранилище или шлюз удалённого рабочего стола, может использовать DDNS для поддержания внешней доступности без оплаты статического IP провайдеру. Совместите это с Почтовым хостингом для основных MX-записей и используйте DDNS только для вспомогательных внутренних сервисов.

Выбор DDNS-провайдера

Не все DDNS-провайдеры архитектурно равнозначны. Ключевые критерии оценки:

  • Совместимость API обновлений — Поддерживает ли он стандартный протокол DynDNS? Это определяет, какие клиенты и роутеры работают нативно.
  • Управление TTL — Можно ли установить TTL ниже 300 секунд? Критически важно для быстрой сходимости после смены IP.
  • Поддержка пользовательского домена — Можно ли использовать собственный зарегистрированный домен вместо поддомена провайдера? Необходимо для профессиональных развёртываний.
  • Поддержка IPv6 (записи AAAA) — Всё более важна по мере того, как провайдеры внедряют двойной стек и префиксы только IPv6.
  • Ограничения частоты обновлений — Некоторые бесплатные тарифы ограничивают обновления или требуют периодического ручного подтверждения для сохранения активности имени хоста.
  • API только через HTTPS — Любой провайдер, принимающий вызовы обновления по незашифрованному HTTP, представляет угрозу безопасности.

Популярные провайдеры включают No-IP, Dynu, DuckDNS (бесплатный, на основе токенов, отлично подходит для автоматизации) и Cloudflare (если вы управляете собственным доменом, API Cloudflare может функционировать как полноценный DDNS-бэкенд с отличным управлением TTL и бесплатным HTTPS).

Если вы уже управляете доменом, его регистрация через провайдера с надёжным DNS API — например, через Регистрацию доменов — даёт вам полный контроль над значениями TTL и типами записей без зависимости от стороннего DDNS-сервиса.

Пошаговая настройка DDNS

Шаг 1: Оцените частоту смены IP вашим провайдером

Прежде чем что-либо настраивать, определите, как часто ваш IP фактически меняется. В Linux вы можете вести журнал вашего публичного IP с течением времени:

while true; do
  echo "$(date '+%Y-%m-%d %H:%M:%S') $(curl -s https://api.ipify.org)"
  sleep 3600
done >> /var/log/ip_rotation.log

Если ваш IP меняется реже одного раза в неделю, необходимость в очень низком TTL снижается. Если он меняется ежедневно или при каждом переподключении, установите TTL равным 60 секундам.

Шаг 2: Выберите и настройте DDNS-провайдера

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

  • Имя пользователя или токен
  • Пароль или API-ключ
  • Имя хоста (например, home.example.ddns.net или ваш собственный домен)
  • URL эндпоинта обновления

Шаг 3: Настройте DDNS на вашем роутере

Большинство современных роутеров (OpenWrt, pfSense, Mikrotik, Asus Merlin, DD-WRT) имеют встроенную поддержку DDNS. Путь настройки зависит от прошивки, но обязательные поля одинаковы:

  • Провайдер сервиса — Выберите из выпадающего списка или введите пользовательский URL.
  • Имя хоста — Полностью квалифицированное доменное имя для обновления.
  • Имя пользователя / Пароль или Токен — Учётные данные вашего провайдера.
  • Интервал проверки — Как часто роутер опрашивает наличие изменений IP (рекомендуется 5 минут).

На OpenWrt DDNS обрабатывается пакетом ddns-scripts:

opkg update && opkg install ddns-scripts ddns-scripts-noip luci-app-ddns

Затем выполните настройку через LuCI (веб-интерфейс) или отредактируйте /etc/config/ddns напрямую.

Шаг 4: Установите DDclient для программных обновлений

Если ваш роутер не поддерживает DDNS, или вы хотите запустить логику обновления на конкретном хосте, DDclient — наиболее широко используемое решение с открытым исходным кодом.

Установка на Debian/Ubuntu:

sudo apt update && sudo apt install ddclient -y

Минимальный /etc/ddclient.conf для Cloudflare в качестве DDNS-бэкенда:

protocol=cloudflare
zone=example.com
login=your@email.com
password=YOUR_CLOUDFLARE_API_TOKEN
ttl=120
use=web, web=https://api.ipify.org
home.example.com

Запустите и включите сервис:

sudo systemctl enable --now ddclient
sudo systemctl status ddclient

Принудительно выполните немедленное обновление и проверьте журналы:

sudo ddclient -daemon=0 -debug -verbose -noquiet

Шаг 5: Проверьте конфигурацию

Из внешней сети (мобильные данные, другое подключение к провайдеру или удалённый сервер) убедитесь, что имя хоста разрешается в ваш текущий IP:

dig +short home.example.com @8.8.8.8

Сравните результат с вашим фактическим публичным IP:

curl -s https://api.ipify.org

Оба значения должны совпадать. Если они различаются, проверьте журнал DDclient по пути /var/log/ddclient.log или страницу статуса DDNS роутера на наличие кодов ошибок.

Шаг 6: Смоделируйте смену IP

Чтобы проверить полный цикл обновления без ожидания реальной смены, временно измените IP в панели управления вашего DDNS-провайдера на фиктивный адрес (например, 1.2.3.4), затем принудительно запустите DDclient:

sudo ddclient -daemon=0 -force

Убедитесь, что запись возвращается к вашему фактическому IP в течение окна TTL.

Расширенная настройка: использование Cloudflare API в качестве DDNS-бэкенда

Если вы владеете доменом и используете Cloudflare для DNS, вы можете полностью обойтись без сторонних DDNS-провайдеров. API Cloudflare даёт вам управление TTL менее 60 секунд, бесплатный DNSSEC и отсутствие зависимости от времени работы DDNS-вендора.

Минимальный bash-скрипт с использованием Cloudflare API v4:

#!/bin/bash
CF_API_TOKEN="YOUR_API_TOKEN"
ZONE_ID="YOUR_ZONE_ID"
RECORD_ID="YOUR_A_RECORD_ID"
HOSTNAME="home.example.com"
NEW_IP=$(curl -s https://api.ipify.org)
CURRENT_IP=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/dns_records/${RECORD_ID}" 
  -H "Authorization: Bearer ${CF_API_TOKEN}" 
  -H "Content-Type: application/json" | python3 -c "import sys,json; print(json.load(sys.stdin)['result']['content'])")

if [ "$NEW_IP" != "$CURRENT_IP" ]; then
  curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/dns_records/${RECORD_ID}" 
    -H "Authorization: Bearer ${CF_API_TOKEN}" 
    -H "Content-Type: application/json" 
    --data "{"type":"A","name":"${HOSTNAME}","content":"${NEW_IP}","ttl":60,"proxied":false}"
  echo "$(date): Updated ${HOSTNAME} to ${NEW_IP}"
fi

Запланируйте выполнение через cron каждые 5 минут:

*/5 * * * * /usr/local/bin/cf-ddns.sh >> /var/log/cf-ddns.log 2>&1

Архитектура безопасности для сервисов, доступных через DDNS

Открытие любого сервиса в публичный интернет через DDNS значительно расширяет поверхность атаки. Само имя хоста публично разрешается, что означает: автоматизированные сканеры обнаружат и начнут зондировать ваши сервисы в течение нескольких минут после появления записи. Многоуровневая модель защиты обязательна.

Контроль сетевого периметра

  • Правила брандмауэра с белыми списками по портам — Открывайте только те порты, которые активно используются. Домашний сервер, работающий только с SSH и HTTPS, должен иметь правила, блокирующие всё, кроме входящего TCP 22 и TCP 443.
  • Fail2ban или аналог — Автоматически блокирует IP-адреса, вызывающие повторные ошибки аутентификации. Необходим для любого SSH или HTTP-сервиса, доступного через DDNS.
  • Port knocking — Специально для SSH, port knocking добавляет уровень неочевидности, устраняющий подавляющее большинство автоматизированного сканирующего трафика.

Безопасность транспортного уровня

Любой веб-сервис, доступный через DDNS, должен использовать HTTPS. Получите сертификат через Let’s Encrypt (бесплатно, автоматизировано через Certbot) или коммерческого провайдера. Если вы запускаете производственный веб-сервис, рассмотрите возможность использования SSL-сертификатов для расширенных вариантов проверки. Никогда не открывайте административные интерфейсы только по HTTP — учётные данные, передаваемые в открытом виде через имя хоста, разрешаемое DDNS, тривиально перехватываются.

Усиление аутентификации

  • Отключите аутентификацию по паролю для SSH; используйте исключительно пары ключей Ed25519 или RSA-4096.
  • Включите многофакторную аутентификацию на любой веб-панели администратора (интерфейс роутера, интерфейс NAS, Home Assistant и т.д.).
  • Используйте обратный прокси (Nginx, Caddy, Traefik) перед бэкенд-сервисами для централизации завершения TLS, ограничения скорости запросов и ведения журналов доступа.

VPN как предпочтительная модель доступа

Для сервисов, которым не требуется публичный доступ — домашний NAS, внутренние панели мониторинга, среды разработки — правильная архитектура предполагает открытие через DDNS только VPN-эндпоинта, оставляя все остальные сервисы за VPN. Это сводит публичную поверхность атаки к единственному защищённому эндпоинту (например, WireGuard на UDP 51820), полностью скрывая всё остальное от публичного интернета.

Безопасность аккаунта DDNS

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

  • Используйте надёжный уникальный пароль для аккаунта DDNS-провайдера.
  • Включите двухфакторную аутентификацию на основе TOTP для аккаунта провайдера.
  • Периодически ротируйте API-токены и используйте токены с ограниченными правами (только чтение/запись для конкретной зоны, а не всего аккаунта).

Типичные сбои и устранение неполадок

Имя хоста разрешается в старый IP после смены адреса

TTL ещё не истёк, или DDNS-клиент не обнаружил изменение. Проверьте журнал клиента, убедитесь, что API обновления вернул good, и подтвердите, что TTL установлен достаточно низко (менее 300 секунд).

DDclient сообщает nochg, но IP неверный

DDclient кэширует последний известный IP в /var/cache/ddclient/ddclient.cache. Если этот файл содержит устаревшее значение, удалите его и принудительно выполните повторный запуск:

sudo rm /var/cache/ddclient/ddclient.cache
sudo ddclient -daemon=0 -force

API обновления возвращает badauth

Учётные данные в файле конфигурации неверны или API-токен был сменён. Сгенерируйте новый токен в панели управления провайдера и обновите /etc/ddclient.conf.

Определение IP возвращает приватный адрес RFC1918

Клиент считывает LAN IP вместо публичного WAN IP. Измените директиву use= в DDclient на use=web, чтобы принудительно использовать внешнее определение IP через сервис эхо-ответа.

Имя хоста разрешается корректно, но соединение отклоняется

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

nmap -p 443,22,80 home.example.com

Когда DDNS не является подходящим инструментом

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

  • Публичные веб-сайты с высоким трафиком — Задержка сходимости после смены IP (даже 60–120 секунд) вызывает сбои соединения для пользователей, закэшировавших старую запись. Среда VPS-хостинга со статическим IP полностью устраняет эту проблему.
  • Доставка электронной почты (MX-записи) — Почтовые серверы требуют стабильных PTR-записей (обратный DNS) для доставляемости. Провайдеры редко предоставляют управление PTR для динамических IP, а крупные почтовые провайдеры будут отклонять или помечать как спам почту с диапазонов динамических адресов. Используйте выделенный сервис Почтового хостинга или VPS со статическим IP для любой почтовой инфраструктуры.
  • Обработка платежей и соответствие требованиям — PCI-DSS и аналогичные стандарты часто требуют статических, проверяемых IP-адресов для сред данных держателей карт. DDNS категорически неприемлем в данном случае.
  • Многорегиональная избыточность — DDNS-провайдеры, как правило, не поддерживают взвешенную маршрутизацию, проверки работоспособности или географическую балансировку нагрузки. Для этих требований используйте надлежащего DNS-провайдера с функциями управления трафиком.

Матрица технических решений

СценарийРекомендуемое решение
Удалённый доступ к домашней лаборатории, личное использованиеDDNS (достаточно бесплатного тарифа)
Внутренние сервисы малого бизнеса без SLADDNS с пользовательским доменом
Самостоятельно размещаемый VPN для личного/командного использованияDDNS + WireGuard
Публичный веб-сайт, умеренный трафикVPS со статическим IP
Производственный почтовый серверVPS или выделенный сервер со статическим IP + PTR-запись
Высоконагруженное приложение, требуется SLAВыделенный сервер со статическим блоком IP
Удалённое управление IoT-устройствамиDDNS или облачная IoT-платформа
Среда разработки/тестированияDDNS или VPS, в зависимости от требований командного доступа

Контрольный список для настройки

Прежде чем считать ваше DDNS-развёртывание готовым к производственному использованию, проверьте каждый пункт этого списка:

  • [ ] TTL для имени хоста DDNS установлен на 60–120 секунд.
  • [ ] DDNS-клиент или роутер настроен на проверку изменений IP не реже одного раза в 5 минут.
  • [ ] Вызовы API обновления используют исключительно HTTPS — без незашифрованного HTTP.
  • [ ] Аккаунт DDNS-провайдера защищён надёжным паролем и двухфакторной аутентификацией TOTP.
  • [ ] API-токены ограничены минимально необходимыми правами.
  • [ ] Правила брандмауэра открывают только конкретные порты, необходимые активным сервисам.
  • [ ] Fail2ban или аналогичная защита от перебора активна на всех открытых сервисах.
  • [ ] Все веб-сервисы используют действительные TLS-сертификаты с автоматическим обновлением.
  • [ ] Аутентификация по паролю для SSH отключена; применяется аутентификация по ключу.
  • [ ] Журналы DDclient или аналогичного клиента отслеживаются (рассмотрите отправку в syslog или агрегатор журналов).
  • [ ] Тест симуляции смены IP выполнен и время сходимости задокументировано.
  • [ ] Сервисы, не требующие публичного доступа, находятся за VPN, а не открыты напрямую.

Часто задаваемые вопросы

В чём разница между DDNS и стандартным DNS?

Стандартный DNS сопоставляет имя хоста со статическим IP-адресом, который редко или никогда не меняется, со значениями TTL, установленными на часы или дни. DDNS — это система, в которой лёгкий клиент непрерывно отслеживает публичный IP хоста и автоматически отправляет аутентифицированные обновления на авторитативный сервер имён при каждой смене IP, поддерживая точное разрешение несмотря на частую смену адресов.

Как быстро обновление DDNS распространяется после смены IP?

При TTL 60 секунд и отзывчивом DDNS-клиенте (опрос каждые 1–5 минут) полный цикл от смены IP до корректного разрешения для новых запросов занимает приблизительно 2–6 минут. Резолверы, закэшировавшие предыдущую запись, будут продолжать её использовать до истечения кэшированного TTL, поэтому максимальная задержка равна значению TTL на момент последнего успешного обновления.

Можно ли использовать собственное доменное имя с DDNS вместо поддомена провайдера?

Да. Большинство платных тарифов DDNS и все подходы на основе API (Cloudflare, Route 53 и т.д.) поддерживают пользовательские домены. Вы направляете серверы имён вашего домена к DDNS-провайдеру или используете API провайдера для обновления конкретной записи в вашей существующей зоне. Это настоятельно рекомендуется для любого профессионального или бизнес-использования.

Достаточно ли безопасен DDNS для открытия сервисов в интернет?

DDNS сам по себе — это просто механизм DNS, он не является ни безопасным, ни небезопасным. Безопасность полностью зависит от того, что вы открываете и как это защищаете. Имя хоста DDNS, указывающее на надлежащим образом защищённый брандмауэром, зашифрованный TLS, аутентифицированный по ключу сервис, является приемлемо безопасным. Имя хоста DDNS, указывающее на непропатченную панель администратора роутера с паролем по умолчанию, является критической уязвимостью. Уровень DNS — наименьшая из ваших проблем; уровни безопасности приложения и сети — вот что важно.

Работает ли DDNS с IPv6?

Да. Большинство современных DDNS-клиентов и провайдеров поддерживают обновление записей AAAA наряду с записями A. В сетях с двойным стеком вы можете одновременно поддерживать обе записи. DDclient поддерживает IPv6 нативно; настройте отдельную директиву usev6= в файле конфигурации для указания метода определения IPv6.

Что происходит, если DDNS-клиент перестаёт работать?

DNS-запись сохраняет последний успешно обновлённый IP-адрес бессрочно — DDNS-провайдеры не удаляют и не аннулируют записи автоматически при отключении клиента. Если ваш IP изменится, пока клиент не работает, имя хоста будет разрешаться в старый (неверный) IP до тех пор, пока клиент не возобновит работу и не отправит обновление. Для критически важных сервисов отслеживайте процесс DDNS-клиента с помощью супервизора вроде systemd и настройте оповещения о сбоях обновления.

15%

Сэкономьте 15% на всех хостинговых услугах

Проверьте свои навыки и получите скидку на любой тарифный план

Используйте код:

Skills
Начать