gemlog/public/uk/crab-hole-as-pi-hole-alternative-in-rust.gmi
2026-03-15 19:40:57 +02:00

181 lines
No EOL
6 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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"
]
# allow domains blocked by the blocklist again
allow_list = [
#"file:///allowed.txt"
]
# optional
[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