Meshname як перманентна, енерго-ефективна альтернатива DNS


Давно не користуюсь централізованими реєстраторами доменних імен і де мені дійсно потрібен DNS - користувався Alfis. Утім, ця система побудована з використанням блокчейн і потребує майнингу для пролонгації домену один раз на рік. В умовах поточної енергетичної кризи, це для мене розкіш. Також, останнім часом намагаюсь позбутись голодних до CPU і трафіку P2P процесів, що постійно смикають мережу на предмет синхронізації, та відправляють туди власний знімок блокчейну; приймають участь в криптографічних підписах, тощо.


Alfis DNS - в оновному поширений в мережі Yggdrasil, через свою вбудовану зону .ygg. Через природу end-to-end шифрування трафіку Yggdrasil, його користувачі в основному сидять на HTTP замість HTTPS. Тому якщо з якихось причин ваш домен буде протерміновано - гіпотетично форми логіну можуть бути скомпрометовані через ігнорування і неприязнь користувачів до (само-підписаних) сертифікатів у цій мережі.


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


Нещодавно, в просторі Gemini з'явився локальний клон "Антени":

gemini://bbs.geminispace.org/s/Yggdrasil/40698


В ньому були присутні зокрема опції:

gemini://amaiaswl5p4zyaaaaaaaaadxo4.meship

gemini://amaiaswl5p4zyaaaaaaaaadxo4.meshname


Тому знову згадав про такий варіант "легкого" DNS, враховуючи, що сервер Agate (на відміну від gmid) досі не вміє обробляти сирі IP без проблем з SNI. Вирішив таки встановити і заодно розібратись в архітектурі цього типу DNS


Що таке Meshname


Meshname - це по суті своїй простенький DNS сервер, в оригіналі написаний мовою Go (також має реалізацію на C++) який на відміну від Alfis не маршрутизує через себе усі DNS запити, а лише конвертує адресований йому хост в IP, схоже до сервісів .onion або тунелів .b32.i2p


У цього сервера є дві реалізації протоколу


.meship


Звичайна конвертація адреси IPv6 в бінарний формат і потім - в base32. І навпаки. Детальніше про реалізацію можна почитати тут:


https://github.com/zhoreeq/meshname/blob/master/protocol.md


.meshname


На відміну від .meship (де для резольву потрібен лише локальний meshnamed) використання .meshname - передбачає наявність сервера meshnamed цільовому вузлі. Такий формат потрібен лише у разі, якщо вам потрібні додаткові записи NS, наприклад для серверів XMPP. При такому підході, записи на стороні сервера зберігатимуться в форматі JSON.


Особисто я користуюсь тільки .meship, тому нижче інструкція для нього.


Встановлення


Збірка успішно відбулась на Fedora 43


git clone https://github.com/zhoreeq/meshname.git
cd meshname
make
sudo install meshnamed /usr/local/bin

Встановлення останньої версії Go в Debian


systemd


[Unit]
Description=Distributed naming system for IPv6 mesh networks
Wants=network.target
After=network.target

[Service]
User=nobody
Group=nogroup
ProtectHome=true
ProtectSystem=true
SyslogIdentifier=meshnamed
ExecStart=/usr/local/bin/meshnamed -listenaddr [::1]:53535
Restart=always
TimeoutStopSec=5

[Install]
WantedBy=multi-user.target

https://github.com/zhoreeq/meshname/blob/master/meshnamed.service


resolved


Оригінальна документація передбачає приклад dnsmasq:

https://github.com/zhoreeq/meshname/blob/master/USAGE.md#configure-dnsmasq-as-a-primary-dns-resolver-with-meshname-support


Утім, я скористався іншим підходом:


[Resolve]
DNS=[::1]:53535
Domains=~meshname ~meship

sudo systemctl restart systemd-resolved

dig AAAA aibgruhq2w4i2hi2kvpc62zrja.meship
dig AAAA google.com

Користування


Отримати домен будь-якого IP, наприклад для howto.ygg, можна командою:


$ meshnamed -getname 222:a8e4:50cd:55c:788e:b0a5:4e2f:a92c
airkrzcqzucvy6eowcsu4l5jfq

Таким чином, при активному локальному сервері meshnamed, замість:


http://[222:a8e4:50cd:55c:788e:b0a5:4e2f:a92c]/yggdrasil:dns:meshname


Можна відкрити сайт за адресою:


http://airkrzcqzucvy6eowcsu4l5jfq.meship/yggdrasil:dns:meshname


Інші команди для поточної версії:


meshnamed -help

Якщо на меті є максимально короткі та легкі до запам'ятовування домени, враховуючи майже необмежену кількість адрес Yggdrasil, Mycelium та інших оверлейних IPv6 мереж, можна спробувати згенерувати її один раз майнером, наприклад syg-cpp.


Посилання


https://github.com/zhoreeq/meshname

https://habr.com/ru/post/550688/


Дивіться також


Гілка Agate з підтримкою хостів IPv6

Alfis DNS - реєстрація домену в блокчейн

Специфіка роботи з віртуальними хостами Agate

CRXN, GRE, fastd як альтернатива крипто-садомазохізму



/uk/