Хочется открыть из отпуска или с работы свой домашний NAS, облако, Home Assistant или принтер, но не «выставлять» их в интернет? Для этого придумали VPN: защищённый туннель между вашим телефоном или ноутбуком и домашней сетью. Вы подключаетесь, и устройства дома становятся доступны так, будто вы сидите на диване. Запросов «vpn на raspberry pi» и «wireguard на raspberry pi» много, и неудивительно: плата работает круглосуточно, мало потребляет, а WireGuard — самый простой и быстрый из современных протоколов VPN.
В статье настроим VPN-сервер WireGuard на Raspberry Pi 5 без готовых «обёрток»: по шагам, с ключами, настройкой сервера и клиентов, QR-кодом для телефона, пробросом порта и проверкой. Для чего это нужно: безопасный доступ к NAS, Nextcloud, Home Assistant и Pi-hole извне и защита соединения в чужих Wi-Fi-сетях.
Про что эта статья. Мы настраиваем доступ к собственной домашней сети. Это не способ изменить маршрут интернет-трафика между странами и не инструмент для обхода ограничений: рассматривается только VPN «дом — устройство».
Как это работает
- На Raspberry Pi запущен сервер WireGuard с адресом
10.8.0.1в особой «сети VPN» (10.8.0.0/24). - Роутер пробрасывает порт UDP 51820 на Raspberry Pi.
- Телефон (клиент) получает адрес
10.8.0.2, соединяется с сервером по зашифрованному туннелю и через него обращается к устройствам домашней сети. - У каждого устройства свой ключ: чужой не подключится, а если телефон потерян, достаточно удалить его ключ с сервера.
WireGuard «молчит» на неавторизованные пакеты: порт не отвечает тем, у кого нет ключа, поэтому сканирование его не обнаруживает.
Что нужно заранее
| Условие | Зачем |
|---|---|
| Raspberry Pi 5 по кабелю Ethernet | Сервер должен быть стабилен |
| Постоянный адрес платы в домашней сети | Как закрепить |
| Доступ к настройкам роутера | Нужно пробросить порт UDP 51820 |
| Публичный IP-адрес у провайдера | Без него из интернета до вашей сети не достучаться (см. ниже) |
| Адрес для подключения: IP или имя (DDNS) | Если IP-адрес меняется, нужен динамический DNS |
Белый и серый IP
Многие провайдеры выдают домашним клиентам «серый» адрес: за общим NAT провайдера, и входящие подключения невозможны. Проверить просто: сравните адрес, который роутер считает внешним (на странице состояния подключения), с тем, что показывает любой сайт «мой IP». Если они совпадают, у вас публичный адрес. Если разные, адрес «серый». У большинства провайдеров «белый» (публичный) IP включается отдельной услугой, иногда бесплатно. Без неё сервер дома не получится: нужно арендовать виртуальный сервер или использовать решения вроде Tailscale (см. ниже).
Динамический DNS
Публичный адрес у домашнего абонента часто меняется. Чтобы не следить за ним, используют динамический DNS: служба хранит имя (mypi.example.net), которое всегда указывает на ваш текущий адрес. Многие роутеры умеют это сами (у некоторых провайдеров и производителей есть свои сервисы), есть и независимые (DuckDNS, No-IP и другие). Выберите, настройте и дальше используйте имя вместо IP.
Установка
В отличие от старых инструкций, проект PiVPN (скрипт-обёртка для WireGuard и OpenVPN) больше не развивается: его последние версии вышли с пометкой о завершении проекта. WireGuard настраивается и без обёртки быстро, а понимание схемы поможет, когда что-то пойдёт не так. Ядро Raspberry Pi OS уже содержит модуль WireGuard, нужны только утилиты:
sudo apt update
sudo apt install wireguard qrencode iptables
Пакет qrencode нужен для QR-кода (подключение телефона одним сканированием), а iptables — для правил «пропуска» трафика в домашнюю сеть.
Шаг 1. Включаем маршрутизацию
Чтобы плата передавала пакеты между VPN и домашней сетью, включите пересылку IP-пакетов:
echo "net.ipv4.ip_forward=1" | sudo tee /etc/sysctl.d/99-wireguard.conf
sudo sysctl --system
Проверьте: sysctl net.ipv4.ip_forward должно вывести = 1.
Что на снимке. Первая команда записывает строку в файл /etc/sysctl.d/99-wireguard.conf и сама же её повторяет (net.ipv4.ip_forward=1): так работает tee. Вторая команда перечитывает все файлы настроек ядра и печатает каждый из них со строкой * Applying …; наш файл 99-wireguard.conf стоит последним в списке. Длинный список строк net.ipv4.conf.… — настройки по каждому сетевому интерфейсу платы, у вас набор интерфейсов может отличаться. Последняя строка net.ipv4.ip_forward = 1 — пересылка пакетов включена; она сохранится и после перезагрузки.
Шаг 2. Ключи сервера
Ключи — это пары чисел: закрытый ключ остаётся только на своём устройстве, открытый передаётся другой стороне.
sudo -i
cd /etc/wireguard
umask 077
wg genkey | tee server_private.key | wg pubkey > server_public.key
cat server_public.key
exit
Права umask 077 защищают закрытые ключи от чтения другими пользователями.
Что на снимке. Команда sudo -i открывает оболочку администратора: приглашение меняется с admin@raspberrypi5:~ $ на root@raspberrypi5:…#. Это нужно, потому что запись в папку /etc/wireguard через > выполняется с правами текущей оболочки, и обычный пользователь её не выполнит. Команда с wg genkey ничего не печатает: закрытый ключ ушёл в файл server_private.key, открытый в server_public.key. cat server_public.key показывает открытый ключ: строку из 44 символов, которая заканчивается на =. Команда exit возвращает вас в обычную оболочку (logout).
На снимках этой статьи оба ключа сервера закрыты подписями ОТКРЫТЫЙ_КЛЮЧ_СЕРВЕРА и ЗАКРЫТЫЙ_КЛЮЧ_СЕРВЕРА: у вас на их месте будет набор символов. Закрытый ключ никому не показывайте и не публикуйте, в том числе на снимках экрана.
Шаг 3. Конфигурация сервера
Создайте файл /etc/wireguard/wg0.conf:
sudo nano /etc/wireguard/wg0.conf
[Interface]
Address = 10.8.0.1/24
ListenPort = 51820
PrivateKey = ЗАКРЫТЫЙ_КЛЮЧ_СЕРВЕРА
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
Вместо ЗАКРЫТЫЙ_КЛЮЧ_СЕРВЕРА подставьте содержимое файла /etc/wireguard/server_private.key (sudo cat /etc/wireguard/server_private.key). Вот как выглядит файл в редакторе nano:
Звёздочка после имени файла в заголовке nano (/etc/wireguard/wg0.conf *) значит, что изменения ещё не сохранены: нажмите Ctrl+O, Enter, затем Ctrl+X. Строки PostUp и PostDown длинные; каждая должна остаться одной строкой, без переноса. Что здесь настроено:
Address— адрес сервера внутри VPN;ListenPort— порт UDP, на котором сервер принимает подключения;PostUpиPostDown— правила, которые разрешают передачу пакетов и подменяют адрес отправителя на адрес платы (MASQUERADE), чтобы устройства дома отвечали клиентам VPN (иначе им пришлось бы знать маршрут к сети10.8.0.0/24). Имяeth0— проводной интерфейс платы. Проверьте своё:ip -br a.
Включите сервер и добавьте в автозапуск:
sudo chmod 600 /etc/wireguard/wg0.conf
sudo systemctl enable --now wg-quick@wg0
sudo wg show
Команда wg show выведет интерфейс wg0 и порт 51820.
Что на снимке. sudo cat /etc/wireguard/server_private.key печатает закрытый ключ, его и нужно вставить в PrivateKey (на снимке он закрыт подписью). Затем файл правится в nano и закрывается правами 600: читать его может только администратор. Команда enable --now одновременно запускает сервер и включает автозапуск: сообщение Created symlink …/wg-quick@wg0.service как раз об этом. В выводе sudo wg show видны интерфейс wg0, открытый ключ сервера (он совпадает с server_public.key), строка private key: (hidden) — закрытый ключ программа не показывает — и порт 51820. Блока peer пока нет: клиентов мы ещё не добавляли.
Роутер: проброс порта
В настройках роутера найдите раздел «Проброс портов» (Port Forwarding, «Виртуальные серверы», «NAT»). Создайте правило:
| Параметр | Значение |
|---|---|
| Протокол | UDP |
| Внешний порт | 51820 |
| Внутренний адрес | Адрес Raspberry Pi (например, 192.168.0.122) |
| Внутренний порт | 51820 |
Так выглядит правило в одном из роутеров: у вас разделы и подписи будут другими, а набор полей тот же. Enable Port Mapping включает правило, Mapping Name — любое имя (здесь RPI5 UDP), Internal Host — адрес платы (192.168.0.122; рядом выбрано имя устройства raspberrypi5), Protocol — UDP, External port number и Internal port number — оба 51820. В поле WAN Name выбирают соединение, через которое роутер выходит в интернет. Поля External Source IP Address и External source port number оставлены пустыми: порт открыт для подключений с любого адреса. Внизу нажмите Apply. Адрес 192.168.0.122 — это плата по кабелю; если она подключена и по Wi-Fi, у неё будет второй адрес, а правило нужно привязывать к проводному.
Порт можно изменить (меняйте оба места: ListenPort и роутер). WireGuard использует только UDP, TCP открывать не надо.
Клиенты: добавляем устройство
Для каждого устройства нужна своя пара ключей и свой адрес в сети VPN. Ниже скрипт, который создаёт клиента и сразу показывает QR-код. Сохраните его как /usr/local/bin/wg-add-client:
sudo nano /usr/local/bin/wg-add-client
#!/bin/bash
# Использование: sudo wg-add-client имя последний-октет
# Пример: sudo wg-add-client phone 2 (адрес 10.8.0.2)
set -e
NAME="$1"; N="$2"
if [ -z "$NAME" ] || [ -z "$N" ]; then
echo "Использование: $0 имя последний-октет"; exit 1
fi
ENDPOINT="mypi.example.net:51820" # ваш DDNS-адрес или публичный IP и порт
LAN_DNS="192.168.0.122" # DNS для клиента (Pi-hole или роутер)
LAN_NET="192.168.0.0/24" # ваша домашняя сеть
cd /etc/wireguard
umask 077
wg genkey | tee "$NAME.key" | wg pubkey > "$NAME.pub"
cat > "$NAME.conf" <<EOF
[Interface]
PrivateKey = $(cat "$NAME.key")
Address = 10.8.0.$N/24
DNS = $LAN_DNS
[Peer]
PublicKey = $(cat server_public.key)
Endpoint = $ENDPOINT
AllowedIPs = $LAN_NET, 10.8.0.0/24
PersistentKeepalive = 25
EOF
# добавляем клиента на сервер: сразу в работающий интерфейс и в файл
wg set wg0 peer "$(cat "$NAME.pub")" allowed-ips "10.8.0.$N/32"
cat >> wg0.conf <<EOF
[Peer]
# $NAME
PublicKey = $(cat "$NAME.pub")
AllowedIPs = 10.8.0.$N/32
EOF
echo "Клиент $NAME создан: /etc/wireguard/$NAME.conf"
qrencode -t ansiutf8 < "$NAME.conf"
sudo chmod +x /usr/local/bin/wg-add-client
sudo wg-add-client phone 2
Что на снимке. Сначала скрипт сохранён в nano и сделан исполняемым (chmod +x; sudo попросил пароль пользователя, вводимые символы на экране не появляются). Затем sudo wg-add-client phone 2 создал клиента phone с адресом 10.8.0.2, ответил Клиент phone создан: /etc/wireguard/phone.conf и нарисовал QR-код. На снимке QR-код закрыт мозаикой. В нём записан весь файл клиента вместе с закрытым ключом, поэтому код нельзя показывать, фотографировать и пересылать: любой, кто его отсканирует, получит доступ к вашей сети. У вас на этом месте будет чёткий чёрно-белый квадрат.
Скрипт нарисует QR-код в терминале. Параметры в файле клиента:
Address— адрес клиента в VPN;DNS— сервер имён для клиента. Укажите Pi-hole или роутер, чтобы по имени открывались домашние устройства;Endpoint— адрес сервера из интернета (имя DDNS или публичный IP) и порт;AllowedIPs— какой трафик идёт в туннель. Здесь только домашняя сеть и сеть VPN (так называемый split tunnel). Весь остальной интернет остаётся «напрямую»;PersistentKeepalive = 25— «пинг» каждые 25 секунд, который держит соединение открытым за NAT.
Если хотите пускать через дом весь трафик. В AllowedIPs клиента вместо подсетей укажите 0.0.0.0/0, ::/0. Тогда весь интернет-трафик устройства идёт через домашний канал (удобно в чужих Wi-Fi-сетях). Скорость будет ограничена исходящей скоростью вашего домашнего интернета.
Телефон (Android, iOS)
- Установите приложение WireGuard (оно есть в Google Play и App Store).
- Нажмите «+» → Сканировать QR-код и наведите камеру на код в терминале.
- Дайте имя туннелю и включите переключатель.
Что на снимках. Слева приложение при первом запуске: список пуст, внизу кнопка «+». Справа в списке появился туннель rpi5 (имя вы задаёте сами при добавлении), его переключатель пока выключен: коснитесь его, чтобы включить туннель.
Компьютер (Windows, macOS, Linux)
Телефон подключается по QR-коду, а на компьютере сканировать нечего: туда переносят готовый файл настроек клиента. Порядок такой: создать на плате отдельного клиента, забрать его файл .conf, импортировать в программу WireGuard, включить туннель и проверить. Файл содержит закрытый ключ клиента, поэтому переносите его только по домашней сети (командой scp), а не почтой и не через мессенджер.
1) Создайте клиента для компьютера. У каждого устройства свой клиент: свои ключи и свой адрес в VPN. Один и тот же файл на двух устройствах использовать нельзя: с одинаковым ключом и адресом они будут вытеснять друг друга. Телефон получил 10.8.0.2, для компьютера возьмите следующий свободный номер:
sudo wg-add-client laptop 3
Скрипт создаст файл /etc/wireguard/laptop.conf (адрес клиента 10.8.0.3) и нарисует QR-код. Для компьютера код не нужен, его можно проигнорировать.
2) Скопируйте файл на компьютер. Папку /etc/wireguard читает только администратор, и обычный пользователь не сможет забрать оттуда файл по scp. Поэтому сначала сделайте временную копию в своей домашней папке на плате:
sudo cp /etc/wireguard/laptop.conf ~/laptop.conf && sudo chown $USER ~/laptop.conf
Затем на компьютере откройте PowerShell (Windows) или Терминал (macOS, Linux) и скачайте файл. Компьютер должен быть в той же домашней сети, что и плата: туннель ещё не работает, поэтому по VPN файл не передать.
scp admin@192.168.0.122:laptop.conf .
На снимке PowerShell, диск D:: после команды scp выводится имя скопированного файла laptop.conf и приглашение возвращается без ошибок, значит, файл лежит в текущей папке (D:\). Если SSH-ключ уже настроен, команда не спросит пароль, как на снимке; иначе введите пароль пользователя платы.
Вместо admin подставьте имя пользователя на плате, вместо 192.168.0.122 — адрес вашей платы. Команда спросит пароль этого пользователя (при первом подключении ещё и подтверждение отпечатка: напишите yes) и положит laptop.conf в текущую папку компьютера. Если команды scp нет, в современных Windows её даёт компонент «Клиент OpenSSH». Запасной вариант без scp: выполните на плате sudo cat /etc/wireguard/laptop.conf и скопируйте текст в буфер обмена; потом вставите его в программе WireGuard (Add Tunnel → Add empty tunnel, старый текст в окне заменяется вставленным). После вставки очистите буфер обмена и закройте окно терминала с ключом.
После переноса удалите временную копию на плате:
rm ~/laptop.conf
3) Импортируйте файл и включите туннель.
| Система | Что установить | Как включить |
|---|---|---|
| Windows | Программа WireGuard с официального сайта | Нажмите Add Tunnel (или стрелку рядом с ней, пункт Import tunnel(s) from file), выберите laptop.conf, затем кнопка Activate |
| macOS | Приложение WireGuard из Mac App Store | Значок «+» внизу списка → Import tunnel(s) from file…, выберите laptop.conf; система попросит разрешить добавление VPN-конфигурации; затем Activate |
| Linux | Пакет wireguard (в Fedora и Arch он называется wireguard-tools) | Команды ниже |
В Linux файл кладут в /etc/wireguard, имя интерфейса берётся из имени файла:
sudo apt install wireguard resolvconf
sudo cp laptop.conf /etc/wireguard/
sudo chmod 600 /etc/wireguard/laptop.conf
sudo wg-quick up laptop
Если wg-quick пишет, что не находит resolvconf, поставьте пакет resolvconf (или openresolv): он нужен для строки DNS в файле клиента. Остановить туннель: sudo wg-quick down laptop. Чтобы туннель включался при загрузке, выполните sudo systemctl enable --now wg-quick@laptop; на ноутбуке, который бывает дома, автозапуск лучше не включать (см. ниже).
4) Проверьте подключение.
- Подключите компьютер к другой сети: раздайте интернет с телефона (точка доступа) или возьмите чужой Wi-Fi. Дома туннель включать не нужно: устройства домашней сети и так доступны напрямую, а маршрут
192.168.0.0/24через туннель только запутает систему. - Включите туннель. В окне программы (Windows, macOS) у туннеля появятся строки Latest handshake («последнее рукопожатие») и Transfer (принято и отправлено); в Linux то же покажет
sudo wg show. Если рукопожатия нет, смотрите таблицу «Если что-то не работает» ниже. - Проверьте связь:
ping 10.8.0.1(сама плата внутри VPN), затемping 192.168.0.122и адрес роутераping 192.168.0.1. Откройте в браузере страницу домашнего сервиса, напримерhttp://192.168.0.122:1880.
Что на снимке. Окно WireGuard для Windows с включённым туннелем laptop: слева список туннелей, внизу кнопка Add Tunnel, рядом вкладка Log с журналом. В блоке Interface статус Active (зелёный щит), Public key — открытый ключ компьютера (программа вычисляет его из закрытого сама), Listen port — порт, который Windows выбрала для клиента (у вас он будет другим), Addresses 10.8.0.3/24 — адрес компьютера в VPN, DNS servers — 192.168.0.1. Кнопка Deactivate выключает туннель. В блоке Peer описан сервер на плате: его открытый ключ, Allowed IPs (домашняя сеть и сеть VPN), Endpoint — адрес и порт, Persistent keepalive 25, Latest handshake 14 seconds ago («14 секунд назад») и Transfer: принято 3,93 KiB, отправлено 3,77 KiB. Раз рукопожатие свежее и счётчики растут, туннель работает. Открытые ключи на снимке заменены подписями, а адрес сервера — примером mypi.example.net:51820.
Имена вида raspberrypi5.local через VPN, скорее всего, не заработают: такие имена находятся широковещательными запросами внутри одной сети, а в туннель они не попадают. Открывайте домашние устройства по IP-адресам, или заведите имена в Pi-hole или роутере (DNS в файле клиента как раз ведёт туда).
5) Уберите лишнее. Когда убедитесь, что туннель на компьютере работает, удалите скачанный laptop.conf из папки загрузок: программа WireGuard уже сохранила настройки у себя. На плате удалите файлы клиента, сервер хранит только его открытый ключ в wg0.conf:
sudo rm /etc/wireguard/laptop.key /etc/wireguard/laptop.conf
Если потеряете компьютер, удалите его блок [Peer] (см. раздел «Управление клиентами»): доступ по этому ключу прекратится, даже если файл попадёт к чужому.
Закрытые ключи. Файлы *.conf и *.key содержат закрытые ключи. Передавайте их безопасно и удаляйте с платы, когда они больше не нужны: сервер хранит только открытые ключи клиентов. После установки на устройство файлы в /etc/wireguard лучше убрать из мест, где к ним могут получить доступ.
Проверка
- Отключите Wi-Fi телефона и включите мобильный интернет: нужно проверять не из домашней сети.
- Включите туннель в приложении.
- На плате выполните
sudo wg show: у клиента должна появиться строкаlatest handshake(«последнее рукопожатие») с недавним временем и счётчикиtransfer. - На телефоне откройте адрес устройства дома: например,
http://192.168.0.1(роутер) илиhttp://192.168.0.122:8080(Nextcloud). Или выполните ping.
Что на снимках. Слева экран включённого туннеля rpi5. Адреса 10.8.0.2/24 — адрес телефона внутри VPN, DNS-серверы — адрес, который скрипт записал в DNS, Разрешённые IP-адреса — домашняя сеть и сеть VPN (только этот трафик идёт в туннель), Конечная точка — адрес сервера и порт (на снимке заменён примером mypi.example.net:51820), Постоянное соединение — тот самый PersistentKeepalive = 25. Блок Статистика показывает принятые и переданные данные, а строка Последнее рукопожатие — 11 секунд назад: сервер и телефон обменялись ключами, туннель работает. Открытые ключи на снимке закрыты подписями. Справа тот же телефон на мобильном интернете (значок 4G+ и значок ключа, VPN, в строке состояния) открыл страницу входа в Node-RED на плате по домашнему адресу 192.168.0.122:1880: из чужой сети этот адрес без VPN недоступен.
Если рукопожатия нет, смотрите таблицу ниже.
Управление клиентами
| Задача | Команда |
|---|---|
| Показать подключения | sudo wg show |
| Остановить сервер | sudo systemctl stop wg-quick@wg0 |
| Перезапустить | sudo systemctl restart wg-quick@wg0 |
| Удалить клиента | Удалите блок [Peer] из /etc/wireguard/wg0.conf и выполните sudo wg set wg0 peer ОТКРЫТЫЙ_КЛЮЧ remove |
| Журнал | journalctl -u wg-quick@wg0 |
Альтернатива: Tailscale
Если у провайдера «серый» адрес, а проброс порта невозможен, можно использовать сервисы на основе WireGuard, которые сами соединяют устройства (например, Tailscale). Установка на Raspberry Pi занимает пару команд, не требует проброса портов, но зависит от стороннего сервера координации и его доступности из вашей сети. Для полностью собственного решения остаётся белый IP или аренда VPS.
Если что-то не работает
| Проблема | Что проверить |
|---|---|
Нет рукопожатия (latest handshake отсутствует) | Порт UDP 51820 не проброшен или не тот адрес платы; у провайдера серый IP; в Endpoint неверный адрес/имя; перепутаны ключи (открытый и закрытый). Проверьте, что клиент не в домашнем Wi-Fi |
| Рукопожатие есть, но нет доступа к домашним устройствам | Не включена пересылка пакетов (sysctl net.ipv4.ip_forward), нет правил PostUp (проверьте sudo iptables -t nat -S), указан не тот интерфейс (eth0), в AllowedIPs клиента нет домашней сети |
| Домашние устройства открываются по IP, но не по имени | В клиенте не указан DNS, или DNS-сервер не знает локальных имён |
| Соединение рвётся | Нужен PersistentKeepalive = 25 в клиенте. Проверьте, не перегружен ли канал |
| Подключение работает, но страницы грузятся медленно или частично | Проблема размера пакетов. Добавьте в раздел [Interface] клиента MTU = 1280 |
| Сервер не запускается | systemctl status wg-quick@wg0 и journalctl -u wg-quick@wg0. Проверьте ошибки в wg0.conf, права на файл (600) |
| После смены адреса провайдером перестало работать | Используйте динамический DNS и имя вместо IP |
| Правила iptables не применяются | Установлен ли пакет iptables; на системах с nftables проверьте, что команды iptables существуют |
Безопасность. В интернет наружу открыт только один порт UDP 51820. Не открывайте дополнительные порты домашних служб (SMB, SSH, Nextcloud): через VPN они доступны без этого. Храните ключи в секрете, а для каждого устройства создавайте отдельный ключ.
Что дальше
- Nextcloud на Raspberry Pi 5: облако, доступное через VPN.
- NAS на Samba и OpenMediaVault.
- Pi-hole или AdGuard Home: фильтр DNS и для VPN-клиентов.
- Подключение к рабочему столу Raspberry Pi: VNC через туннель.
Материалы
- WireGuard: быстрый старт — официальная инструкция.
- wg(8) и wg-quick(8) — справочник по командам.
- WireGuard: клиенты — программы для Windows, macOS, Linux, Android и iOS.
- PiVPN — проект-обёртка (больше не развивается).
- DuckDNS — пример бесплатного динамического DNS.














