Stormvpn - VPN, который работает как HTTPS

Хотел бы поделиться ПО моей разработки – StormVPN. VPN, который по сути дела ведёт себя как HTTP(s) и может работать через Proxy, например Nginx. Хотел бы сразу предупредить, что ПО является платным, сервер требует ключ, но без ключа единственное ограничение – количество сессий, которые сервер может обработать одновременно – 1.

Основные фичи ПО:

- работа за прокси, вместе с сайтом (на одном порту);
- поддержка нескольких режимов работы: Bridge, IP/Static, IP/Dynamic;
- в режиме Bridge есть поддержка Trunk, фильтрации и перетегирования VLAN;
- в режиме IP/Static простое соединение с IPv4, в режиме IP/Dynamic встроенная динамическая маршрутизацию (а-ля BGP, OSPF), когда вам надо быстро и нет желания настраивать дополнительный софт;
- промер скорости канала и отображение в утилите для каждого бездействующего пира (то есть, не передающего никакие данные);
- поддержка Windows/Android клиента в режиме IP/Static.

Пример настройки Nginx для работы с StormVPN:

server {
        listen          0.0.0.0:80;
        server_name     storm-vpn.your-domain.com;
        rewrite ^(.*) https://storm-vpn.your-domain.com$1 permanent;
        return 301 https://storm-vpn.your-domain.com$request_uri;
        access_log  /dev/null;
        error_log /dev/null crit;
}

server {
        listen                  0.0.0.0:443 ssl;
        server_name             storm-vpn.your-domain.com;

        # ssl                     on;
        ssl_certificate         /etc/letsencrypt/live/your-domain.com/fullchain.pem;
        ssl_certificate_key     /etc/letsencrypt/live/your-domain.com/privkey.pem;

        location /storm-vpn-endpoint {
         proxy_pass http://<storm-vpn-ip>;
         proxy_http_version 1.1;
         proxy_set_header Upgrade $http_upgrade;
         proxy_set_header Connection "upgrade";
         proxy_buffering off;
        }

        access_log  /dev/null;
        error_log /dev/null crit;
}

Начиная с версии 0.0.8 работаем только через Docker, что бы избежать проблем с дистрибуцией.

Пример запуска сервера:

# docker run --cap-add=NET_ADMIN --device /dev/net/tun:/dev/net/tun --net=host --name stormvpn-server -d stormotron/stormvpn-server:latest

Переменные среды сервера:

- LISTEN_IP      - IP, default 0.0.0.0
- HTTP_PORT      - Port, default 80
- HTTPS_PORT     - Port, default 443
- URL            - String, default storm-vpn-endpoint
- STANDALONE     - Boolean, default true
- CLIENT_TIMEOUT - Int, Timeout, default 30
- SERIAL         - String, Serial, default demo
- SERVER_CRT     - String, Server certificate, default selfsigned
- SERVER_KEY     - String, Server certificate key, default selfsigned
- CLIENT<NUM>    - String, clients description, no defaults - MUST be defined

Client examples:
CLIENT1='peer=peer01,secret=peer01secret'
CLIENT2='peer=peer02,secret=peer02secret,interface=peer02,mac=00:11:22:33:44:55'
CLIENT4='peer=localpeer,secret=localpeersecret,link_quality=5M'
CLIENT5='peer=brpeer,secret=brpeersecret,link_quality=auto,link_type=bridge:mybridge:clbridge'
CLIENT6='peer=brpeer2,secret=brpeersecret2,link_type=bridge:mybridge:clbridge,bridge_vlan=10:16'
CLIENT7='peer=ippeer,secret=ippeersecret,link_type=ip:30:192.168.0.1:192.168.0.2:dynamic:50'

Как посмотреть статистику:

# docker exec -it stormvpn-server stormvpn-stats

Пример подключения клиента:

# docker run --cap-add=NET_ADMIN --device /dev/net/tun:/dev/net/tun --net=host --name stormvpn-client -d stormotron/stormvpn-client:latest

Переменные среды клиента:

- URL       - String, default https://vpn.your.domain/storm-vpn-endpoint
- PEER      - String, default test
- SECRET    - String, default test
- INTERFACE - String, default vpn_<RANDOM NUMBER>
- INSECURE  - Boolean, default false

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

Более подробно можно почитать тут: GitHub - stormotron/stormvpn: StormVPN is an implementation of Ethernet tunneling protocol over HTTP/HTTPS to provide full Ethernet connectivity.

Слабые места:

  1. у вебсокетов всегда ALPN http/1.1 (потому что вебсокетов для h2 в природе не существует) - уже ред флаг.
  2. есть ли маскировка TLS-финерпринта у клиента (uTLS)?

Коммерческие проекты успешны только в одном случае когда это одно кнопочное решение+ ещё нужны root права ну как будто бы не очень понятно, какой у вас план если проект коммерческий

Проприетарное. Это самое главное слабое место.

зачем нужен ваш проект, если уже есть тысячи открытых решений?

Лично мне нужно было иметь софт, способный протягивать Ethernet поверх чего-то менее заметного, типа HTTP, при этом иметь MTU>=1500 внутри, иметь возможность балансироваться через Nginx, иметь возможность протягивать/ретегать VLAN, что бы строить Bond с VRRP. Короче, открытого ПО я не нашел и написал своё :slight_smile: , потом подумал, что кому-то ещё может зайти Dynamic routing прямо внутри VPN. Может плохо искал.

А я считаю, что это сильное место при таком кейсе, как обход блокировок. РКН будет тяжело :slight_smile:

Пока изучаю нишу.

2 - нет.

А, ещё мне нужно было, что бы софт сам умел мерять скорость канала в простое… Ну что б не бегать с iperf каждый раз.

В таком кейсе как обход блокировок это как раз слабое место, перечеркивающее любые достоинства.

При обходе блокировок открытость реализации важна как никогда.
Во-первых, чтобы можно было сделать независимый аудит, потому что тема находится в серой зоне, особенно с учетом нынешних трендов, когда сегодня просто запрещают получать запрещенную информацию, а завтра за ее получение (или “распространение” для владельца сервера, кстати статья уже есть) будут шить десяточку с конфискацией.

Во-вторых, возможность создания производных разработок. Когда автора Shadowsocks повязали китайские власти, сообщество подхватило разработку и продолжило развивать проект и протокол. Когда авторка V2Ray исчезла, сообщество форкнуло проект и продолжило разработку. Когда V2Ray стагнировал и превратился в унылое говно, несколько человек форкнули его, сделали XRay, и на сегодняшний день он гораздо более популярный чем свой прародитель. Анализируя код XRay (т.к. документации у них почти никакой) и переиспользуя их наработки, другой разработчик сделал более эффективную и гибкую реализацию Sing-box. И так далее.

А “XXX through obscurity” с РКН вообще не работает, как мы выяснили. От того, что код закрыт, страдают в первую очередь пользователи и сообщество, и РКН на это наплевать, они другими методами работают.
В комменте выше вон я привел как минимум два весьма характерных ред флага, по которым РКН может легко банить подключения вашего VPN. И для этого вовсе не требовалось заглядывать в код, достаточно простого внешнего анализа.

Мне кажется, вы бежите далеко впереди паровоза… Во-первых, РКН начал (я ждал этого) делать просто замедление всего, что за бугром (cloudflare, etc), но делает он это на сессионных VPN аля TCP, ну на крайний случай - UDP. Поэтому я немного подумал и сделал вот это - Проект Narnia (VPN) , где туннелирование поверх ICMP с шифрованным Payload. Во-вторых, как мне кажется, вот эти все истории, где будут сажать за распространение - это больше пугалки, мы не северная Корея, у нас эти фокусы не проканают, нам надо просто обойти. Оба инструмента я пилил под себя исходя из вот этих двух соображений, первый оказался с моей точки зрения хорошим комбайном и я решил его поставить на комм.рельсы. Для людей, которым не нужны изыски, а достаточно просто обойти ограничение - естественно сойдет простой XRay, я не настаиваю - что надо пользоваться именно моим. Для людей, которые не хотят вариант XRay, а хотят как я просто прозрачный скрытый Ethernet туннель, да ещё и с MTU>=1500, да с VLAN, да с прочими плюшками - пожалуйста, StormVPN или Narnia. Оба фактически можно использовать любому человеку. Боитесь, что прожка украдет у вас какие-то данные - повесьте её в виртуалку и ограничьте работу виртуалки до хоста.

Это как раз softether умеет. ethernet over https. Ещё может over dns и icmp, но не пробовал, а доки скудноваты.

Может, авторша?

Да, но мне одновременно с тем, что бы иметь ether over https нужно было, что бы это жило вместе с сайтом :slight_smile: