Как установить и настроить Pi-hole на VPS
Реклама и трекеры лезут из каждого приложения и сайта, а браузерные блокировщики работают только там, где их поставили — на телефоне, на смарт-ТВ или в приложении банка их не установишь. Pi-hole решает это на уровне DNS: один сервер фильтрует запросы для всех ваших устройств сразу, где бы вы ни были. Ниже — рабочая установка на VPS с нуля, без Raspberry Pi, с доступом извне и типичными граблями.
Содержание
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Почему Pi-hole на VPS, а не на Raspberry Pi
Изначально Pi-hole придумывался под одноплатники в домашней сети — отсюда и название. Но ничто не мешает поставить его на обычный VPS, и в некоторых сценариях это даже удобнее:
- Доступ отовсюду. Домашний Pi-hole фильтрует трафик только пока вы в домашней Wi-Fi или подключены через VPN до дома. VPS с публичным IP (или с WireGuard-туннелем) даёт тот же DNS с телефона в кафе, с рабочего ноутбука, с любого устройства с интернетом.
- Надёжность. Сервер не зависает из-за перегрева, не теряется при перезагрузке роутера, не остаётся без питания при отключении электричества дома.
- Изоляция. Pi-hole не делит ресурсы с домашней сетью и не тормозит раздачу интернета соседям по квартире, если вы фильтруете DNS не только себе.
Минус один — сам по себе Pi-hole на VPS с публичным DNS-портом 53 привлекателен для DNS-амплификации, поэтому здесь принципиально важна связка с VPN или строгим файрволом (ниже разберём оба варианта).
Для этой задачи достаточно младшего тарифа: Pi-hole ест минимум ресурсов, 512 МБ — 1 ГБ RAM и 1 vCPU хватает с большим запасом даже под несколько десятков клиентов.
Подготовка сервера и Docker
Дальше все команды — от имени пользователя с sudo на свежей Ubuntu 24.04. Если сервер только что арендован и ещё не настроен, сначала обновите систему и подключитесь по ключу — это описано в подключении по SSH-ключу на Ubuntu 24.04.
sudo apt update && sudo apt upgrade -y
sudo apt install -y curl ca-certificates
Ставить Pi-hole можно и нативным скриптом на голую систему, но в 2026 году удобнее и предсказуемее через Docker — проще обновлять, откатывать и переносить на другой сервер бэкапом одной папки. Если Docker ещё не установлен, разверните его по инструкции установка Docker на Ubuntu 24.04.
Создаём рабочую директорию и файл docker-compose.yml:
mkdir -p ~/pihole/etc-pihole ~/pihole/etc-dnsmasq.d
cd ~/pihole
nano docker-compose.yml
services:
pihole:
container_name: pihole
image: pihole/pihole:2024.07.0
ports:
- "53:53/tcp"
- "53:53/udp"
- "8080:80/tcp"
environment:
TZ: 'Europe/Moscow'
FTLCONF_webserver_api_password: 'ЗАМЕНИТЕ_НА_СЛОЖНЫЙ_ПАРОЛЬ'
FTLCONF_dns_listeningMode: 'all'
volumes:
- './etc-pihole:/etc/pihole'
- './etc-dnsmasq.d:/etc/dnsmasq.d'
cap_add:
- NET_ADMIN
restart: unless-stopped
Пара пояснений по конфигу:
- Порт 80 контейнера пробрасываем на 8080 хоста, а не на 80 — иначе конфликт, если на сервере позже понадобится веб-сервер под сайт или Caddy для SSL.
FTLCONF_dns_listeningMode: 'all'нужен, чтобы Pi-hole слушал DNS-запросы не только с loopback внутри контейнера, а со всех интерфейсов — иначе внешние клиенты не достучатся.- Версию образа лучше фиксировать (
2024.07.0— для примера, проверьте актуальный тег на Docker Hub на момент установки), а не тянутьlatest: так обновление контролируется вами, а не происходит само при пересоздании контейнера.
Запуск:
docker compose up -d
docker compose logs -f pihole
В логах ищите строку вида FTL started — значит, DNS-резолвер поднялся и слушает запросы.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверПервый вход в веб-интерфейс
Веб-панель доступна по адресу http://IP_СЕРВЕРА:8080/admin. Пароль — тот, что вы задали в FTLCONF_webserver_api_password. Если забыли или не задавали, сбросить и сгенерировать новый можно так:
docker exec -it pihole pihole setpassword
В интерфейсе сразу проверьте три раздела:
- Settings → DNS — выберите upstream DNS-серверы. По умолчанию Pi-hole предлагает Google и Cloudflare; для приватности разумнее взять Quad9 (9.9.9.9) или Cloudflare (1.1.1.1), и желательно включить DNS-over-HTTPS через встроенную интеграцию с
cloudflared, если приоритет — не светить DNS-запросы вашего провайдера в открытом виде. - Group Management → Adlists — списки блокировки. Стандартный StevenBlack список подтягивается автоматически, но полезно добавить отдельные списки под трекеры (например AdGuard DNS filter) и обновить базу командой
pihole -gпосле любых правок списков. - Settings → Web interface / API — здесь же можно включить двухфакторную защиту панели, если она доступна в вашей версии.
Файрвол: закрываем DNS от всего интернета
Это самый важный шаг с точки зрения безопасности. Порт 53/UDP, открытый всему миру, — классическая мишень для DNS-амплификации: злоумышленник шлёт мелкие запросы с подменённым IP жертвы, а ваш сервер отвечает ей увеличенным потоком трафика. Поэтому доступ к DNS должен быть только у ваших устройств.
Базовая настройка ufw описана в статье настройка файрвола на Ubuntu 24.04 — здесь только специфика для Pi-hole:
# закрываем DNS для всех, кроме перечисленных IP
sudo ufw deny 53/tcp
sudo ufw deny 53/udp
sudo ufw allow from 203.0.113.10 to any port 53 proto udp
sudo ufw allow from 203.0.113.10 to any port 53 proto tcp
# веб-панель — тоже не всему интернету
sudo ufw allow from 203.0.113.10 to any port 8080 proto tcp
sudo ufw enable
sudo ufw status verbose
Замените 203.0.113.10 на реальный IP вашего домашнего или рабочего интернета. Проблема очевидна: у мобильного интернета и у большинства домашних провайдеров IP плавающий, и белый список по адресу быстро становится неудобным.
Правильное решение — не открывать 53-й порт наружу вообще, а гонять DNS-запросы через VPN-туннель до сервера. Тогда Pi-hole слушает DNS только на внутреннем VPN-интерфейсе, а порт 53 на публичном интерфейсе закрыт полностью. Ставится WireGuard по инструкции установка WireGuard на Ubuntu 24.04, а в качестве DNS в конфиге клиента (DNS = в секции [Interface]) указывается внутренний IP WireGuard-интерфейса сервера (обычно вида 10.x.x.1), а не публичный.
Подключение устройств
Есть два принципиально разных сценария.
Вариант 1 — через VPN (рекомендуется). Все запросы каждого устройства идут через зашифрованный туннель до сервера, а DNS внутри туннеля указывает на Pi-hole. Плюс в том, что вместе с рекламой вы заодно шифруете трафик и получаете доступ к серверу из любой сети без открытых портов наружу. Если WireGuard уже настроен для доступа к другим сервисам, дополнительно достаточно прописать DNS = 10.x.x.1 в конфиге клиента — Pi-hole и VPN спокойно живут на одном сервере.
Вариант 2 — прямое указание DNS на устройстве или роутере. Проще, но требует статического IP клиента для файрвола (см. выше) либо смирения с открытым 53-м портом (не рекомендуется). На роутере DNS обычно меняется в разделе WAN/DHCP — тогда фильтрация применяется сразу ко всем устройствам сети автоматически, без настройки каждого гаджета отдельно. На отдельном устройстве DNS-сервер задаётся в сетевых настройках Wi-Fi-подключения (поле «DNS вручную», IP сервера).
Таблица для ориентира, что где настраивать:
| Устройство | Где менять DNS |
|---|---|
| Роутер (Keenetic, ASUS, MikroTik) | WAN/Интернет → DNS-серверы |
| Windows | Параметры сети → свойства адаптера → IPv4 |
| macOS | Настройки → Сеть → DNS |
| Android | Wi-Fi → изменить сеть → расширенные настройки |
| iOS | Настройки Wi-Fi → Настроить DNS → Вручную |
Обновление списков и обслуживание
Списки блокировки устаревают — домены рекламных сетей меняются, появляются новые трекеры. Автообновление списков раз в неделю включается через cron внутри контейнера, но проще и прозрачнее вынести на хост:
crontab -e
0 4 * * 0 docker exec pihole pihole -g >> /var/log/pihole-gravity.log 2>&1
Так каждое воскресенье в 4 утра список подтягивается заново, а лог остаётся под рукой для проверки, что обновление действительно прошло.
Обновление самого Pi-hole (образа Docker) — вручную и контролируемо, раз в 1-2 месяца:
cd ~/pihole
docker compose pull
docker compose up -d
Бэкап настроек — это просто архив папки etc-pihole, где хранятся списки, настройки и статистика:
tar czf pihole-backup-$(date +%F).tar.gz ~/pihole/etc-pihole ~/pihole/etc-dnsmasq.d
Держите пару последних архивов на отдельном сервере или в облаке — восстановление после потери сервера тогда занимает пять минут: разворачиваете тот же docker-compose.yml, распаковываете архив в те же пути и стартуете контейнер заново.
Частые проблемы и решения
- Резолвинг не работает,
nslookupзависает. Проверьте, что порт 53/UDP реально открыт для вашего IP:sudo ufw status. Отдельно убедитесь, что провайдер VPS не блокирует исходящий UDP на upstream DNS — редко, но случается на некоторых бюджетных площадках. - Панель открывается, но статистика на нуле. Обычно это значит, что устройства резолвят DNS напрямую, минуя Pi-hole — проверьте, что DNS на клиенте действительно указывает на IP сервера, а не на DNS провайдера (часто DHCP роутера подсовывает свой DNS поверх настроек клиента).
- После перезапуска сервера контейнер не поднимается. Убедитесь, что в
docker-compose.ymlстоитrestart: unless-stopped, и что сам Docker включён в автозагрузку:sudo systemctl enable docker. - Сайты, которые точно не должны блокироваться, всё равно блокируются. Слишком агрессивные списки блокировки (особенно "экспериментальные" community-списки) дают ложные срабатывания. В Query Log панели находите заблокированный домен и добавляете его в Whitelist — это стандартная рутина первых недель использования, а не признак поломки.
- DNS отвечает медленно. Если upstream — DNS-over-HTTPS через
cloudflared, задержка на 10-30 мс выше, чем у обычного DNS без шифрования — это ожидаемо, ориентируйтесь сами по факту в вашем регионе и у вашего провайдера, точных цифр без замера на месте не будет. Если задержка кажется избыточной, попробуйте отключить DoH и сравнить.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверНужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.
Частые вопросы
Можно ли использовать Pi-hole вместо VPN?
Нет, это разные вещи: Pi-hole фильтрует DNS-запросы (блокирует рекламу и трекеры по домену), но не шифрует и не маскирует остальной трафик. Для приватности и обхода блокировок нужен именно VPN, Pi-hole — дополнение к нему, а не замена.
Сколько ресурсов реально нужно серверу?
Для домашнего использования на 5-15 устройств хватает 1 vCPU и 512 МБ — 1 ГБ RAM с большим запасом. Узким местом раньше станет не CPU, а трафик, если через сервер ещё и VPN гоняется.
Pi-hole замедляет интернет?
DNS-резолвинг добавляет доли миллисекунды к первому запросу к домену — дальше ответ кешируется на стороне Pi-hole. На ощутимую скорость загрузки страниц это не влияет, а за счёт блокировки рекламных баннеров и трекинг-скриптов сайты часто грузятся заметно быстрее.
Что будет, если сервер с Pi-hole упадёт?
Устройства, у которых DNS указан напрямую на Pi-hole без резервного сервера, потеряют доступ в интернет до восстановления. Разумно указать вторичный DNS (например, 1.1.1.1) в качестве fallback в настройках клиента или роутера — тогда при недоступности Pi-hole устройство продолжит резолвить через резервный сервер, просто без фильтрации.
Нужен ли отдельный сервер под Pi-hole, если уже есть VPS с WireGuard?
Нет, они прекрасно уживаются на одном сервере — ресурсов Pi-hole требует минимум, а связка «VPN + DNS-фильтрация на одном хосте» даже удобнее с точки зрения администрирования.
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →