LINUX.ORG.RU

Выпуск P2P VPN 0.11.2

 , , , ,


3

3

Состоялся выпуск P2P VPN 0.11.2 - реализации децентрализованной виртуальной частной сети, работающей по принципу Peer-To-Peer, при котором участники подключены друг к другу, а не через центральный сервер. Участники сети могут находить друг друга через BitTorrent-трекер или BitTorrent DHT, либо через других участников сети.

Список изменений:

  • Добавлена возможность использования приложения в headless режиме (без графического интерфейса).
  • Добавлена возможность генерации файла доступа, экспорта закрытых ключей сети и создания новой сети с данными, сохраненными в формате ini, без использования графического интерфейса.
  • Исправлена ошибка: кнопка закрытия в заголовке окна «добавить в черный список» (Ban peer) должна работать как кнопка НЕТ.
  • Исправлен код, который мог приводить к утечке дескриптора при работе с файлами.
  • Доступна функция ограничения скорости приема трафика.

>>> Подробности

★★★★★

Проверено: maxcom ()
Последнее исправление: Skullnet (всего исправлений: 1)
Ответ на: комментарий от One

Покажи хоть одного немца, который получил штраф.

И название материала в студию

LinuxFromMachine
()
Ответ на: комментарий от Yaourt

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

Пользуясь случаям, хотелось бы задать следующие вопросы относительно Rust:

  1. Как обстоят дела с забытыми нерадивыми Rust-девелоперами .unwrap() в недрах используемой проектом 100500-й opensource библиотеки, и как это вообще кореллирует с претензией на стабильность. Ну кроме catch_unwind, который вроде как и есть, но вроде как бы и не то, чтобы труЪ. Ответ что «ну это все же лучше сегфолта» считаю правдоподобным, однако неубедительным.

  2. Что там с GUI и как вообще так получилось, что пришлось откапывать это недоразумение под названием immediate mode UI. В т.ч. и в используемой для ответа на данный вопрос библиотеке egui. (Подсказка - 2 английских слова, первое из которых начинается на букву ‘b’, а второе - на букву ‘c’).

Minoru ★★★
()
Последнее исправление: Minoru (всего исправлений: 6)
Ответ на: комментарий от Logopeft

Я понял, а ты - нет

Зы. Кстати, мопед не мой. Это так русскоязычный анвальт в Германии написал.

LinuxFromMachine
()
Ответ на: комментарий от Logopeft

у них можно скачивать, но нельзя закачивать.

Это ЛПП. С 2017го года нельзя скачивать с нелегальных источников (пиратский стрим), но это невозможно доказать.

И как называется эта юридическая клаузула, которая говорит: если факт нарушения невозможно доказать, то его (факта) не было.

То есть ты можешь спокойно продолжать это делать.

А значит, это разрешено.

LinuxFromMachine
()
Ответ на: комментарий от LinuxFromMachine

Не разрешено, а, как ты сам писал, недоказуемо. Это разное. Идеальное убийство тоже недоказуемо, но это не делает его легальным.

Vsevolod-linuxoid ★★★★★
()
Ответ на: комментарий от Minoru
  1. Тут все очевидно, если библиотека кривая и unwrap таки даст панику, то можно отзеркалить себе эту либу и поправить unwrap (паника же скажет где это искать, как было упомянуто, это действительно лучше сегфолта). Сам делал похожее с библиотекой для парсинга, только там не unwrap был, а функция давала Err там, где не должна. Ну а вопрос стабильности - это вопрос распределения ответственности, если ты включаешь в свой проект ту или иную библиотеку - будь добр проверить как она работает. Часто в саму либу включены юнит-тесты и все можно посмотреть.

Хотя лично я популярным бибилиотекам, типа serde вполне доверяю и ничего не смотрю. А вот что касается какой-то специфичной задачи - там проверяю часто что внутри творится.

  1. Egui вполне неплох на самом деле, в нем довольно сложно делать привычные интерфейсы, но что касается программ, в которых довольно простая графика (например, какая-нибудь фигня для трея, типа нетворк-апплета), то оно прям мастхев.

А что касается интерфейсов декстопных программ не мгу сказать, т.к. не занимаюсь этим. Знаю, что есть gtk-бинды, но сам не юзал.

Слышал про Qt-бинды, но, судя по репозиторию, оно либо в зачаточном состоянии, либо нежизнеспособно.

Yaourt
()
Ответ на: комментарий от LinuxFromMachine

STL настолько ужасен, что без Boost до C++14 им пользоваться невозможно, да и с новыми стандартами лучше стало не сильно. А «древний» C++98 с бустом будет куда удобнее C++20.

zx_gamer ★★★
()
Ответ на: комментарий от LinuxFromMachine

C язык более-менее нормальный. Но писать на нем это мука. Да, можно руками написать всё: структуры данных, шаблоны на макросах и пр., но делать это руками интересно 1 раз, а потом хочется использовать уже готовое, потому что на это уходит куча времени, а к решению задачи это не приближает.

Как язык C, наверное продуманее C++, но как инструмент он сильно проигрывает последнему в скорости разработки и поддержке ПО.

zx_gamer ★★★
()
Ответ на: комментарий от LinuxFromMachine

Нет, Boost делали куда более адекватные люди.

zx_gamer ★★★
()
Ответ на: комментарий от LinuxFromMachine

Есть. И их глупо отрицать. В C99 есть VLA и это ужасно. В языке нет шаблонов, поэтому приходится насиловать препроцессор, если нужно сделать что-то подобное. Язык процедурный, писать в ООП-парадигме не удобно (и, как правило, не нужно на этом языке), но писать большой проект командой без ООП крайне сложно, т.к. невозможно стандартным образом (классами) декомпозировать задачи и распределить их на разработчиков.

zx_gamer ★★★
()
Ответ на: комментарий от Skullnet

ZeroTier
Коммерческий и как юзать не понятно.

Ставишь контроллер на свой сервер (есть два веб-интерфейса на выбор - ztncui или zero-ui) и поехали. Это если не охота пользоваться их облаком(там кстати есть и бесплатный план и даже вроде достаточно ёмкий для личного использования - не знаю, не пробовал, у меня контроллер на своем сервере).

tinc
Какая-то непонятная консольная хрень с нулевой юзабельностью

Дожили, строящие VPN линуксоиды боятся консоли >_<

Tailscale
Частично опенсорсный Hamachi-подобный VPN для бизнеса от создателей Wireguard. Не юзал.

Есть открытая реализация сервера - headscale. Но вот как раз к ней у меня есть вопросики в плане юзабельности. В отличие от ZeroTier и tinc - которые работают так как заявлено.

Pinkbyte ★★★★★
()
Последнее исправление: Pinkbyte (всего исправлений: 3)
Ответ на: комментарий от Pinkbyte

Ставишь контроллер на свой сервер (есть два веб-интерфейса на выбор - ztncui или zero-ui) и поехали. Это если не охота пользоваться их облаком(там кстати есть и бесплатный план и даже вроде достаточно ёмкий для личного использования - не знаю, не пробовал, у меня контроллер на своем сервере).

Вот прикинь, вот это всё нужно дать сделать нубу, а если даже у опытного пользователя могут быть проблемы, то это просто невозможно. Ну и коммерческая эта софтина.

Дожили, строящие VPN линуксоиды боятся консоли >_<

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

Да и консоль в tinc гавно, сравни с P2P VPN:

java -jar P2PVPN.jar --newNetwork --name="Moya setka" > profile.ini
java -jar P2PVPN.jar --generateAccess > access.dat
sudo java -jar P2PVPN.jar --headless --access=access.dat --name=VasyanPower --port=2103 --vpn.ip=10.6.10.10 --vpn.mask=255.255.0.0

Готово.

Ну и другу сделай сертификат:

java -jar P2PVPN.jar --generateAccess > access_dlya_druga.dat
Skullnet ★★★★★
() автор топика
Последнее исправление: Skullnet (всего исправлений: 5)
Ответ на: комментарий от zx_gamer

но писать большой проект командой без ООП крайне сложно, т.к. невозможно стандартным образом (классами) декомпозировать задачи и распределить их на разработчиков.

Структуры и функции в Си есть. ООП с наследованием и виртуальными функциями часто приносит больше вреда, чем пользы. Начиная от повышенной уязвимости (адрес можно подменить), заканчивая потерями производительности.

monk ★★★★★
()
Ответ на: комментарий от Yaourt

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

Ну да, автобусов, магазинов и даже помещений, в которых находится больше одного человека, не существует. А ещё в реальном мире есть такие сущности как «разговор», «семья» и «коллектив», которые даже потенциально не могут иметь одного владельца. А на Rust постоянно приходится изобретать «хлопок одной ладонью».

monk ★★★★★
()
Ответ на: комментарий от monk

Ты путаешь. В реальном мире не все вокруг тебя. Не ты владеешь магазином, магазин владеет тобой. Пока ты в Пятерочке - ты не можешь быть в Перекрестке или наоборот (это такие сетевые магазины в России, если ты не из этой страны). «Разговор» - это как мультикаст в локалке, каждому приходит КОПИЯ данных, и дальше ты владеешь этой копией и обрабатываешь по-своему. «Семья» - это тупо хеш-таблица, и ты в ней одно из значений. То есть, снова не ты владелец. Если тебя не станет (я не желаю тебе смерти, просто пример), то это не означает, что не станет и семьи. «Коллектив» - тоже.

Yaourt
()
Ответ на: комментарий от Yaourt

Ты путаешь. В реальном мире не все вокруг тебя. Не ты владеешь магазином, магазин владеет тобой.

Скорее магазин владеет указателем на меня, а не мной)

Skullnet ★★★★★
() автор топика
Ответ на: комментарий от Yaourt

Не ты владеешь магазином, магазин владеет тобой.

Ну да. Не переменная владеет данными, а данные владеют переменной. Это везде так. Пока в переменной одни данные, другие данные в ней же быть не могут. Но в Rust и переменная владеет данными. Как если бы мне перед входом в магазин пришлось из него всех выгнать или построить себе рядом копию магазина.

Если тебя не станет (я не желаю тебе смерти, просто пример), то это не означает, что не станет и семьи.

Если семья была из двух человек, то после смерти любого из них семьи нет, у оставшегося статус «вдовец/вдова». Также и с коллективом: коллектива из одного человека не бывает.

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

monk ★★★★★
()
Ответ на: комментарий от Skullnet

Зеротир некоммерческий. Там нужен сервак, чтобы огранизовывать соединения между пирами (или использовать вендорский), т.е. это не п2п. И работает это всё как-то странно. Я иду на второй хост, у него порты для меня закрыты, но со стороны 3-го хоста всё норм.

crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 3)
Ответ на: комментарий от Skullnet

И этот самый зеротир как-то делал так, что можно было сидеть за натом и трафик шел не через хост с белым ип. Но там какая-то особая черная магия, кмк.

crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 1)
Ответ на: комментарий от crutch_master

И этот самый зеротир как-то делал так, что можно было сидеть за натом и трафик шел не через хост с белым ип. Но там какая-то особая черная магия, кмк.

Я думаю никакой там магии нет. У некоторых людей просто непробиваемый Symmetric NAT. Из-за которого у меня с другом, по всей видимости, скорость передачи файлов в Tox 10 кб/c, потому что трафик тупо передаётся через другого человека/ноду. Конечно, могу ошибаться.

Skullnet ★★★★★
() автор топика
Последнее исправление: Skullnet (всего исправлений: 3)
Ответ на: комментарий от monk

Ты сейчас доказал только то, что ты устал и начал смещать акценты. Реальной жизни все несколько сложеннее, и прикапываться к мелочам, типа «семьи не получится из одного человека» не корректно. Если уж совсем хочется, то напиши трейт, в котором при удалении ключа из таблицы будет проводиться проверка на количество членов и возвращай члена, а не таблицу, если остался один.

Про копию магазина - вообще все перевернул, опять повторяю, это в коммутаторе все вокруг тебя, жизни все сложнее, это мультимастерная система, ты можешь быть как мастером, так и слейвом в зависимости отконтекста. Это Аллах придумал, если что.

Yaourt
()
Ответ на: комментарий от Yaourt

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

Это не мелочь, это суть множества объектов реального мира, которые существуют только если в них есть несколько элементов. И поэтому ими никак не может владеть один элемент.

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

В Rust можно в каждом члене таблицы сделать ссылку на таблицу? И гарантировать, что когда в таблице закончатся члены, память под таблицу освободится?

Про копию магазина - вообще все перевернул

Ладно, с магазином в Rust проще: глобальные данные с бесконечным временем жизни. А вот с понятием «разговор» уже никак. Создаётся он любым участником будущего разговора, завершаться должен когда из него вышли все участники. Участники должны иметь ссылку на разговор.

monk ★★★★★
()
Ответ на: комментарий от Yaourt

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

В жизни есть огромное количество объектов, у которых есть больше одного владельца.

monk ★★★★★
()
Ответ на: комментарий от monk

В Rust можно в каждом члене таблицы сделать ссылку на таблицу? И гарантировать, что когда в таблице закончатся члены, память под таблицу освободится?

Да, но так делать не красиво. Зачем каждый член будет содержать ссылку на таблицу, это лишняя трата памяти.

Тупо трейт для таблицы напиши с методом pop (назвать по своему усмотрению), который будет принимать self и возвращать enum, который в зависимости от количества членов возвращает либо self, либо T.

Таким образом обеспечиваются гарантии освобождения памяти.

А можно и не трейтом, можно тупо функцией обойтись, но трейтом ООПшнее получается.

Yaourt
()
Ответ на: комментарий от Yaourt

Зачем каждый член будет содержать ссылку на таблицу, это лишняя трата памяти.

Например, этих таблиц много и надо знать, к какому из них относиться член. Пример «семья» / «член семьи». Или «разговор» / «участник разговора».

Как сделать то, что в нормальных языках делается так:

а.семья = new Семья(&а);
б.семья = а.семья.добавить(&б);

?

Тупо трейт для таблицы напиши с методом pop (назвать по своему усмотрению), который будет принимать self и возвращать enum, который в зависимости от количества членов возвращает либо self, либо T.

Не понял. pop может освободить память из-под self?

monk ★★★★★
()
Последнее исправление: monk (всего исправлений: 1)
Ответ на: комментарий от esperantisto

а что это такое и для чего оно нужно?

Вкратце, Hamachi с блекджеком и шлюхами.

А по длинному написано в теме.

Использовать можно для чего угодно: арендовать сервер и сделать себе VPN Proxy - P2P VPN + socks proxy, играть с друзьями в старые игры. Много назначений, выбирай любое. Суть в том, что его легче настроить чем тот же OpenVPN и он open-source.

Skullnet ★★★★★
() автор топика
Последнее исправление: Skullnet (всего исправлений: 1)
Ответ на: комментарий от monk

Не понял. pop может освободить память из-под self?

Да, если в метод не &self, а self передать. Только метод должен возвращать Self или T, завернутый в enum, как я раньше и говорил.

Так много где делается, например, у Option есть take, который выдергивет содержимое из Option, а туда None подкладывает.

Yaourt
()
Ответ на: комментарий от monk

Как сделать то, что в нормальных языках делается так:

а.семья = new Семья(&а); б.семья = >а.семья.добавить(&б); ?

Ну, например, через clone. Он создаст дубликат, ссылающийся на тот же ресурс. Если коротко, это не копия (типа memory), оно просто делает из &T -> T. Если ты дропнешь клона, то ресурс не освободится, пока все последний экземпляр не дропнется.

Yaourt
()
Ответ на: комментарий от Yaourt

Если коротко, это не копия (типа memory), оно просто делает из &T -> T. Если ты дропнешь клона, то ресурс не освободится, пока все последний экземпляр не дропнется.

Так тогда владение не зафиксируется. А должно работать

{
  Человек б, в;
  {
    Человек а;
    а.семья = new Семья(&а); 
    б.семья = а.семья.добавить(&б);
  }
  в.семья = б.семья.добавить(&в);
}
// здесь память под семью должна быть очищена
monk ★★★★★
()
Ответ на: комментарий от Yaourt

Так много где делается, например, у Option есть take, который выдергивет содержимое из Option, а туда None подкладывает.

Он не self, а содержимое очищает.

Я про конструкцию типа

a = stack.pop() // здесь последний элемент и stack становится освобождённым
б = stack.pop() // а здесь "null pointer exception"
monk ★★★★★
()
Ответ на: комментарий от Yaourt

И почему же для работы с

struct LruEntry<K, V> {
    key: K,
    val: V,
    prev: *mut LruEntry<K, V>,
    next: *mut LruEntry<K, V>,
}

автор https://github.com/stevenroose/rust-lru/blob/master/src/lib.rs не воспользовался им? Там сплошные unsafe(честно-честно, всё работает) начиная с инициализации этой структуры. И это ещё очень тривиальная структура.

monk ★★★★★
()
Ответ на: комментарий от monk

Да я не знаю что такое LRU. И углубляться нет желания. Поэтому по делатям реализации пояснить не могу.

Понятно, что с unsafe все работает. Может, чуваку тоже лень было погружаться и он в лоб с Си переписал всю бизнес логику. Это легко объясняет почему там почти все unsafe, опять же, это предположение.

Лично из опыта скажу, что у меня несколько проектов на расте, выбор пал на него как раз из-за надежности (это связано с авиацией) и unsafe я использовал только в одном и то только потому что там использовал сишную библиотеку, а любой ffi без unsafe нельзя сделать.

Так вот, самое важное, что те вещи, которые тривиальны в плюсах или си - решаются иначе. Не сказать, что сложнее, просто иначе. Дело привычки.

Yaourt
()
Последнее исправление: Yaourt (всего исправлений: 1)
Ответ на: комментарий от Yaourt

Так вот, самое важное, что те вещи, которые тривиальны в плюсах или си - решаются иначе. Не сказать, что сложнее, просто иначе. Дело привычки.

Вот это я и имел в виду под прокрустовым ложем архитектуры. Там, где на нормальном языке будешь выбирать структуру исключительно по алгоритмическим соображениям (сложность операций от количества элементов), в Rust будешь сначала пытаться реализовать на тех, которые не требуют unsafe. Примерно как на Haskell всё по умолчанию делается через списки и чистые псевдомассивы и только если производительности не хватило, может быть выбрана нормальная структура.

А проблема в том, что структуры данных определяют значительную часть структуры программы. И если у Haskell ниша программ, где скорость настолько неважна, что программа может работать медленнее аналога на Java, то если программа на Rust работает медленнее, чем аналог на Java, то по всем параметрам лучше взять Java: в ней больше библиотек, она безопаснее.

Более того, если скорость настолько важна, то программы на Rust медленнее, чем программы на C++. А как только начинаешь использовать unsafe для сложных структур, то и преимущество безопасности пропадает. Потому что простые структуры и в C++ можно через умные указатели разрулить, утечки памяти и UB именно в сложных.

monk ★★★★★
()
Ответ на: комментарий от Pinkbyte

К сожалению все tinc абоненты должны иметь ключи всех абонентов . Без автоматизации с Ansible никак.

Bers666 ★★★★★
()
Ответ на: комментарий от Jaeger1999

https://www.opennet.ru/openforum/vsluhforumID3/131773.html#84

В апстриме правда уже завезено больше фич для пакетирования, например:

     CLIB_PATH            The path to the .dll or .so libraries in the file system. The path must contain the 'clib' directory.
Skullnet ★★★★★
() автор топика
Последнее исправление: Skullnet (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.