# Crab-hole DNS як 100% програмна альтернатива Pi-hole Перед встановленням Pi-hole, я деякий час кружляв довкола низько-рівневих рішень типу hickory-dns: => https://github.com/hickory-dns/hickory-dns Утім, як то кажуть "вмій правильно ставити питання". Знайомтесь: crab-hole - 100% програмна альтернатива Pi-hole; написана мовою Rust, без жодних скриптів і зайвих навісів, без помилок пам'яті та без невизначеної поведінки як бонус. ## Збірка з початкового коду Можливо, вам згодяться інструкції з розгортання середовища Rust: => install-latest-rust-version-on-linux.gmi Встановлення останньої версії Rust в Linux Встановлення crab-hole типове для Cargo: ``` bash git clone https://github.com/LuckyTurtleDev/crab-hole.git cd crab-hole cargo build --release sudo install target/release/crab-hole /usr/local/bin ``` ## Налаштування Я спочатку створив окремого юзера без домашньої теки, але демон стандартно дивитиметься саме туди: ``` bash sudo useradd -s /usr/sbin/nologin -mr crabhole ``` Тестовий запуск від користувача `crabhole` в CLI: ``` bash sudo -u crabhole crab-hole ``` Мій файл конфігурації, який я все ж замість `/.config/crab-hole/config.toml` поклав до системної теки "глобального рівня": ``` /etc/crab-hole.toml [blocklist] include_subdomains = true lists = [ # стандартні "https://raw.githubusercontent.com/StevenBlack/hosts/master/alternates/fakenews-gambling-porn/hosts", "https://s3.amazonaws.com/lists.disconnect.me/simple_tracking.txt", # додані мною "https://raw.githubusercontent.com/braveinnovators/ukrainian-security-filter/main/lists/hosts.txt", "https://phishing.army/download/phishing_army_blocklist.txt", # на запас #"https://raw.githubusercontent.com/hagezi/dns-blocklists/main/adblock/multi.txt", #"https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts", #"https://raw.githubusercontent.com/ukrainianfilters/lists/main/combined/combined.txt", #"file:///blocked.txt" ] # список виключень для `list` allow_list = [ #"file:///allowed.txt" ] # опціональний json/api, сюди можна підключити імпровізовану Веб-адмінку або статистику [api] port = 8053 listen = "127.0.0.1" # опціонально, може смикати зовнішні ресурси # show_doc = true # опціонально, якщо не localhost # обов'язково, якщо планується запит до `/all_stats.json?key=1234` admin_key = "1234" # резольвери в мене дивляться на локалхост [[downstream]] protocol = "udp" listen = "[::1]" port = 5354 [[downstream]] protocol = "udp" listen = "127.0.0.1" port = 5354 # яким провадером відбувається резольв (вказати можна декілька для різних протоколів) [[upstream.name_servers]] socket_addr = "1.1.1.1:853" protocol = "tls" tls_dns_name = "1dot1dot1dot1.cloudflare-dns.com" trust_negative_responses = false ``` Як бачимо, на відміну від pi-hole - все вміщається в лічені рядки одного валідного конфігу, який до речі можна перевірити перед запуском: ``` bash sudo -u crabhole crab-hole validate-lists ``` ## Системний сервіс На останок, systemd: ``` /etc/systemd/system/crab-hole.service [Unit] Description=🦀 Pi-Hole clone written in rust using hickory-dns/trust-dns After=network-online.target Wants=network-online.target [Service] User=crabhole Group=crabhole WorkingDirectory=/home/crabhole ExecStart=/usr/local/bin/crab-hole Restart=always # щоб запис журналу не сильно мучив SSD - вказуємо рівень `warn` Environment="RUST_LOG=warn" # прибираємо зайве форматування кольором з системних журналів Environment="NO_COLOR=1" # канонічне розташування для запобігання помилок `permission denied`: # `sudo mkdir /var/log/crab-hole` # `sudo chown crabhole:crabhole /var/log/crab-hole` StandardOutput=file:///var/log/crabhole/debug.log StandardError=file:///var/log/crabhole/error.log [Install] WantedBy=multi-user.target ``` ## Користування Щоб системний резольвер звертався на кастомний порт 5354/UDP, наведу приклад з попереднього матеріалу для Fedora 43: ``` /etc/systemd/resolved.conf [Resolve] DNS=127.0.0.1:5354 Domains=~. # блокувати запити, якщо crab-hole DNS не доступний (лишити порожнім) # FallbackDNS= ``` Тепер потрібно перезавантажити службу: ``` bash sudo systemctl restart systemd-resolved ``` Переглянути статус: ``` bash resolvectl status ``` ### Веб-інтерфейс На відміну від Pi-hole, мультяшної Веб-адмінки тут немає. Можливо, знову погано шукав, але мені цілком достатньо одного тільки звіту в JSON, щоб не ходити в логи: => http://127.0.0.1:8053/all_stats.json?key=1234 * `?key=1234` це `admin_key = "1234"` ``` json { "blocked_request":7, "blocklist_len":302543, "running_since":"2026-03-15T15:57:45.07231615Z", "total_request":41 } ``` ## Дивіться також => pi-hole-manual-install-on-fedora-linux.gmi Ручне встановлення Pi-hole DNS на прикладі Fedora / Linux