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)
Ответ на: комментарий от maxcom

Первый раз вижу VPN, написанный на Java.

Когда оригинальный автор приложения его писал, того же Rust-а не существовало, поэтому единственный нормальный вариант - Java, чтобы не было тупых ошибок/уязвимостей при работе с памятью и так далее. К тому же, Java - это кросс-платформенный (байт)код (ну, кроме TUN/TAP драйверов) в отличии от Rust-а или Go. Так что вполне нормальное решение.

P.S. I2P тоже на Java написан.

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

ЕМНИП, что касаемо торрентов, у них можно скачивать, но нельзя закачивать. А п2п подразумевает, что через тебя может роутиться чужой трафик, т.е формально закон нарушается

Logopeft ★★
()

Это чтобы «по предварительному сговору в составе организованной группы» присесть?

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

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

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

Этот VPN не роутит Интернет трафик через других участников, а только LAN. Так что это по сути бесплатный P2P Hamachi.

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

I2P есть и на C++ - i2pd. Он заметно быстрее и в нем исправленны некоторые уязвимости, которым подвержен Java роутер.

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

Rust это бред. «Программирование от противного». Что надо сделать, чтобы в условном C++ произошла ошибка с памятью? Обратиться по невалидному итератору? Не написать виртуальный деструктор где надо? Писать в стиле " древнего" C++, не используя RAII и умные указатели? Если программа падает, то понятно где, потому что есть отладчик. Если память течёт, то поможет valgrind. Писать на расте дольше, чем писать на плюсах и дебажить код на плюсах.

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

Не совсем согласен. На расте писать дольше только пока ты с ним плохо знаком. Отладчик почти не требуется, т.к. он заставляет более тщательно продумывать архитектуру приложения. Код на расте портируемее и абстрактнее. Уже много проектов на нем написал, в том числе и библиотеки. Знаешь что самое хорошее?То, что мои библиотеки работают одинаково и на пк, и на микроконтроллерах (no_STD, естественно).

А еще хочешь прикол? Я писал прошивку для МК, причем немаленькую, которая использует много аппаратных возможностей, таких как таймеры, UART, SPI и прочее дерьмо. Так вот, писал я это для богомерзкого Atsamd, а потом просто взял и перенес весь код на православный STM32, поменяв при этом содержимое одного hardware-depended файла, в котором происходит вся инициализация периферии.

Ты скажешь, что можно забаюахать такую архитектуру и на C/C++.

Само собой, можно. Но по опыту работы в embedded еще ни разу не видел, чтобы кто-то из моих коллег так делал на Сях.

И я бы так не делал на сях, наверно, тошо это тупо там не удобно и не ложится в концепцию языков. И это подтверждается на практике, у меня есть большой проект, который уже лет 10 назад начал свое существование и поддерживался сначала моим руководителем, а теперь - мной. Оно написано на C++ + Python. В новых классах я пробовал внедрять rust-парадигмы и они туда тупо не ложатся, код усложняется.

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

Я ничего не понял из того, что ты написал. Но я прочитал твой пост до конца!

Desmond_Hume ★★★★★
()

Оно как работает? Включаешь и у тебя добавляется роут в подсетку? В обычные интернеты в этот момент можно ходить?

crutch_master ★★★★★
()

Крайне интересно, как оно работает

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

Оно как работает? Включаешь и у тебя добавляется роут в подсетку?

У тебя добавляется новый интерфейс на вроде такого:

tap0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.6.252.79  netmask 255.255.0.0  broadcast 10.6.255.255
        inet6 fe80::cc6:1cff:fe74:8bcf  prefixlen 64  scopeid 0x20<link>
        ether 0e:c6:1c:74:8b:cf  txqueuelen 1000  (Ethernet)
        RX packets 2  bytes 194 (194.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 60  bytes 6694 (6.6 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Маршрутизация при этом работает следующим образом. Если у тебя есть прямое подключение к участнику в сети, то трафик ему передаётся ему напрямую. Могут быть участники сети, которые подключены через других, но они будут является пирами второго сорта. Для таких пиров трафик идёт через ближайшую ноду, с которым у обоих других есть прямое подключение. Если такая нода через которую передавался трафик indirect-пира отвалится, то трафик будет передаваться через оставшиеся.

Важно чтобы хотя бы один участник сети из двух был не за NAT-ом, тогда будет прямое подключение.

В обычные интернеты в этот момент можно ходить?

Да, P2P VPN не блочит доступ в Интернет.

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

I2P есть и на C++ - i2pd. Он заметно быстрее и в нем исправленны некоторые уязвимости, которым подвержен Java роутер.

Ну есть и есть. А Tor тем самым временем переписывают на Rust.

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

Что надо сделать, чтобы в условном C++ произошла ошибка с памятью?

Вам ничего делать не надо. Она просто сама появится тогда, когда ты даже не сможешь предугадать. Новостей о том, что в $libraryname$ на сишке опять нашли ошибку с выходом за пределы массива ещё не начитался?

Писать в стиле " древнего" C++, не используя RAII и умные указатели?

Вот скажи, почему я должен обязательно теперь тащить ваш тормозной и долго компилирующийся C++? Rust долго компилируется - понятно почему, а C++ это делает на пустом месте. В обычном C умных указателей нет. Даже нет нормального единого кросс-платформенного API для TCP сокетов. В С++ тоже. Сам C настолько убог, что программисты тупо переходят на Go, у которого в языке совсем нету фич, но зато есть GC и нормальная библиотека.

Писать на расте дольше, чем писать на плюсах и дебажить код на плюсах.

Сразу видно, что человек не занимался вылавливанием крашей и уточек памяти в СИ прогах. Доказывать ничего не буду, вы просто меня не поймете.

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

https://www.opennet.ru/opennews/art.shtml?num=59852

На, ешь, свежачок. Все кроме первого - «парад сишного гавна»™.

«Rust это бред» be like:

чтения в область памяти за пределами выделенного буфера

чтения из областей вне выделенного буфера в функциях match_flags и u32_match_it

переполнение стека в библиотеке Glibc

вызванные целочисленным переполнением в обработчиках файлов с видео в формате MXF

переполнение буфера в предлагаемом в GStreamer

Дальше копировать лень. Надеюсь, что урок усвоен.

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

Если программа падает, то понятно где, потому что есть отладчик.

В языке с UB это не так.

Что надо сделать, чтобы в условном C++ произошла ошибка с памятью?

Например, вызвать std::stack.pop на пустом стеке.

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

У Rust основная проблема при сравнении с C++ — скорость скомпилированного кода. C++ всё-таки быстрее.

А если скорость неважна, то можно взять ту же java и не втискивать программу в прокрустово ложе rust’овской архитектуры. Или вообще на лиспе или JS писать.

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

Он заметно быстрее и в нем исправленны некоторые уязвимости, которым подвержен Java роутер.

Можно пример? Хочу увидеть уязвимость, которую было проще исправить в Си++, чем в Яве.

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

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

Опять же, если мы берем задачи, решённые одинаково.

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

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

Раст по производительности не уступает плюсам. А в некоторых моментах даже выигрывает.

Как он может не уступать плюсам, если часть проверок в нём неотключаемая.

Вот, сравни идентичный код:

https://godbolt.org/z/eoezrGrq7

https://rust.godbolt.org/z/q1vj6rj9s

И это связано с тем, что в расте бывает приходится прибегать к оверхедным путям решения задачи, но это плата за безопасность, причём небольшая.

Основная плата — прогибание структур данных под Rust либо весь код, работающий со сложными структурами приходится заворачивать в unsafe (в котором у Rust такой же UB, как у C++).

В то время как заплатив ещё чуть-чуть можно писать на Java, в котором GC переваривать произвольные структуры данных.

Например, вот человек пишет LRU: https://dev.to/seanchen1991/implementing-an-lru-cache-in-rust-33pp

Половину текста борется с языком, в итоге итератор вместо того, чтобы по next получать сразу следующий элемент, получает ключ этого элемента и по нему вытаскивает запись из хранилища (вместо O(1) на ровном месте O(log N)). К тому же, ему пришлось сделать, чтобы удаление элемента элемент не удаляло.

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

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

Если уж хочется цифр, то как раз есть видео, которое показывает результат работы того примера, что ты мне скинул с циклами: https://m.youtube.com/watch?time_continue=379&v=W8gI--XNYE4&embeds_referring_euri=https%3A%2F%2Fyastatic.net%2Fvideo-player%2F0x0550a6eaa6c%2Fpages-common%2Fyoutube%2Fyoutube.html&source_ve_path=Mjg2NjY&feature=emb_logo#bottom-sheet

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

Про LRU ничего сказать не могу. И читать многобукаф лень. Может, действительно, в языке есть неудобный момент, а может чувак не разобрался.

А что качается java, хз, такое себе. Меня-то embedded разной степени запущенности интересует. И java-тачку тащить вообще неохота. Ну и на МК на жабе не покатаешься.

Короче, раст нишу свою уже занял и с этим не поспорить, плюсы, само собой, он не заменит, уж очень у них большая история. Но новые независимые проекты, считаю, таки лучше на расте делать. Как минимум есть на то несколько причин: оно действительно хорошо портируется с одной железки на другую, у него много библиотек (прям реально много), и нет ада со сборкой, который присущ проектам на плюсах.

Yaourt
()

Сабж проверен. Не работает. Все нормально - типичное поделие, не рассчитанное на адекватное использование. Под виндой нужен TAP, автор дает битую ссылку на openvpn, который его должен установить, но вот незадача - там давно tap6.

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

Сабж проверен. Не работает.

У меня работает. У других работает. Ставится за 10 минут, даже быстрее.

Все нормально - типичное поделие, не рассчитанное на адекватное использование.

У P2P VPN нет почти нет никаких нормальных альтернатив кроме коммерческого Hamachi. Кстати, поэтому и форкнул, и работаю напильником.

Под виндой нужен TAP, автор дает битую ссылку на openvpn

У тебя драйвер прямо в архиве лежит. В линуксе он вообще не нужен, он у тебя в ядре.

Кстати, если не ошибаюсь в десятке TAP-Win32 Adapter OAS можно поставить прямо из настроек винды.

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

Я не знаю, что такое tap6.

Есть два драйвера TAP-Win32 Adapter OAS и Win-Tap V9. В целом под обоими должен работать, под первым точно. Про второй, оригинальный автор приложения говорит, что должен, но я лично не проверял.

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

Явно их действительно не отключить, но их отключает компилятор при оптимизации.

Я же ссылку на оптимизированный ассемблер дал. Там, где gcc пишет блоками по 16 байт, rust пишет каждый int отдельно и на каждой итерации сравнивает индекс с длиной массива, чтобы сделать панику, если переполнилось.

Если при возврате Result ты никак не обрабатываешь ошибку, то он тупо ее выкидывает.

Это естественно. Но при доступе к массиву не обработать панику компилятор не может.

того примера, что ты мне скинул с циклами

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

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

Про LRU ничего сказать не могу. И читать многобукаф лень. Может, действительно, в языке есть неудобный момент, а может чувак не разобрался.

Есть неудобный момент. Нельзя сделать ссылку на предыдущий и следующий элемент списка. И делать либо как он (вместо ссылки храним ключ в словаре), либо как в официальном LruCache на 623 строки кода (без тестов и комментариев) писать 64 unsafe.

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

Ну есть и есть. А Tor тем самым временем переписывают на Rust.

Ну переписывают и переписывают. Царствия, как говорится, небесного.

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

i2pd(на C++) появился потому что к реализации на Java были некоторые вопросики. В том числе с кроссплатформенным запуском на всяких кофеварках с OpenWRT.

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

У P2P VPN нет почти нет никаких нормальных альтернатив кроме коммерческого Hamachi

ZeroTier, Tailscale, tinc. Но да, реализаций по сравнению с классическими VPN конечно количеством меньше.

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

ZeroTier

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

tinc

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

Tailscale

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

Ещё есть freelan, но у него такая же юзабельность как и у tinc, если не хуже. Я даже потрахался с boost-ом и собрал ради него старый SSL, чтобы поюзать. В итоге кроме Hamachi и P2P VPN с нормальной юзабельностью ничего не остаётся.

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

Так в C++ никто даже не заставляет откручивать библиотеки. Можно хоть Boost использовать, только свой аллокатор придётся написать. И Boost будет куда высокоуровневее, чем Rust без std.

А вот отсутствие ООП достаточно сильно мешает, когда проект большой.

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

Не путайте C и C++. Это совершенно разные языки уже лет 30 как. Не надо недостатки C (в котором нет RAII) перекладывать на C++.

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

Я не говорю, что проще. Просто в I2Pd она исправлена, а в I2P на Java нет.

Если у Java спросить лизсет, то она ответит одинаково для разных сервисов, а I2Pd - нет. Таким образом у Java можно установить, что несколько сервисов находится на одном физическом сервере.

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

Не получится, потому что один растёт ногами из другого. По поводу той же скорости компиляции: С был простым языком и C-компилятору можно было скормить одновременно все исходники при этом хедеры будут парситься один раз. А в C++ хедеры парсятся каждый раз при компиляции каждого файла. Всё это ещё утяжеляется дженериками и другими фичами плюсов. Народ придумал pre-compiled headers, чтобы ускорить компиляцию, но их юзают ровно почти никогда (и юзабилити, честно, у них хреновое). STL в С++ это вообще какой-то позор (ну кроме std::vector, std::map), что Qt считается неофициальной «стандартной» библиотекой плюсов.

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

Вот про ООП очень спорный момент. Как по мне, раст наиболее ООП-шный язык из ныне представленных. Сейчас поясню.

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

Что касается основных постулатов… Наследования нет, и это прекрасно. Вспомни как интересно читать документацию на Qt, когда хочешь найти метод какого-нибудь класса, а он унаследован в четвертом колене от какого-нибудь виджета и ты начинаешь шарить по предкам в надежде найти вожделенный сигнал или метод. Особенно «хорошо» становится, когда пишешь что-то в команде, твой друг меняет что-то в своем классе и у тебя (в наследнике) все ломается.

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

Что касается инкапсуляции и полидрочизма - там все с этим хорошо. И генерики писать удобнее, чем темплейты, но это субъективно.

А вот буст в плюсах сомнительная штука. У меня был проект с использованием буста. Он достался мне в наследство, я его и сейчас поддерживаю и обновляю, но буст таки я оттуда выковырнул. И как стало хорошо без него переносить этот проект на другие платформы (а это требуется часто в виду специфики самого проекта).

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

Ты на Германии когда в последний раз жил или хотя бы был? А на ЕС?

В Германии с 2017го года запрещен просмотр нелегального контента (стриминг), но он де факто не наказуем из-за юридической клаузулы

Согласно § 44а Закона об авторском праве (так называемый Джокер) разрешает «временное» копирование из законных источников.

Весь цимес в том, что невозможно доказать, что пользователь знал «незаконность» используемого стримингового сервиса и, несмотря на это, всё же им воспользовалась для создания у себя временной копии из нелегального источника.

LinuxFromMachine
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.