Мій пресет Alfis DNS на роутері Yggdrasil / Mycelium

Я тут знову примудрився грохнути операційну систему, тому довелося піднімати конфіги руками. Цього разу, вирішив створити нотатку, щоб не обмірковувати все спочатку кожного разу коли партачу з системою.

Отже, Alfis DNS в мене крутиться на окремому девайсі ARM, який слугує спільним резольвером для звичайних доменів Інтернет а також внутрішніх `.ygg`, `.srv` тощо. Для синхронізації блокчейну, тут використовуються оверлейні мережі Yggdrasil і Mycelium. Таким чином, цей роутер виступає у якості проксуючого DNS на всі локальні девайси, що до нього підключаються - тобто я не ставлю Alfis на всі клієнти але користуюся резольвом доменних зон через спільний сервер, що поєднує собою усі альтернативні напрямки. Також цей роутер підтримує саму мережу Alfis, виступаючи для неї у якості публічного піра (для шейрингу блокчейн та обміну DHT)

Оскільки мій резольвер не взаємодіє з пірами Інтернет (хоча така опція там є стандартною), мій пресет також передбачає особистий форк до PR#386, який додатково включає комбіновані правила фільтрації вихідних з'єднань на Yggdrasil і Mycelium (в оригіналі там тільки опція Yggdrasil) - будьте уважні, бо конфіг тут також відрізнятиметься!

Роутер

Я встановлюю редакцію Alfis зі свого репозиторію з патчем, який досі вісить в PR:

git clone https://github.com/YGGverse/Alfis.git && cd Alfis
git checkout mycelium-network-mode
cargo build --release --no-default-features
install target/release/alfis /usr/local/bin/alfis

Далі створюю окремого юзера, так як не планую пускати від рута (на системних портах)

useradd -m alfis

Конфігурація

Створюю файл конфігурації /etc/alfis.toml наступного змісту:

# сід-блок, лишаємо як є, якщо він не відрізняється від оригіналу мережі
# https://github.com/Revertron/Alfis/blob/master/alfis.toml#L2
origin = "0000001D2A77D63477172678502E51DE7F346061FF7EB188A2445ECA3FC0780E"

# шляхи до ключів: на роутері я не адмініструю домени, тому просто коментую
key_files = [
#"key1.toml", "key2.toml", "key3.toml", "key4.toml", "key5.toml"
]

# скільки блоків перевіряти на старті - лишаю стандартно
check_blocks = 8

# налаштування мережі
[net]
# вузли ініціації: коментую стандартні бо не довіряю Інтернет-доменам,
# лишаю тільки пачку відомих мені вузлів (але з часом вони можуть втратити свою актуальність)
peers = [
        #"peer-v4.alfis.name:4244", "peer-v6.alfis.name:4244", "peer-ygg.alfis.name:4244"
        "[200:f8e5:2383:c1f8:7c73:8e74:2a5e:197e]:4244",
        "[200:f8e5:2383:c1f8:7c73:8e74:2a5e:197e]:4244",
        "[200:31b6:1c3a:3a1c:d322:3ed7:e109:4b3]:4244",
        "[200:1106::a702:9841:e607:9b3]:4244",
        "[208:84:68:55:2f91:8484:8d60:2fca]:4244",
        "[208:25:40:bd:6ea9:89fc:ac75:87be]:4244",
        "[208:62:45:62:59b8:f1a2:62ca:f87c]:4244",
        "[225:ca89:40a8:611e:78b8:ab81:999a:d4d7]:4244",
        "[301:84f7:4bc0:2f3a::53]:4244"
]

# слухаю з'єднання на всіх IPv6 бо користуюсь Yggdrasil / Mycelium а від провайдера Інтернет на цьому інтерфейсі немає
listen = "[::]:4244"

# цією опцією долучаюсь до підтримки мережі (обмін DHT і блокчейн даними)
public = true

# опція з мого патчу: дозволяю вихідні з'єднання тільки на мережу Mycelium
mycelium_mode = true

# аналогічно для Yggdrasil
yggdrasil_mode = true

[dns]
# резольвер слухатиме клієнтів на IPv4 інтерфейсі
listen = "0.0.0.0:5353"

# скільки потоків виділяти для резольву DNS
threads = 10

# для Інтернет-резольву я користуюсь клаудфлейр бо він швидкий, ви можете обрати собі інший
forwarders = [
"1.1.1.1:53"
]

# тут здається воно використовується якщо ви збирались з флагом --features="doh" (але я не перевіряв)
bootstraps = ["9.9.9.9:53", "94.140.14.14:53"]

# не знаю, чому закоментив, лишаю оригінальний комент:
# Hosts file support (resolve local names or block ads)
# hosts = ["system", "adblock.txt"]

[mining]
# кількість потоків CPU для майнингу (якщо використовується)
threads = 2

# понизити пріоритет для операцій майнингу (якщо використовується)
lower = true

systemd

Додаю конфігурацію /etc/systemd/system/alfis.service на основі оригінального файлу:

[Unit]
Wants=network.target
After=network.target

[Service]
User=alfis
Group=alfis

# закоментив бо я переїхав в домашню теку юзера
# ProtectHome=true
ProtectSystem=true

SecureBits=keep-caps
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_BIND_SERVICE

SyslogIdentifier=alfis
WorkingDirectory=/home/alfis
ExecStart=/usr/local/bin/alfis -n -c /etc/alfis.toml

# цю опцію можливо є сенс закоментити але лишив як в оригіналі
ExecReload=/bin/kill -HUP $MAINPID

# це закоментив бо хай краще не працює аніж ребутається втіхаря
# Restart=always
# TimeoutStopSec=5

StandardOutput=file:///home/alfis/debug.log
StandardError=file:///home/alfis/error.log

[Install]
WantedBy=multi-user.target

Фаєрвол

На роутері в мене Debian, тому додаю правила через ufw:

ufw allow from 0200::/7 to any port 4244
ufw allow from 0400::/7 to any port 4244
ufw allow from xx:xx:xx:xx to any port 5353 proto udp

Клієнт

На клієнті в мене Fedora, тому нижче інструкції для неї (для Ubuntu додам згодом, бо поки не під рукою для перевірки)

#/etc/systemd/resolved.conf
[Resolve]
DNS=xx.xx.xx.xx:5353
#FallbackDNS=1.0.0.1 8.8.4.4
#Domains=~.
LLMNR=no
MulticastDNS=no
#DNSSEC=yes
#Cache=yes

[Network]
DNSStubListener=no

Тут, теоретично можна (і було б зручно) змінити налаштування в GUI менеджері з'єднань GNOME, але в мене він не підтримує параметр порту - хоче 53 (пустий) а його я не хочу пускати на роутері. Тому таке рішення з resolved.conf

Посилання

Веб-версія цієї публікації з коментарями на DevZone