Raspberry Pi Zero та Pi-hole

Я купив першу версію Raspberry Pi на початку 2013 року. Спочатку я експерементував з датчиками температури та вологості, згодом використовував для завантаження фоток в «хмари», потім приєднав до телевізора як медіа-плеєр. З часом стало зрозуміло, що Raspberry Pi занадто слабкий і потрібні окремо NAS та медіа-плеєр. Першим став Synology DS213j а згодом зʼявився і Nexus Player. Більше застосувань я не зміг придумати тому віддав Raspberry Pi співробітнику кількома роками пізніше.

Але я не перестав дивитися в бік нових Raspberry Pi. І от лише після виходу Raspberry Pi 4 я дізнався, що відносно старий Raspberry Pi Zero можна використовувати як USB пристрій, для прикладу його можна підключити в USB порт ком’ютера чи роутера. В такій конфігурації йому не потрібне додаткове живлення та мережа. І я загорівся ідеєю нарешті спробувати Pi-hole щоб замінити стандартний DNS сервер в Mikrotik.

Ціна Raspberry Pi Zero — $5. Існує новіша версія з Wi-Fi за $10 але для мене в ній немає сенсу — я намагаюсь мінімально використовути безпровідні мережі, тим більше для такого критичного сервісу як DNS. Ще приблизно $5 коштує спеціальна плата з USB портом. Разом це виглядає ось так:

Ще однією перевагою Raspberry Pi Zero над Raspberry Pi 3/4 є мінімальне електроспоживання.
Маленька плата має потужність 0.5 – 1.75 Вт тобто споживає 0.36 – 1.2 кВт-годин на місяць.
В грошах це виходить $0.1 – 0.36 за тарифами електричної компанії Сан Дієґо.
Для порівняння, Raspberry Pi 4 має потужність 3 – 6.25 Вт.

Я цілком розумію, що Raspberry Pi Zero вже досить старий і його на багато (довго) не вистачить. Але я сприймаю це як пробний період. Можливо я придумаю йому більше застосувань і тоді в Raspberry Pi 4 зʼявиться сенс.
Поки дивлюся в бік камери та невеликого OLED екрану.

Операційна система, що зазвичай використовується на Raspberry Pi, називається Raspbian (базується на Debian).
Після встановлення її на флешку потрібно зробити додаткові налаштування щоб можна було підлючатися до Raspberry Pi Zero по USB.

З компʼютером особливих проблем не виникло — підключив, почекав хвилину, в системі зʼявився новий мережевий пристрій, приєднався по SSH до raspberrypi.local. З роутером виявилося не все так просто. Потрібно емулювати певний LTE модем, який підтримує мій роутер Mikrotik. Для цього потрібно в файл /etc/modprobe.d/g_ether.conf вставити такий рядок:
options g_ether idVendor=0x05ac idProduct=0x1402 iProduct=PiZero iManufacturer=Raspberry dev_addr=XX:XX:XX:XX:XX:XX
Найважливіше це задати параметри idVendor та idProduct. Параметр dev_addr та mac-адресу можна не вказувати але тоді після кожного завантаження вона буде інша, відповідно складно використовувати DHCP для статичного ІР.

Ще один нюанс з роутером Mikrotik — він чомусь знаходить та розпізнає новий пристрій лише під час завантаження. Тому для налагодження доводиться часто вимикати Raspberry Pi Zero (sudo shutdown -h now) та перевантажувати роутер (/system reboot).

Спочатку я планував додати новий пристрій в існуючу мережу (10.0.0.0). Але виявилося, що Mikrotik створює новий інтерфейс lte1, якийсь чомусь не можна додати в міст (bridge), що обʼєднує Ethernet порти та Wi-Fi мережі. Можливо моїх знань Mikrotik не достатньо, але після багатьох спроб я так і не зміг цього досягти. Кілька разів в результаті моїх експерементів у мене взагалі зникав доступ до роутера, але якщо витягти Raspberry Pi Zero та перевантажити роутер то інтерфейс lte1 не створювався і більше не заважав звичайній роботі мережі.

У мене є додаткова мережа для IoT (10.10.0.0), куди входить віртуальна Wi-Fi мережа та один з портів роутера. Це допомагає ізолювати пристрої, яким я не дуже довіряю (телевізор, китайські «розумні» розетки, робот-пилесос, кнопки Amazon Dash) від основної мережі.

В результаті я створив третю мережу (10.20.0.0) виключно для Raspberry Pi Zero. Потім трохи подумав і переробив її так, щоб DNS отримав адресу 10.10.10.10 (як 1.1.1.1, 8.8.8.8, 9.9.9.9 і т.п.) бо так легше запамʼятати. З IPv6 поки не розбирався бо схоже провайдер надає лише одну /64 мережу і вона вже використовується для основної мережі (а для IoT протокол IPv6 не потрібен взагалі).

Pi-hole це DNS сервер, що дозволяє легко фільтрувати рекламу. Він чудово працює на Raspberry Pi Zero бо не потребую багато ресурсів. Встановлення інтерактивне тому конфіги не треба редагувати (а шкода…). Я одразу замінив lighthttp на nginx бо звик до нього, також я планую використовувати його і для інших задач. Чорні списки я використав стандартні але вже забанив кілька додаткових доменів (телевізор постійно кудись «стукає»).

Я і до цього використовував DNS сервери від CloudFlare (1.1.1.1 та 1.0.0.1). Одна з можливостей, що стала доступною з Pi-hole, це перейти на захищені протоколи DNS-over-TLS (DoT) та DNS-over-HTTPS (DoH) замість звичайного, незахищеного.
DoT трохи складніше налаштувати, а от підтримку DoH можна додати за допомогою програми cloudflared.
На жаль, час від часу cloudflared починає використовувати 100% CPU а DNS сервер перестає відповідати на запити. Поки не було часу розібратися, що відбувається, але можливо в майбутньому вийде вирішити і цю проблему.
Також за приватність з DoH доводиться платити вдвічі довшим запитом до DNS (50мс vs 25мс) зате провайдеру стає складніше дізнаватися, куди я ходжу. Якщо обʼєднати це з майбутнім впровадженням ESNI то в деяких випадках (сайт за CDN) провайдер не зможе навіть дізнатися ІР адреси кінцевого ресурсу.

Ще один нюанс впроваження стороннього (відносно роутера) DNS в локальній мережі — деякі залізяки не звертають увагу на наявність локального DNS сервера в DHCP і запитують 8.8.8.8 напряму. Хитро, але ми трохи хитріші — будь-які запити на 53й порт, що проходять через роутер але йдуть не до локального DNS сервера, завертаємо (за допомогою NAT) на локальний DNS. В мене це працювало і раніше, але тепер DNS став окремим і правила firewall довелося переписати.
Також роутер щохвилини пінгує локальний DNS і якщо немає відповіді — переключає мережу на використання свого вбудованого DNS. Є ідея не лише пінгувати, але й запитувати адресу домену one.one.one.one

Результат — усі пристрої в мережі мають єдиний чорний список доменів, можна досить легко заблокувати якийсь домен чи призупинити блокування на короткий період (якщо щось не працює).