Pi-hole обертка для dnsmasq в docker-контейнере

Известно, что dnsmasq отлично работает в качестве обратного (проксирующего) DNS-сервера и DHCP сервера. Два в одном, так сказать. Он широко используется в различного рода маршрутизаторах, таких как OpenWrt и других подобных решениях. И вот, вероятно от скуки, наткнулся случайно, будучи в поисках готового решения объединяющего DNS и DHCP серверы в одном docker-контейнере, на проект под названием Pi-hole…

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

Ну и в общем, решил попробовать. Сам проект можно найти на Github’e и Docker Hub’e в виде готового образа контейнера для Docker.

Пришлось немного модифицировать предлогаемый разработчиками файл docker-compose.yml чтобы выделить отдельный IP-адрес для данного сервиса моей локальной сети. В итоге получилось так:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
version: "3"

# More info at https://github.com/pi-hole/docker-pi-hole/ and https://docs.pi-hole.net/
services:
  pihole:
    container_name: pihole
    image: pihole/pihole:latest
    networks:
      vlm:
        ipv4_address: 192.168.0.15
    ports:
      - "53:53/tcp"
      - "53:53/udp"
      - "67:67/udp"
      - "8080:80/tcp"
    environment:
      TZ: 'Asia/Yekaterinburg'
      WEBPASSWORD: 'MyMegaSecurePassword'
    # Volumes store your data between container upgrades
    volumes:
      - './etc-pihole/:/etc/pihole/'
      - './etc-dnsmasq.d/:/etc/dnsmasq.d/'
    # Recommended but not required (DHCP needs NET_ADMIN)
    #   https://github.com/pi-hole/docker-pi-hole#note-on-capabilities
    cap_add:
      - NET_ADMIN
    restart: unless-stopped

networks:
  vlm:
    driver: macvlan
    driver_opts:
      parent: br0
    ipam:
      config:
        - subnet: 192.168.0.0/24

Интерфейс br0 настроен через netplan с файлом конфигурации /etc/netplan/00-installer-config.yaml, который имеет следующее содержание:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# This is the network config written by 'subiquity'
network:
  version: 2
  ethernets:
    enp1s0f0:
      dhcp4: true
    enp1s0f1:
      dhcp4: true
    enp5s0:
      dhcp4: true
    enp6s0:
      dhcp4: false
      dhcp6: false
  bridges:
      br0:
          macaddress: 74:d0:2b:9a:33:a7
          interfaces:
              - enp6s0
          mtu: 1500
          parameters:
              stp: true
              forward-delay: 4
          dhcp4: true
          dhcp6: true

В итоге мы получаем “dashboard”, который можно найти по адреску: http://192.168.0.15/admin/ и используя пароль MyMegaSecurePassword авиризоваться.

На текущий момент, у меня, это виглядит так:

/pi-hole-dnsmasq-docker/images/01_pihole_main_dashnoard.png
Main Dashboard

Так же можно легко настроить следующие параметры:

  • выбрать DNS-серверы, которые мы будем форвардить
    /pi-hole-dnsmasq-docker/images/02_pihole_dns_forward_setup.png
    DNS Forwarders
  • включить и настроить DHCP сервер
    /pi-hole-dnsmasq-docker/images/03_pihole_dhcp_setup.png
    DHCP Server setup
  • управление собственными локальными DNS-именами
    /pi-hole-dnsmasq-docker/images/04_pihole_dns_setup.png
    DNS Server setup
  • так же быстро настроить черные/белые списки блокировки
    /pi-hole-dnsmasq-docker/images/05_pihole_whitelist.png
    Whitelist setup
  • управлять списками блокировок, которые берутся с внешних ресурсов
    /pi-hole-dnsmasq-docker/images/06_pihole_adlist_management.png
    AdBlock list setup
  • сохранение/восстановление резервной копии конфигурации Pi-hole
    /pi-hole-dnsmasq-docker/images/07_pihole_config_backup.png
    Configuration backup