Публичный пир

Публичным пиром сети называется устройство, к которому в оверлейном режиме может подключиться любой желающий. Проще говоря: узел сети, к которому можно подключиться через Интернет и соединиться таким образом с глобальным сегментом сети Yggdrasil. Список публичных пиров доступен в официальном репозитории проекта «Public Peers»: https://github.com/yggdrasil-network/public-peers, а так же по адресам:

- https://publicpeers.neilalexander.dev/
- http://[319:3cf0:dd1d:47b9:20c:29ff:fe2c:39bd]/ (внутрисетевое зеркало)

Список на сайте генерируется автоматически на базе информации с GitHub и имеет статус доступности узлов (online/offline).

Публичные пиры, к которым вы хотите быть подключены, прописываются в файле конфигурации yggdrasil.conf (/etc/yggdrasil.conf или %programdata%\yggdrasil\yggdrasil.conf) в секции Peers:

Peers: [
    # Чехия, Revertron
    tcp://195.123.245.146:7743
    # netherlands
    tcp://51.15.118.10:62486
]

Комментарии не обязательны, но они могут пригодиться.

TLS

Начиная с версии 0.3.11 Yggdrasil поддерживает соединения по протоколу TLS. Это позволяет скрыть пиринговое соединение внутри обычного сеанса TLS, что в некоторых случаях может помочь обойти брандмауэр или фильтры DPI, блокирующие пиринговый трафик Yggdrasil.

Публичные пиры, поддерживающие TLS идентифицируются префиксом tls:// вместо tcp://.

Обратите внимание, что из-за дополнительного уровня шифрования производительность через одноранговые узлы TLS может быть немного хуже, чем через обычные одноранговые узлы tcp://.

QUIC

Начиная с версии 0.5 RC1 Yggdrasil поддерживает соединения по протоколу QUIC.

Публичные пиры, поддерживающие QUIC идентифицируются префиксом quic://.

На данный момент, использование QUIC в Yggdrasil не даёт каких-либо преимуществ, передача данных по этому протоколу может быть даже медленнее, чем при использовании других протоколов.

На текущий момент (18 декабря 2023 года) мониторилка QUIC на сайте https://publicpeers.neilalexander.dev/ работает неправильно, поэтому ориентироваться на неё нельзя (подтверждено самим neilalexander)

Unix socket

В версии Yggdrasil 0.4.5 появилась возможность пиринга с использованием Unix сокетов. Это не вполне релевантно статье о публичных пирах, т.к., Unix сокеты можно использовать только на одной машине, но тем не менее, об этом стоит упомянуть и здесь.

Эту возможность можно использовать в случае запуска Yggdrasil на одной машине с использованием средств виртуализации или с разделением по network namespaces, или, например, для соединения Yggdrasil c Yggmail.

Для использования пиринга через Unix сокет можно прописать в секцию Peers конфигурационного файла такую строку: unix:///path/to/socket.sock

Пример:

В конфигурационном файле Yggdrasil, в секции Listen прописываем:

Listen:
    [
      tcp://192.168.1.2:23485
      unix:///var/run/yggdrasil.sock
    ]

Таким образом к нашему пиру можно будет подключиться по IP 192.168.1.2, на порт 23485 и через Unix сокет по пути /var/run/yggdrasil.sock

Yggmail теперь можно запускать так:

yggmail -peer=unix:///var/run/yggdrasil.sock -database=/home/USER/mail/yggmail.db -smtp=192.168.1.2:1025 -imap=192.168.1.2:1143

Как выбрать публичные пиры

Для обычного домашнего использования разработчики рекомендуют прописывать в конфигурационном файле 2-3 географически ближайших к вам публичных пира. Слишком большое количество пиров в конфигурационном файле, а так же, использование географически удаленных от вас пиров может нагативно сказаться на производительности узла и скорости доступа к ресурсам сети.

Для выбора пиров, во-первых можно просто воспользоваться упомянутым выше сайтом, на котором собраны все публичные пиры с offline / online статусами.

Ниже перечислены средства автоматизации процесса выбора пиров.

Yggdrasil peers updater

Утилита предназначена для проверки доступности пиров и автоматического их обновления в конфигурационном файле Yggdrasil, а так же, с помощью метода admin API - addPeer.

Для вывода отсортированного по скорости доступа списка доступных пиров используется флаг -p.

С другими параметрами можно ознакомиться из описания (RU): https://github.com/ygguser/peers_updater/blob/master/README_ru.md

Скрипт на python

zhoreeq разработал скрипт, который в отсортированном виде выводит информацию о времени отклика пиров, его можно использовать при выборе пиров для своего конфигурационного файла (необходимо наличие установленного python3):

Клонируем репозиторий с публичными пирами:

git clone https://github.com/yggdrasil-network/public-peers.git

Клонируем репозиторий со скриптом:

git clone https://github.com/zhoreeq/peer_checker.py.git

Запускаем скрипт (параметром указывается каталог с публичными пирами):

python ./peer_checker.py/peer_checker.py ./public-peers/

Пример вывода скрипта:

Dead peers:

tcp://[2a04:5b81:2010::90]:2000 	 africa/south-africa.md
tcp://[2804:49fc::ffff:ffff:5b5:e8be]:58301 	 south-america/brazil.md
...

Alive peers (sorted by latency):

URI 	 Latency (ms) 	 Location
tcp://95.165.99.73:5353 	 6.679 	 europe/russia.md
tcp://yggno.de:18226 	 16.892 	 europe/russia.md
...

Как стать публичным пиром?

Любой желающий может стать публичным пиром. Для этого, чтобы другие пользователи могли подключиться к вашему узлу, как к публичному пиру, необходимо иметь прямой доступ в Интернет (белый IP). Также крайне желательно использовать для пиринга весьма производительное «железо» и широкий сетевой канал. Производительность сервера важна при больших нагрузках, т.к. нативные криптографические операции сети весьма требовательны и в случае недостатка мощности в работе пира будут возникать сбои. В настройках файерволла операционной системы необходимо открыть порт, который будет прослушивать Yggdrasil (любой, на ваше усмотрение).
В файле конфигурации Yggdrasil добавляем в поле Listen:

  Listen: [
  # Для прослушивания всех IPv4 интерфейсов на порту 7991
  tcp://0.0.0.0:7991 
  # Для прослушивания всех IPv6 интерфейсов на порту 7992
  tcp://[::]:7992
  ]

По-желанию, адрес своего узла можно опубликовать на упомянутой выше странице проекта в GitHub, либо просто поделиться им с друзьями.

Приоритеты

В Yggdrasil версии 0.4.6 появилась возможность задать приоритеты для соединения с одним и тем же узлом, если у узла несколько интерфейсов. Приоритет указывается с помощью параметра URI пира ?priority=X в секциях Peers или Listen, или c помощью параметра Priority в секции MulticastInterfaces.

Приоритет — это число из диапазона от 0 до 254 (по умолчанию 0), чем ниже значение, тем выше приоритет.

Handshake c паролем

Начиная с версии 0.5 RC1 можно использовать «рукопожатие» с дополнительным паролем.

Пример:

Для секции Listen: tls://[::]:12345?password=123456abcdef
Для секции Peers: tls://a.b.c.d:12345?password=123456abcdef

Так же, пароль допустимо использовать в секции MulticastInterfaces.

Максимальная допустимая длина пароля - 64 символа.

Особые замечания

0. Не забудьте перезапустить службу Yggdrasil, чтобы изменения вступили в силу:

  # Debian/Ubuntu:
sudo systemctl restart yggdrasil
  # Windows:
net.exe stop "Yggdrasil Service" && net.exe start "Yggdrasil Service"

1. Другие частники сети будут считаться подключенными локально, будто они с вами в одной локальной сети. Учитывайте это при настройке безопасности.
2. Редактируя файл конфигурации в Windows, не используйте стандартный блокнот и Office Word. Это испортит кодировку файла и служба Yggdrasil не сможет запуститься. Для редактирования конфига в Windows следует использовать текстовые редакторы вроде AkelPad, Notepad2 и NotePad++.

Ссылки

Публичные пиры (EN): https://github.com/yggdrasil-network/public-peers
Yggdrasil peer checker (EN): https://github.com/zhoreeq/peer_checker.py

Обсуждение

d4708, 2022/05/25 19:15, 2022/05/25 19:17
Прежде всего, благодарность автору и всем участникам за столь подробный сборник документации!

Раскройте, пожалуйста, вопрос безопасности по данному замечанию:
"Все подключенные пиры будут считаться подключенными локально, будто они с вами в одной локальной сети. Учитывайте это при настройке безопасности."

Как регулярный пользователь, насколько я понимаю:

1. Это касается только нод с открытым портом или портами в секции Listen;
2. Если на этой машине запущен например, сервер MySQL или иная другая служба, доступ к которой по-умолчанию ограничен по localhost, эти настройки должны быть изменены? Или это касается только локального пространства адресов / внутренней сети устройств Yggdrasil? То есть может ли стороннее подключение иметь доступ к локальным службам текущего сервера;
3. Также вопрос проксирования, но насколько понимаю, подключенные узлы Yggdrasil ограничены для выхода в сеть интернет через публичный пир?

Спасибо!

newbie, 2022/05/25 20:28, 2022/05/25 20:29
1. Это касается всех, кто установил у себя Yggdrasil c подключением через tun-интерфейс и прописал публичные пиры (т.е., подключился к "глобальной" сети Yggdrasil).
2. То, что запущено на localhost (127.1 или ::1/128) напрямую доступно не будет, но если другие сервисы будут доступны по адресу на tun-интерфейсе Yggdrasil, это [потенциально] может быть угрозой и тому, что на localhost. Поэтому стоит перевесить сервисы, которые не должны быть доступны через Yggdrasil, и/или настроить файервол.
3. Для выхода в интернет через Yggdrasil могут быть использованы узлы, которые соответствующим образом настроены, например, там может быть GRE/IPIP-туннель или прокси-сервер.

Для того, чтобы проверить, что у вас доступно на адресе Yggdrasil для всей сети Yggdrasil можно использовать nmap (nmap -6 -Pn <Yggdrasil_ipv6_addr>). Ну, или погуглите, на тему "как узнать открытые порты в <windows|ubuntu|debian>".

d4708, 2023/09/19 22:48, 2023/09/19 22:49
У меня как-бы все порты закрыты, кроме открытых явно. Так понимаю, что доступа к локальным службам 0.0.0.0 при закрытых портах iptables нет.

За информацию спасибо (без RSS ответ увидел не сразу)

d4708, 2023/09/19 22:52, 2023/09/19 22:53
Перекочевав из темы торрент раздач, стали интересны способы ограничения трафика (объема и/или скорости) для публичных пиров, работающих в сфере файлообмена.
Не сейчас, но было бы интересно почитать как это лучше организовать, например балансировка между подключениями или просто лимит на процесс. Насколько понимаю, конфигурация Yggdrasil этого не предусматривает.

newbie, 2023/09/20 20:56
Для установки лимита на процесс Yggdrasil можно попробовать использовать trickle.

C помощью tc из iproute2 можно на интерфейсах ограничения настраивать. Есть удобная обертка над tc - wondershaper.

Fyodor Ustinov, 2023/09/21 07:24
Оператор ноды, который ставит лимиты на транзитный трафик - будет гореть в аду. Ygg и так через анус работает, а ты предлагаешь на транзитном узле ухудшать связность (которая никак не отслеживается при построении роутинга, и, в результате, ты можешь сделать плохо всем).
Не хочешь иметь транзитный трафик? Подключайся только к одному узлу. Точка.

Thunar, 2023/09/21 11:14, 2023/09/21 11:30
В целом, да, ограничения пропускной способности на узлах будет скорее вредным для сети. Лучше ограничить пропускную способность для конкретного сервиса (файлообменного в этом случае), если такая необходимость есть.

d4708, 2023/09/21 13:52, 2023/09/21 14:00
Здесь даже не столько ограничение для всей сети, сколько в случаях, когда один узел может исчерпать потенциально 99% пропускной способности сервера. Потенциально - такое может быть. Таким образом, гореть в аду будет не администратор транзита а подключаемые к нему юзеры)

Установить пропорционально равный лимит между количеством узлов (при текущем количестве подключений, 10 мБит разве мало) или временно ограничивать нагрузку при выходе из квоты для конкретного подключения (через getPeers эта статистика имеется), имеет место быть. Это вопрос времени, видимо еще небыло прецедентов.

d4708, 2023/09/21 14:14
К стати, по поводу ограничений - тоже как посмотреть, например, чтобы попасть в список нод invidious нужно еще соответствовать ряду требований:
https://github.com/iv-org/documentation/blob/master/docs/instances.md#rules-to-have-your-instance-in-this-list

))

newbie, 2023/09/21 14:24
Ну, в случае с Yggdrasil ничего подобного нет. Нет никаких проверок и контроля, любой желающий может создать PR в репозиторий с публичными пирами и опубликоваться. А что там у него "под капотом" - никто не знает.

Можно запилить скриптик, который со случайным интервалом будет тестить подключения ко всем пирам последовательно и формировать список, ранжированный по оценкам, которые будут рассчитываться с учетом uptime, пропускной способности и т.п. Но кому-то этим надо заняться...

Evgeny, 2023/09/21 11:18
Вредного от ограничения пропуска не вижу.
Это же распределенная сеть, значит нужно большее кол-во нод.

Fyodor Ustinov, 2023/09/21 14:10
У yggdrasil роутинг выбирается по количеству хопов. Только. Исключтельно. Т.е. если если Вы умудрились соеденить через себя два узла так, что через вас стал кратчайший путь - трафик пойдёт через вас. Если Вы начнёте ограничивать транзитный трафик - вы ограничите _весь_ транзитный трафик (у Вас нет никакой возможности определить что через вас ходит и на этом основании по разному ограничивать - транзитный трафик шифрованный).

d4708, 2023/09/21 14:28, 2023/09/21 14:29
Можно ламерский вопрос?

То что делать лимиты на сервис yggdrasil - это плохо, а если ограничивать для конкретного узла при выходе из квоты, полученной из статистики байтов в getPeers (т.е. по IP)

Здесь же не столько ограничить сколько защита от потенциальной атаки, потому что публичных узлов не так и много

newbie, 2023/09/21 14:31
IMHO: лучше лимитирование/квотирование применять к конкретному сервису: nginx, transmission или что там еще может быть...

d4708, 2023/09/21 14:37, 2023/09/21 14:41
У меня лично нет таких требовательных сервисов включая прокси, даже с учетом файлового сида (там свои лимиты на количество подключений и трафик) но может быть транзитное подключение Yggdrasil, которое повесит канал. А что в этом канале не известно - какой порт, сервис и тд, здесь только адрес и суммарный трафик сессии имеется.

То есть в теории можно лимитировать на конкретный узел, я только не совсем понимаю, но вроде как лимит затронет только этот узел или входящий трафик к нему, поэтому не понял при чем тут хопы (конечно если договорились не ставить общий лимит на сервис Yggdrasil и тд)

Fyodor Ustinov, 2023/09/21 14:49
Применять лимиты на трафик "к конкретному сервису" можно только у себя. Со своим трафиком можно делать что угодно. Разговор идёт про транзитный. В транзитном трафике ты не знаешь ни от кого он, ни кому он, ни что там внутри. Максимум что известно - "трафик пришёл вот от того пира и уйдёт вон тому". Всё.

Т.е. грубо говоря - на интерфейсе tun ты можешь делать что твоей душе угодно, это твой трафик. Что либо делать с трафиком ygg на "внешних" интерфейсах - это очень-очень плохая идея.

Fyodor Ustinov, 2023/09/21 14:44
Невозможно узнать - этот трафик, который ты получил/отправил конкретному пиру - это его трафик или он точно такая-же транзитная нода. Точнее - узнать можно, если хозяин этого пира тебе скажет - "ты у меня единственный линк, больше линков у меня нет вобще ни с кем".

d4708, 2023/10/29 18:42
С выходом 0,5 изучил внимательно рост карты сети с нуля и дошло наконец-то :)
http://[21e:e795:8e82:a9e2:ff48:952d:55f2:f0bb]/#201:23b4:991a:634d:8359:4521:5576:15b7

Да, действительно урезав трафик для одного узла, можно застопорить целую ветку сети.
Интересно, в каких случаях и когда участники такой полу-живой ветки перестроятся если допустим кто-то все же ограничит канал или просто будет перегружен?

d4708, 2023/10/29 18:57, 2023/10/29 18:58
Вообще, раньше считал что участники сети формируют связи p2p напрямую, после нахождения узла, как в DHT Bittorrent. Но не учел что по причине подключения поверх интернет узлов, создается транзитная связь - тогда действительно подключение через интернет скорее временный инструмент

Fyodor Ustinov, 2023/10/29 19:08
Транзитная связь может оказаться и без интернета. Если между узлами А и Б нет связности "по любой причине" - они начнут обмениваться пакетами через другие узлы. (И для еще большего понимания - в yggdrasil выбирается самый короткий путь. Всегда. Не самый быстрый или не самый нагруженный. Только самый короткий)

d4708, 2023/12/18 00:06
Хочу добавить к публичному пиру IPv6, на сервере он есть, добавил соответственно в список tls://[2a02:7aa0:4000::f2]:4708

Позже заметил, что его нет в списке, админ сервера говорит адрес правильный, но нужно настраивать.

Добавил маску подсети из (ifconfig lo inet6 add 2a02:7aa0:5000::4708) - tls://[2a02:7aa0:5000::4708]:4708 - не работает, как и другой нужный мне сервис тоже.

Что я забыл еще сделать? Порт 4708 открыт, публичный пир нормально работает с IPv4


Ответ моего хостера:

2a02:7aa0:4000::f2 is IPv6 for your server, which you can use.

Please configure IPv6 manually.

GW for your IPv6 is: 2a02:7aa0:5000::1
Netmask 64

newbie, 2023/12/18 00:33, 2023/12/18 12:14
# ping -6 2a02:7aa0:4000::f2
PING 2a02:7aa0:4000::f2(2a02:7aa0:4000::f2) 56 data bytes
From 2a00:c68:1:1::2 icmp_seq=1 Destination unreachable: Address unreachable
From 2a00:c68:1:1::2 icmp_seq=9 Destination unreachable: Address unreachable
^C
--- 2a02:7aa0:4000::f2 ping statistics ---
14 packets transmitted, 0 received, +2 errors, 100% packet loss, time 13238ms


У вас IPv6 не сконфигурирован. Пропишите адрес на интерфейс.
В зависимости от дистрибутива: либо в network/interfaces, либо netplan.

GW - это гейтвэй (шлюз по-умолчанию должен быть).

https://ztv.su/knowledgebase/35/nastroika-ipv6-na-vps-vo-frantcii-i-kanade.html

d4708, 2023/12/18 23:33, 2023/12/18 23:33
Спасибо за ссылки, разбираюсь..

Если бы не другой нужный мне сервис на IPv6 можно было подумать что не настроен LISTEN
Listen: [
tls://0.0.0.0:4708
# tls://[::]:4708
]

Для IPv6 ничего небыло указано, в общем добавил, ребутнул yggdrasil - порт слушает
netstat -tulpn | grep LISTEN
tcp6 0 0 :::4708 :::* LISTEN 308191/yggdrasil

Чуть оффтоп, но я закомментил директиву tls://[::]:4708 ребутнул через service yggdrasil restart но порт все равно слушает.
Может не тот сервис ребутнул или как оно работает на этом порту если настройки отключены

Fyodor Ustinov, 2023/12/18 23:39
https://github.com/golang/go/issues/48723
d4708, 2023/12/18 23:51
И еще один момент интересующий, на вскидку (может дополним отдельным разделом)

В списке public-peers есть адреса вида tcp://[xxxx:xxxx:x:xx::]:порт
Насколько понимаю, это сделано для удобства клиентов - т.к. они могут динамически выбрать адрес или подключаться к нескольким сразу

Fyodor Ustinov, 2023/12/19 00:08
Всмысле? Или тебя смущает то, что на конце адреса стоит просто "::"? Так это просто сокращённая надпись, что бы кучу нулей не писать. Т.е. "xxxx:xxxx:x:xx::" просто эквивалентно "xxxx:xxxx:000x:00xx:0000:0000:0000:0000" и только. Ничего выбрать тут нельзя.

d4708, 2023/12/19 00:24, 2023/12/19 00:26
Ой точно, перемудрил так как напомнило маску [::]
Fyodor Ustinov, 2023/12/19 00:54
Кстати, мне всегда было интересно, что изначально имелось в виду под данным пунктом:
"1. Все подключенные пиры будут считаться подключенными локально, будто они с вами в одной локальной сети. Учитывайте это при настройке безопасности."

d4708, 2023/12/19 01:04, 2023/12/19 01:07
Если открыт порт на 0.0.0.0 то смогут запустить принтер, смотреть сайты в разработке на локалхосте и тд

Даже если "это не цель yggdrasil" то считаю правильным добавить whitelist портов из коробки иначе это огромная дырка (точнее тунель) в безопасности и его срашно пускать локально

Fyodor Ustinov, 2023/12/19 01:08
Эээээ... Я ни тебя не понимаю, ни изначальную идею ацетона.
newbie, 2023/12/19 13:03
Тут, вероятно, имеется ввиду то, что все привыкли к IPv4 за NAT. И домашние провайдеры и мобильные выдают "серые" адреса, недоступные напрямую из интернета. С IPv6 же все иначе, их много и смысла выдавать "серые" адреса, вроде как, нет. Поэтому при подключении к сети с использованием IPv6 все сервисы на вашем устройстве будут доступны всему интернету, если, конечно, вы не озаботетесь их дополнительным конфигурированием и настройкой файервола.
Вот и с Yggdrasil и его IPv6 то же самое. Подключившись к сети Yggdrasil, вы получаете IPv6-адрес, по которому ваше устройство и все сервисы на нём будут доступны всем, кто подключен к этой же сети... Тут аналогия с локалкой в которой так же всё всем доступно, и ограничениями в которой мало кто озадачивается, ввиду того, что доверия к устройствам в ней больше. Однако, по факту, здесь уже не локалка.
А если вы еще и всем домашним устройствам выдаете адреса из 300::/64, то вся сеть Yggdrasil по умолчанию будет иметь доступ и к вашему телевизору, и к бойлеру, и чайнику, и CCTV...

Fyodor Ustinov, 2023/12/19 13:10
Тогда причём тут "Все подключенные пиры"? доступ-то иметь будут не только пиры, но вобще все участники сети.

newbie, 2023/12/19 13:29
Чуть поправил там.
Только авторизованные участники могут оставлять комментарии.
yggdrasil/public_peer.txt · Последнее изменение: 2023/12/19 13:29 — newbie
 
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki