add crab-hole-as-pi-hole-alternative-in-rust.gmi

This commit is contained in:
postscriptum 2026-03-15 19:31:10 +02:00
parent f60c1eccf5
commit 65ee776dcc
3 changed files with 188 additions and 1 deletions

View file

@ -0,0 +1,179 @@
# Crab-hole DNS як 100% програмна альтернатива Pi-hole
Перед встановленням Pi-hole, я деякий час кружляв довкола низько-рівневих рішень hickory-dns:
=> https://github.com/hickory-dns/hickory-dns
Утім, як то кажуть "вмій правильно ставити питання" до Google.
Знайомтесь: 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

View file

@ -17,6 +17,7 @@
### Нотатки
=> crab-hole-as-pi-hole-alternative-in-rust.gmi 2026-03-15 Crab-hole DNS як 100% програмна альтернатива Pi-hole
=> pi-hole-manual-install-on-fedora-linux.gmi 2026-03-14 Ручне встановлення Pi-hole DNS на прикладі Fedora / Linux
=> install-ergo-irc-server-in-linux.gmi 2026-03-14 Встановлення IRC сервера Ergo в Linux
=> left-oriented-close-tab-button-in-firefox.gmi 2026-03-12 Ліво-стороння орієнтація кнопки "закрити вкладку" в Firefox

View file

@ -201,6 +201,9 @@ WantedBy=multi-user.target
``` /etc/systemd/resolved.conf
[Resolve]
DNS=127.0.0.1:5354
Domains=~.
# блокувати запити, якщо pi-hole DNS не доступний (лишити порожнім)
# FallbackDNS=
```
Тепер потрібно перезавантажити службу:
@ -258,4 +261,8 @@ sudo pihole -g
Чесно кажучи, з цими кущами-хащами bash, я розчарувався в даному рішенні. Навіть, якщо в Pi-hole вгепано багато зусиль сісадмінів, що звикли спілкуватись з компом переважно мовою препроцесору і текстових конфігів. Для мене це не стабільність, не передбачувана поведінка через відсутність типізації і логічних помилок; залежність від контейнера.
Оскільки мені головою (замість процесора) переварювати цей баш в сирому вигляді і на живій системі не цікаво, шукатиму якесь інше рішення (див. crab-hole) а досвід - хай лишається на замітку.
Оскільки мені головою (замість процесора) переварювати цей баш в сирому вигляді і на живій системі не цікаво, шукатиму якесь інше рішення (див. crab-hole) а досвід - хай лишається на замітку.
## Дивіться також
=> crab-hole-as-pi-hole-alternative-in-rust.gmi Crab-hole DNS як 100% програмна альтернатива Pi-hole