Crab-hole DNS як 100% програмна альтернатива Pi-hole


Перед встановленням Pi-hole, я деякий час кружляв довкола низько-рівневих рішень типу hickory-dns:

https://github.com/hickory-dns/hickory-dns


Утім, як то кажуть "вмій правильно ставити питання".


Знайомтесь: crab-hole - 100% програмна альтернатива Pi-hole; написана мовою Rust, без жодних скриптів і зайвих навісів, без помилок пам'яті та без невизначеної поведінки як бонус.


Збірка з початкового коду


Можливо, вам згодяться інструкції з розгортання середовища Rust:

Встановлення останньої версії Rust в Linux


Встановлення crab-hole типове для Cargo:


git clone https://github.com/LuckyTurtleDev/crab-hole.git
cd crab-hole
cargo build --release
sudo install target/release/crab-hole /usr/local/bin

Налаштування


Я спочатку створив окремого юзера без домашньої теки, але демон стандартно дивитиметься саме туди:


sudo useradd -s /usr/sbin/nologin -mr crabhole

Тестовий запуск від користувача `crabhole` в CLI:


sudo -u crabhole crab-hole

Мій файл конфігурації, який я все ж замість `/.config/crab-hole/config.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 - все вміщається в лічені рядки одного валідного конфігу, який до речі можна перевірити перед запуском:


sudo -u crabhole crab-hole validate-lists

Системний сервіс


На останок, systemd:


[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:


[Resolve]
DNS=127.0.0.1:5354
Domains=~.
# блокувати запити, якщо crab-hole DNS не доступний (лишити порожнім)
# FallbackDNS=

Тепер потрібно перезавантажити службу:


sudo systemctl restart systemd-resolved

Переглянути статус:


resolvectl status

Веб-інтерфейс


На відміну від Pi-hole, мультяшної Веб-адмінки тут немає. Можливо, знову погано шукав, але мені цілком достатньо одного тільки звіту в JSON, щоб не ходити в логи:


http://127.0.0.1:8053/all_stats.json?key=1234


{
    "blocked_request":7,
    "blocklist_len":302543,
    "running_since":"2026-03-15T15:57:45.07231615Z",
    "total_request":41
}

Дивіться також


Ручне встановлення Pi-hole DNS на прикладі Fedora / Linux



/uk/