mirror of
https://codeberg.org/postscriptum/gemlog.git
synced 2026-04-01 21:25:27 +00:00
181 lines
No EOL
6 KiB
Text
181 lines
No EOL
6 KiB
Text
# 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 |