Пост

Pi-hole ×2 + Nebula Sync: отказоустойчивый фильтр рекламы дома

🛡 Pi-hole ×2 + Nebula Sync: отказоустойчивый фильтр рекламы дома

Зачем это всё?

Pi-hole давно стал «золотым стандартом» для фильтрации рекламы и трекеров.
Но у него есть один минус: если Pi-hole упал → интернет для всей сети становится недоступен (нет DNS).

Моё решение:

  • Один Pi-hole работает на Raspberry Pi (физический, надёжный, low-power).
  • Второй — в Docker-контейнере (на домашнем сервере).
  • Конфигурации синхронизируются через Nebula (mesh VPN).

В итоге у меня отказоустойчивая DNS-схема, которая продолжает работать даже если Raspberry Pi выключить.


Архитектура

  • Raspberry Pi — главный Pi-hole (статический IP, используется роутером по умолчанию).
  • Docker Pi-hole — резервный DNS, на Proxmox-сервере.
  • Nebula — mesh VPN для синхронизации конфигов (whitelist/blacklist, статистика).
  • Роутер — прописаны два DNS: 192.168.1.10 (Raspberry) и 192.168.30.20 (Docker).
1
2
3
[Клиенты] → [Роутер] → DNS #1 (Raspberry Pi-hole)
                          ↳ DNS #2 (Docker Pi-hole)
                               ↑ синхронизация через Nebula ↑

Установка Pi-hole на Raspberry Pi

1. Подготовка системы

Ставим Raspberry Pi OS Lite, настраиваем статический IP.

1
2
3
4
5
sudo nano /etc/dhcpcd.conf
interface eth0
static ip_address=192.168.1.10/24
static routers=192.168.1.1
static domain_name_servers=1.1.1.1 8.8.8.8

2. Установка Pi-hole

1
curl -sSL https://install.pi-hole.net | bash

Выбираем интерфейс, DNS (например, Cloudflare), включаем веб-интерфейс.


Установка Pi-hole в Docker

docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
version: "3"
services:
  pihole:
    image: pihole/pihole:latest
    container_name: pihole
    environment:
      TZ: 'Europe/Moscow'
      WEBPASSWORD: 'changeme'
    volumes:
      - ./etc-pihole:/etc/pihole
      - ./etc-dnsmasq.d:/etc/dnsmasq.d
    ports:
      - "53:53/tcp"
      - "53:53/udp"
      - "8080:80/tcp"
    restart: unless-stopped

Запуск:

1
docker-compose up -d

Теперь доступен веб-интерфейс по http://SERVER_IP:8080/admin.


Nebula Sync

1. Что это такое?

Nebula — лёгкий mesh VPN, похожий на Tailscale, но полностью self-hosted.
Я использую его для синхронизации конфигов Pi-hole.

2. Установка

Ставим nebula на оба узла (Raspberry и сервер).
Каждый получает приватный IP (например, 10.200.0.1 и 10.200.0.2).

3. systemd unit

1
2
3
4
5
6
7
8
9
10
[Unit]
Description=Nebula Mesh VPN
After=network.target

[Service]
ExecStart=/usr/local/bin/nebula -config /etc/nebula/config.yml
Restart=always

[Install]
WantedBy=multi-user.target

4. Синхронизация

Скрипт для репликации whitelist/blacklist каждые 5 минут:

1
2
#!/bin/bash
rsync -avz -e "nebula-cert ssh" /etc/pihole/gravity.db root@10.200.0.2:/etc/pihole/gravity.db

Можно повесить на cron:

1
*/5 * * * * /usr/local/bin/sync-pihole.sh

Мониторинг и визуализация

Я использую Grafana + Prometheus Exporter для Pi-hole.
Он собирает метрики: количество запросов, блокировки, топ-домены.

Пример дашборда:

  • 📊 Общее количество DNS-запросов.
  • 🚫 Сколько заблокировано.
  • 🌍 Список топ-10 заблокированных доменов.

Итоги

  • ✅ Два Pi-hole: Raspberry (главный) + Docker (резерв).
  • ✅ Nebula обеспечивает синхронизацию конфигов.
  • ✅ Интернет продолжает работать даже если одно устройство падает.
  • ✅ Красивый мониторинг в Grafana.

Это решение отлично подходит для homelab и умного дома: удобно, надёжно, красиво.

Авторский пост защищен лицензией CC BY 4.0 .