diff --git a/public/uk/crab-hole-as-pi-hole-alternative-in-rust.gmi b/public/uk/crab-hole-as-pi-hole-alternative-in-rust.gmi new file mode 100644 index 0000000..df0a801 --- /dev/null +++ b/public/uk/crab-hole-as-pi-hole-alternative-in-rust.gmi @@ -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 \ No newline at end of file diff --git a/public/uk/index.gmi b/public/uk/index.gmi index b43ce6a..d7618bd 100644 --- a/public/uk/index.gmi +++ b/public/uk/index.gmi @@ -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 diff --git a/public/uk/pi-hole-manual-install-on-fedora-linux.gmi b/public/uk/pi-hole-manual-install-on-fedora-linux.gmi index ab09ab7..177df38 100644 --- a/public/uk/pi-hole-manual-install-on-fedora-linux.gmi +++ b/public/uk/pi-hole-manual-install-on-fedora-linux.gmi @@ -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) а досвід - хай лишається на замітку. \ No newline at end of file +Оскільки мені головою (замість процесора) переварювати цей баш в сирому вигляді і на живій системі не цікаво, шукатиму якесь інше рішення (див. crab-hole) а досвід - хай лишається на замітку. + +## Дивіться також + +=> crab-hole-as-pi-hole-alternative-in-rust.gmi Crab-hole DNS як 100% програмна альтернатива Pi-hole \ No newline at end of file