WireGuard — прекрасный VPN будущего?


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


    Проблема текущих VPN решений в том, что их тяжело правильно настроить, дорого обслуживать, а так же в них полно legacy кода сомнительного качества.


    Несколько лет назад канадский специалист по информационной безопасности Jason A. Donenfeld решил, что хватит это терпеть, и начал работу над WireGuard. Сейчас WireGuard готовится к включению в состав ядра Linux, он даже получил похвалы от Линуса Торвальдса и в американском сенате.


    Заявленные преимущества WireGuard над другими VPN решениями:


    • Простой в использовании.
    • Использует современную криптографию: Noise protocol framework, Curve25519, ChaCha20, Poly1305, BLAKE2, SipHash24, HKDF и т.д.
    • Компактный читаемый код, проще исследовать на уязвимости.
    • Высокая производительность.
    • Четкая и проработанная спецификация.

    Неужели найдена серебрянная пуля? OpenVPN и IPSec пора закапывать? Я решил с этим разобраться, а заодно сделал скрипт для автоматической установки личного VPN сервера.


    Принципы работы


    Принципы работы можно описать примерно так:


    • Создается WireGuard интерфейс, ему назначается приватный ключ и IP адрес. Загружаются настройки других пиров: их публичные ключи, IP адреса и т.д.
    • Все IP пакеты, приходящие на WireGuard интерфейс инкапсулируются в UDP и безопасно доставляются другим пирам.
    • Клиенты задают публичный IP адрес сервера в настройках. Сервер автоматически узнает внешние адреса клиентов, когда от них приходят корректно аутентифицированные данные.
    • Сервер может менять публичный IP адрес не прерывая работы. При этом он отошлет оповещение подключенным клиентам и они обновят свою конфигурацию на лету.
    • Используется концепт маршрутизации Cryptokey Routing. WireGuard принимает и отправляет пакеты на основании публичного ключа пира. Когда сервер расшифровывает корректно аутентифицированный пакет, проверяется его src поле. Если оно соответствует с конфигурацией allowed-ips аутентифицированного пира, то пакет принимается интерфейсом WireGuard. При отправке исходящего пакета происходит соответственная процедура: берется dst поле пакета и на основании его выбирается соответсвующий пир, пакет подписывается своим ключом, шифруется ключом пира и отправляется на remote endpoint.

    Вся основная логика WireGuard занимает менее 4 тысяч строк кода, тогда как OpenVPN и IPSec имеют сотни тысяч строк. Для поддержки современных криптоалгоритмов предлагается включить в состав ядра Linux новый криптографический API Zinc. В данный момент идет обсуждение, насколько это удачная идея.


    Производительность


    Максимальное преимущество в производительности (по сравнению с OpenVPN и IPSec) будет заметно на Linux системах, так как там WireGuard реализован в виде модуля ядра. Кроме этого поддерживаются macOS, Android, iOS, FreeBSD и OpenBSD, но в них WireGuard выполняется в userspace со всеми вытекающими последствиями для производительности. Поддержку Windows обещают добавить в ближайшем будущем.


    Результаты бенчмарков с официального сайта:



    Мой опыт использования


    Я не эксперт по настройке VPN. Однажды настраивал OpenVPN ручками и это было очень муторно, а IPSec даже и не пытался. Слишком много решений нужно принимать, очень легко выстрелить себе в ногу. Поэтому я всегда пользовался готовыми скриптами для настройки сервера.


    Так вот, WireGuard, с моей точки зрения, вообще идеален для пользователя. Все низкоуровневые решения приняты в спецификации, поэтому процесс подготовки типичной VPN инфраструктуры занимает всего несколько минут. Нафакапить в конфигурации практически невозможно.


    Процесс установки детально описан на официальном сайте, отдельно хочется отметить отличную поддержку OpenWRT.


    Генерируются ключи шифрования утилитой wg:


    SERVER_PRIVKEY=$( wg genkey )
    SERVER_PUBKEY=$( echo $SERVER_PRIVKEY | wg pubkey )
    CLIENT_PRIVKEY=$( wg genkey )
    CLIENT_PUBKEY=$( echo $CLIENT_PRIVKEY | wg pubkey )

    Далее, нужно создать серверный конфиг /etc/wireguard/wg0.conf со следующим содержанием:


    [Interface]
    Address = 10.9.0.1/24
    PrivateKey = $SERVER_PRIVKEY
    [Peer]
    PublicKey = $CLIENT_PUBKEY
    AllowedIPs = 10.9.0.2/32

    и поднять туннель скриптом wg-quick:


    sudo wg-quick up /etc/wireguard/wg0.conf

    В системах с systemd вместо этого можно использовать sudo systemctl start wg-quick@wg0.service.


    На клиентской машине, создать конфиг /etc/wireguard/wg0.conf:


    [Interface]
    PrivateKey = $CLIENT_PRIVKEY
    Address = 10.9.0.2/24
    [Peer]
    PublicKey = $SERVER_PUBKEY
    AllowedIPs = 0.0.0.0/0
    Endpoint = 1.2.3.4:51820 # Внешний IP сервера
    PersistentKeepalive = 25 

    И точно так же поднять туннель:


    sudo wg-quick up /etc/wireguard/wg0.conf

    Осталось настроить NAT на сервере, чтобы клиенты могли выходить в Интернет, и все готово!


    Такую простоту использования и компактность кодовой базы удалось достичь за счет отказа от функционала дистрибьюции ключей. Здесь нет сложной системы сертификатов и всего этого корпоративного ужаса, короткие ключи шифрования распространяются примерно как SSH ключи. Но в связи с этим возникает проблема: WireGuard будет не так просто внедрять в некоторых уже существующих сетях.


    Из недостатков стоит отметить, что WireGuard не заработает через HTTP proxy, поскольку в качестве транспорта есть только протокол UDP. Возникает вопрос, возможно ли будет обфусцировать протокол? Конечно, это не прямая задача VPN, но для OpenVPN, например, существуют способы маскировки под HTTPS, что помогает жителям тоталитарных стран полноценно пользоваться Интернетом.


    Выводы


    Подводя итог, это очень интересный и перспективный проект, можно уже сейчас использовать его на личных серверах. Какой профит? Высокая производительность на Linux системах, простота настройки и поддержки, компактная и читабельная кодовая база. Однако, бросаться переводить комплексную инфраструктуру на WireGuard еще рано, стоит подождать включение в состав ядра Linux.


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

    Поделиться публикацией

    Комментарии 90

      +1
      Главная проблема каждого «еще одного VPN» — отсутствие поддержки в большинстве ОС без стороннего софта, а не пропускная способность. У того же IPSec с этим намного лучше.
        0
        У ipsec гораздо хуже с простотой настройки, все эти фаза 1, фаза 2, потом еще поверх может быть l2tp, ike, сертификаты, psk. У openvpn начинаются проблемы при большой нагрузки по трафику, la сильно растет, т.к. userspace. Дополнительное удобство wireguard, что единожды поднятый интерфейс не пропадает из системы, даже если потеряна связь со всеми пирами.
          +3
          Главная проблема WireGuard в качестве VPN в том, что это не VPN. Это просто шифрованный тунель. Ближайшим аналогом того, что предоставляет wireguard, является вручную созданная Security Association средствами ядра Linux (например так).

          У ipsec гораздо хуже с простотой настройки, все эти фаза 1, фаза 2, потом еще поверх может быть l2tp, ike, сертификаты, psk.

          Фаза 1, фаза 2 — это состояния протокола IKE, которые конечного пользователя не затрагивают. PSK — один из режимов аутентификации IKE, как и сертификаты. L2TP — просто один из видов полезной нагрузки, которая может быть инкапсулирована в IPsec, сейчас нет смысла настраивать VPN в таком режиме. Однако, это большой плюс самого IPsec — он, помимо тунельного, может работать и в транспортном режиме, в отличие от wireguard.
          По поводу простоты конфигурации — сервер конфигурируется один раз и есть масса готовых рецептов и скриптов развёртывания VPN-серверов. Что же касается клиента:

          • Wireguard работает на данный момент нативно только на линуксе. IKEv2 работает на Linux, Mac 10.11+, Windows 7+, Android 4+, iOS 9+.
          • Для IKEv2 можно авторизовываться по логину и паролю, либо по сертификатам. Для Wireguard будьте добры вбить ключи.
          • IKEv2 есть во всех вышеупомянутых системах, для Wireguard даже на линуксе нужно собирать модуль.
          • Нормальные VPN-демоны назначают адреса и протокол позволяет протолкнуть IP-конфигурацию соединения. В Wireguard будьте добры вбить вручную, так как это просто туннель.

          Кроме этого, IPsec поддерживает массу протоколов шифрования и обмена ключами, и клиент может выбрать оптимальный для себя при согласовании соединения. В случае с Wireguard доступен только один набор криптопримитивов, и возможностей для его расширения не имеется. Кстати говоря, при желании, для IPsec доступны и постквантовые алгоритмы. Для Wireguard — нет.

          Дополнительное удобство wireguard, что единожды поднятый интерфейс не пропадает из системы, даже если потеряна связь со всеми пирами.

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

          Возникает вопрос, возможно ли будет обфусцировать протокол?

          Noise protocol как раз для этого и используется в Wireguard. Однако, как верно заметили в комментах, сейчас уже в пору маскироваться под валидный HTTPS-трафик.

          В итоге, несмотря на все восторги в адрес Wireguard, пока это даже близко не то же самое, что IKEv2.
            0
            Wireguard работает на данный момент нативно только на линуксе. IKEv2 работает на Linux, Mac 10.11+, Windows 7+, Android 4+, iOS 9+.

            Wireguard уже есть на Android + под Windows есть Tunsafe (там тоже открытый исходный код).
              0
              Он там работает нативно? То есть я получу обещанную скорость, выше чем у IPsec?
                0
                На Android — да, при условии наличия модуля в ядре.
                На XDA уже масса ядер с модулем внутри.
                  +1
                  Т.е. это недоступно для большинства обычных пользователей?

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

                  Для гиков подойдёт на ура, кому надо — соберут нужные модули самостоятельно под свой телефон.
                  Но обычному пользователю все эти фишки не светят.
                    0
                    На андроиде он может работать и в юзерспейсе без рута, но и супер-скоростей ждать тоже не стоит, будет ± тот-же openvpn.
                    Правда нужны ли супер-скорости на смартфоне — вопрос тот ещё…
              0
              >> Кроме этого, IPsec поддерживает массу протоколов шифрования и обмена ключами, и клиент может выбрать оптимальный для себя при согласовании соединения.

              Ну это как бы и фича в то же время. WireGuard как бы говорит, что их протокол как раз использует самые надежные шифронаборы (зачем вам другие?) и в случае нахождения проблем будет обновляться вся программа. В случае например OpenVPN вам придеться самостоятельно за этим следить и менять конфиг.
                0
                как раз использует самые надежные шифронаборы (зачем вам другие?)

                Самые надёжные наборы — это спорное утверждение, которого разработчики и не делали вовсе. Разнообразие наборов шифров нужно по следующим причинам:
                • Чтобы не делать ставку на одно сочетание всех криптографических примитивов. Если так случится, что один из криптографических примитивов окажется уязвимым, то это делает весь протокол бесполезным без вариантов.
                • Чтобы предоставить возможность выбора. Причин для выбора может быть много: скорость работы какого-либо шифра на конкретном устройстве или личные предпочтения, например.
                  0
                  Я понимаю вашу точку зрения. Я веду к тому, что в случае нахождения уязвимостей в шифронаборе WireGuard будут обновлены пакеты програмы, где они будут либо переведены на другие алгоритмы, либо заменены. Не думаю, что в случае WireGuard их заменить прям невозможно и они захардкожены, это очень-очень вряд ли.

                  С другой стороны, в случае примером с OpenVPN, указаный шифронабор (с каким-то DES примером) будет указан в конфиге, и обновляй OpenVPN или нет — он там будет. Более того, составить корректный шифронабор — это не такая уж и простая задача.

                  Я не хочу сказать, что OpenVPN — это очень плохо или WireGuard — это мечта. Я веду к тому, что в этом есть смысл.
                    0
                    Не думаю, что в случае WireGuard их заменить прям невозможно и они захардкожены, это очень-очень вряд ли.

                    Просто констатирую факт: да, захардкожены; да, невозможно заменить. Смотрите спецификацию протокола (вот ссылка на форматы сообщений), она вообще не предусматривает вариаций по шифрам в сообщениях. См. также исходный код, к примеру составление хэндшэйка NOISE. Кривая 2255-19 гвоздями вшита. Что в принципе немудрено, с другой провернуть обфускацию не выйдет так просто, это индивидуально.
                +1
                > Главная проблема WireGuard в качестве VPN в том, что это не VPN. Это просто шифрованный тунель.

                Можете обьяснить разницу?

                > По поводу простоты конфигурации — сервер конфигурируется один раз и есть масса готовых рецептов и скриптов развёртывания VPN-серверов.

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

                > Однако, это большой плюс самого IPsec — он, помимо тунельного, может работать и в транспортном режиме, в отличие от wireguard.

                Тунельный и транспортный режимы? Что вы имеете ввиду?
                  0
                  Можете обьяснить разницу?

                  Я привёл сравнение в своём изначальном комментарии:

                  Главная проблема WireGuard в качестве VPN в том, что это не VPN. Это просто шифрованный тунель. Ближайшим аналогом того, что предоставляет wireguard, является вручную созданная Security Association средствами ядра Linux (например так).

                  Приведу ещё сопоставление, чтобы разница была ещё более явная: wireguard-у не хватает до VPN-а примерно того же, чего не хватает pppd до pptpd/xl2tpd/sstpd. Все эти демоны в конечном счёте хоть и используют pppd, но занимаются согласованием, созданием соединений и управлением ими. В вайргарде всё руками, как в туннелях, создаваемых прямо средствами ядра или в голом pppd. Все адреса назначает рутовый пользователь заблаговременно, он же вписывает все маршруты и так далее. Всё прибито гвоздями.

                  Тунельный и транспортный режимы? Что вы имеете ввиду?

                  Их и имею в виду.
                  Общие сведения
                  Более подробно

                    0
                    >> В вайргарде всё руками, как в туннелях, создаваемых прямо средствами ядра или в голом pppd. Все адреса назначает рутовый пользователь заблаговременно, он же вписывает все маршруты и так далее. Всё прибито гвоздями.

                    Это же еще не конечная реализация. Функционала не очень много, кто знает как будет дальше. Идейной разницы лично я не вижу.

                    В общем вы ведете к тому, что универсальное средство лучше частичного. Но даже если WireGuard делает что-то лучше — то почему его не использовать в этих случаях?

                    За ссылки спасибо.
                      0
                      Я немного о другом. Если, к примеру, у вас где-то есть VPN-сервер для удалённого доступа сотрудников к рабочему месту, то заменить его на вайргард не выходит потому что много чего не хватает до того, к чему все привыкли у VPN. Для личного пользования — годится, я сам его использую на OpenWRT, так как он там весьма к месту пришёлся. И памяти не требует, и с реконнектами дело хорошо обстоит.

                      Другие достоинства wireguard — один ciphersuite и протокол noise на достоинства не совсем тянут. Про один набор шифров я написал, это не так круто как кажется. А noise просто окажется несостоятелен, когда станут блокировать весь мутный трафик. В таких условиях даже SSTP на 443ем порту будет выигрывать.

                      А как VPN общего назначения IKEv2 до сих пор в топе, и на всех устройствах/системах хорошо поддерживается.
                        +1
                        На самом деле я понял вас, а вы, надеюсь, хоть немного поняли меня.
                        Прятать впн трафик под https — это не так о скорости, как об обходе блокировок.
                          +1
                          Да я понял. Да, об обходе блокировок.

                          Про скорость — приведу в пример проприетарный VPN, который использует несколько соединений для передачи данных, замаскированных под https. У меня временами в тестах получалась скорость по спидтесту через VPN в два раза больше, чем с тем же сервером без VPN вообще (!). Там у них вроде идёт программная регулировка передачи через каждый канал и обнаружение потери скорости по каждому с перераспределением на другие. Таким образом этот VPN даже скрадывает потери пакетов, вызывающие сокращение окна TCP и потерю скорости передачи по одному соединению. Называется, «было бы желание».
                  0
                  > Однако, как верно заметили в комментах, сейчас уже в пору маскироваться под валидный HTTPS-трафик.

                  HTTPS — это TCP, т.е. TCP over TCP в случае с ВПН sites.inka.de/bigred/devel/tcp-tcp.html
                  Но как опция может и не лишним будет.
                    +1
                    HTTPS — это TCP, т.е. TCP over TCP в случае с ВПН sites.inka.de/bigred/devel/tcp-tcp.html
                    Но как опция может и не лишним будет.

                    Есть альтернативное мнение на этот счёт. Я сторонник использования дейтаграмм для этих целей, однако не всегда есть такой выбор.
                • НЛО прилетело и опубликовало эту надпись здесь
                    0
                    настраивал впн между дроплетами в диджиталоушен потом тестировал пропускную способность с iperf
                    нативно ~ 1,9Гб/c
                    openvpn ~ 100Mб/c
                    wireguard ~500-600Mб/c
                  0
                  Думаю, это скорее вопрос времени.
                  +1
                  Ситуация сейчас такова, что пора уже сделать VPN, который целиком и полностью работает через https. Не мимикрирует под него, а действительно делает GET/POST по https в качестве транспорта при включении определенных настроек.
                  Да, медленно. Но пора.
                    +1
                    типа такого?
                    github.com/unbit/vpn-ws
                      0
                      Выглядит замороченно для конечного потребителя, но примерно такое я и имел в виду, да.
                        0
                        Зато ставится чуть ли не в 2 с пполвиной клика. Такой, в идеале, и должна быть установка бесплатных, типично-базововых сервисов, вроде почты, VPN, проксей. Основной трабл — CRL, как уже говорилось.
                        0
                        Агаа, Ну-Ну… Использовал этот гит-репозторий, весьма годная штука… была… пока через месяц после установки не протух CRL, а продакшн-клиентов уже было за сотню! Притом автор сего решения даже не соизволил об этом упомянуть, никак от слова вообще!!! Не говоря уже о решении этой траблы. Имхую, что цель такого сервака ни разу не продакшн, а сервак-однодневка — проработать месяц на одном VPS-хостинге, затем протухнуть/выпилиться и подняться «с нуля» на другом. Продлить CRL у меня получилось только на следующие 30 дней. Последующее продление так и не заработало. Скрипт CRL-обновления ругался на какие-то кривые атрибуты в СА. Проблема еще в том, что конкретно по CRL-проблеме на openVPN-е гугл знает не много. Пришлось заколхозить всё это дело скриптом в cron-е, по «откату» системного времени каждую ночь. До такой стыдобы я еще не скатывался. Надеюсь этот костыль выпилить в ближайшее время. Вторая трабла — все VPN-клиенты за-NAT-ченные, что тоже крайне неудобно для eterprise-структур, т.е. из LAN-ки клиента никак не достать. И поменять NAT на routing вообще никак и судя по всему, OpenVPN тупо не умеет раутить клиентов. Хотя тот же самый MS ISA умел это дело переключать одной галочкой. Третий трабл — около-нулевая секьюрность — *.ovpn-ключ-настройка на клиентах OpenVPN храниться в явном виде в папочке профиля фраерка и спикрасть его, имея доступ к ПК — как два байта отослать. Единственный плюс решения — работает даже через параноидально-защищенные фаерволлы, где хоть как-то разрешен TCP:443.
                          0
                          > OpenVPN тупо не умеет раутить клиентов
                          Вообще-то умеет.
                            0
                            поделитесь маном, пожалуйста. Желательно реально рабочим, а не кусочным.
                              +1
                              Маном к чему? К openvpn? Родной неплохо написан.
                              Для роутинга в openvpn (в разных направлениях) есть как минимум 3 параметра:
                              1) push-route (который на клиенте заворачивает маршруты в vpn)
                              2) iroute (для роутинга клиентов внутри vpn-сети)
                              3) client-to-client, который позволит клиентам общаться между собой (через vpn-сервер, но всё же).

                              Выбирайте любой подходящий для вашего случая.
                              А писать готовые рецепты на все возможные случаи для монстра, подобного openvpn — неблагодарная работа.
                            0
                            > *.ovpn-ключ-настройка на клиентах OpenVPN
                            > храниться в явном виде в папочке профиля фраерка

                            єє, так зашифруй сертификаты для VPN доступа, никто не заставляєт их хранить в открытом виде рядом с конфигами OpenVPN.
                              0
                              Мэээ, так подскажи, как шифровать. Понятно, что шифровать файловую систему нет особого смысла нет — сел за «залогиненную» учетку пользователя и слил *.ovpn. В идеале была бы технология как в винде — свое хранилище сертификатов и клей к ним, где можно ставить либо пароль на ключ либо метку «неэкспортируемый.»
                                0
                                Так на ключ в текстовом формате как раз и можно ставить пароль (на деле он шифруется ключом, выведенным из пароля).
                                  0
                                  Где можно наглядно посмотреть?
                                    0
                                    Если Вы генерируете сертификаты и ключи с помощью easy-rsa 2 из комплекта OpenVPN, то скрипт ./build-key-pass как раз такой и генерирует. А вообще средствами openssl это генерится например так:
                                    openssl genrsa -aes256 2048 > mykey.pem
                                      –1
                                      Скрипт генерации *.ovpn файла такой:

                                      #! /bin/bash
                                      # Script to automate creating new OpenVPN clients
                                      #
                                      # H Cooper — 05/02/11
                                      # Y Frolov — 08/06/16 — bundle config added (unified format)
                                      # Usage: newclient.sh <common-name>

                                      echo «Script to generate unified config for Windows App»
                                      echo «sage: newclient.sh <common-name>»

                                      # Set vars
                                      OPENVPN_DIR=/etc/openvpn
                                      OPENVPN_RSA_DIR=/etc/openvpn/easy-rsa
                                      OPENVPN_KEYS=$OPENVPN_RSA_DIR/keys
                                      BUNDLE_DIR=/etc/openvpn/bundles

                                      # Either read the CN from! or prompt for it
                                      if [ -z "!" ]
                                      then echo -n «Enter new client common name (CN): „
                                      read -e CN
                                      else
                                      CN=$1
                                      fi

                                      # Ensure CN isn't blank
                                      if [ -z “$CN» ]
                                      then echo «You must provide a CN.»
                                      exit
                                      fi

                                      # Check the CN doesn't already exist
                                      if [ -f $OPENVPN_KEYS/$CN.crt ]
                                      then echo «Error: certificate with the CN $CN alread exists!»
                                      echo " $OPENVPN_KEYS/$CN.crt"
                                      exit
                                      fi

                                      # Establish the default variables
                                      export EASY_RSA="/etc/openvpn/easy-rsa"
                                      export OPENSSL=«openssl»
                                      export PKCS11TOOL=«pkcs11-tool»
                                      export GREP=«grep»
                                      export KEY_CONFIG=`$EASY_RSA/whichopensslcnf $EASY_RSA`
                                      export KEY_DIR="$EASY_RSA/keys"
                                      export PKCS11_MODULE_PATH=«dummy»
                                      export PKCS11_PIN=«dummy»
                                      export KEY_SIZE=2048
                                      export CA_EXPIRE=3650
                                      export KEY_EXPIRE=1825
                                      export KEY_COUNTRY=«US»
                                      export KEY_PROVINCE=«CA»
                                      export KEY_CITY=«xxxxxxxx»
                                      export KEY_ORG=«xxxxxxxxxx»
                                      export KEY_EMAIL=«xxxxxxx»
                                      export KEY_OU=«RG»
                                      export KEY_NAME=«EasyRSA»

                                      # Copied from build-key script (to ensure it works!)
                                      export EASY_RSA="${EASY_RSA:-.}"
                                      "$EASY_RSA/pkitool" --batch $CN

                                      # Add all certs to unified client config file

                                      # Default config for client
                                      cp $OPENVPN_DIR/client.ovpn $BUNDLE_DIR/$CN.ovpn

                                      # CA
                                      echo "" >> $BUNDLE_DIR/$CN.ovpn
                                      cat $OPENVPN_KEYS/ca.crt >> $BUNDLE_DIR/$CN.ovpn
                                      echo "" >> $BUNDLE_DIR/$CN.ovpn

                                      # Client cert
                                      echo "" >> $BUNDLE_DIR/$CN.ovpn
                                      cat $OPENVPN_KEYS/$CN.crt >> $BUNDLE_DIR/$CN.ovpn
                                      echo "" >> $BUNDLE_DIR/$CN.ovpn

                                      # Client key
                                      echo "" >> $BUNDLE_DIR/$CN.ovpn
                                      cat $OPENVPN_KEYS/$CN.key >> $BUNDLE_DIR/$CN.ovpn
                                      echo "" >> $BUNDLE_DIR/$CN.ovpn

                                      if openvpn --version | grep 2.3; then
                                      # ta tls auth OpenVPN 2.3.x
                                      echo «key-direction 1» >> $BUNDLE_DIR/$CN.ovpn
                                      echo "<tls-auth>" >> $BUNDLE_DIR/$CN.ovpn
                                      cat $OPENVPN_KEYS/ta.key >> $BUNDLE_DIR/$CN.ovpn
                                      echo "</tls-auth>" >> $BUNDLE_DIR/$CN.ovpn
                                      else
                                      # ta tls crypt OpenVPN 2.4.x
                                      echo "<tls-crypt>" >> $BUNDLE_DIR/$CN.ovpn
                                      cat $OPENVPN_KEYS/ta.key >> $BUNDLE_DIR/$CN.ovpn
                                      echo "</tls-crypt>" >> $BUNDLE_DIR/$CN.ovpn
                                      fi

                                      # DH key
                                      echo "" >> $BUNDLE_DIR/$CN.ovpn
                                      cat $OPENVPN_KEYS/dh.pem >> $BUNDLE_DIR/$CN.ovpn
                                      echo "" >> $BUNDLE_DIR/$CN.ovpn

                                      #echo ""
                                      echo «COMPLETE! Copy the new unified config from here: /etc/openvpn/bundles/$CN.ovpn»

                                      Где здесь можно еще пароль прикрутить?
                                        0
                                        без понятия что это за скрипт.
                                        В моем коменте ниже, я написал как зашифровать.

                                        Оpenssl спросит пароль в процессе шифрования.

                                        После чего OpenVPN, видя что файл зашифрован, будет каждый раз при коннекте спрашивать пароль для дешифровки сертификата.
                                          –1
                                          Я заметил одно серьезное отличие — в вашем мане *.pem, а в моем конфиге *.ovpn. Что в деталях делает этот скрипт — я ХЗ, и как туда вставить *.pem тоже. И еще вопрос — поймет ли OpenVPN GUI формат pem?
                                            +1
                                            поймет, єто вполне стандартный формат.

                                            *.ovpn — это конфиг файлы OpenVPN, и сертификат может быть встроен прямо внутрь этого конфига. Так что .pem .crt .p12 и прочих файлов с ключами может не быть вовсе.

                                            Может вы всетаки почитаете документацию на OpenVPN??
                                      +1
                                      ну как-то так видимо:
                                      openssl pkcs12 -export -in temp.pem -out encrypted_key.p12

                                      а в конфиге опенвпна прописывается как обычно
                                      pkcs12 encrypted_key.p12

                                      Ничего сложного ;-)
                                    0
                                    надеюсь вы понимаете что вот эта метка «неэкспортируемый.», это чисто софтверная примочка, а сами ключи всеравно хранятся на жестком диске, а не в каком-то специальном хранилище которое они никогда не покидают.
                                      –2
                                      Всё лучше, чем хранить ключ в открытом виде. Буду рад если скинете пруф, что эта галочка бесполезная. На может и ЖД хранятся, но явно не в открытом виде.
                                        +1
                                        я не говорил что она бесполезная. Только о том что не стоит переоценивать ее возможности.
                                          –1
                                          Лучше чем ничего. Как мера против школоты и войтишников спасет наверняка. Среднему энетрпрайсу бОльшего и не надо. А сломать любую галочку (АКА любое шифрование) всегда возможно в этом мире — вопрос денег и времени. Обязательно сломают, не сегодня, так завтра, когда алгоритмы шифрования подпротухнут, а ASIC-и станут немного быстрее. Так что не стОит переоценивать возможности ничего и никогда.
                              +1
                              Cisco Anyconnect, если не ошибаюсь, может так работать. Для Shadowsocks есть обфусцирующие плагины, которые могут эмулировать POST-запрос. Obfsproxy тоже так может работать.
                                0

                                А также свободный аналог Anyconnect — openconnect/ocserv

                                +6
                                Зря заминусовали. Сейчас в странах Среднего Востока с цензурой уже почти весь нераспознанный трафик просто обрезают и всё. Поэтому где-то как-то можно пропустить шифрованный трафик только внутри валидного HTTPS-соединения.
                                  +1
                                  Есть ещё вот такой интересный инструмент.
                                    –1
                                    о, вот это уже серьёзно выглядит)
                                    Закинул в todo-ник на потестить.
                                  +1
                                  Как с поддержкой радиуса, назначения ip клиентам, работа на 443 порту по tcp, доступ с мобильных, разные сети для разных учетных записей?
                                    +1
                                    Никак, это просто туннель. По сути ближайший аналог того, что и сейчас доступно средствами IPsec через команду ip xfrm. Примеры.
                                    +1
                                    Кроме этого поддерживаются… Android… но в них WireGuard выполняется в userspace со всеми вытекающими последствиями для производительности.

                                    Если вендор наложил патчи на ядро (или есть возможность установки кастомного ядра), то будет выполняться на уровне ядра.
                                      +1
                                      В системах с systemd вместо этого можно использовать sudo systemctl start wg-quick@wg0.service.

                                      В системах с относительно свежим systemd ≥237 можно использовать встроенную в systemd‑networkd поддержку wireguard. С использованием юнитов .netdev и .network

                                        +1
                                        Для Windows доступен «альтернативный» клиент TunSafe.
                                        Им занимается автор μTorrent, OpenTTD и ScummVM: Ludvig Strigeus
                                          +1
                                          WireGuard, с моей точки зрения, вообще идеален для пользователя

                                          Генерируются ключи шифрования утилитой wg

                                          создать серверный конфиг /etc/wireguard/wg0.conf

                                          поднять туннель скриптом wg-quick

                                          Но самое интересное
                                          sudo wg-quick up /etc/wireguard/wg0.conf

                                          Я сравниваю два подчёркнутых слова и чего-то не понимаю 8-)
                                            +4
                                            Пользователя из группы wheel.
                                            +2

                                            Самой главной задачей любого туннеля или vpn, претендующих на "будущее", должна являться полная неотличимосиь со стороны DPI от повсеместно используемых "безобидных" протоколов типа HTTPS. Иначе нет смысла: каким бы стойким не было шифрования е и быстрыми алгоритмы, вы не сможете этим воспользоваться, когда государство тупо заблокирует ваш трафик как подозрительный

                                              +1
                                              Боюсь скоро государство захочет поставить централизованный вайлдкард сертификат и будет пытаться чекать весь https трафик и не спасет нас мимикрирование под известные протоколы…
                                                0
                                                Туннель внутри туннеля? В теории ведь VPN можно сделать из картинок с котиками. Да, это будет крайне медленно, неудобно и требовательно к ресурсам, но DPI и принудительный корневой сертификат не помогут.
                                                0
                                                Или не государство. Некоторые провайдеры и операторы тоже этим балуются, исключительно в силу того, что «могут».
                                                  0
                                                  Если вы подсовываете левый сертификат, то браузер просто не будет отображать сайт.
                                                    +2
                                                    Они не будут менять сертификат. Они порежут трафик с VPN/WireGuard/etc и успокоятся. К примеру, Yota местами так и делает.
                                                • НЛО прилетело и опубликовало эту надпись здесь
                                                    +1
                                                    VPN-технологии, такие как OpenVPN, SoftEther, Cisco AnyVPN и т.д. используются в том числе и для этого, поэтому никакой путаницы тут нет.
                                                    А вот регулирующие органы, кстати, наоборот могут перепутать, и занести ваш добропорядочный VPN для доступа в какую-нибудь корп. сеть тоже в блок-лист, если вы добровольно не впишетесь в белые списки и не дадите кому надо реквизиты доступа или не поставите роскомнадзоровские фильтры/ревизоры. Поэтому там маскировка под какой-нибудь HTTPS лишней тоже не будет.
                                                    +1
                                                    Будущее интернета, а не чебурнета некоторых нефтебанановых республик.
                                                    +1
                                                    Здесь нет сложной системы сертификатов и всего этого корпоративного ужаса, короткие ключи шифрования распространяются примерно как SSH ключи.
                                                    Сертификаты защищают от MITM атак и не относяться только к корпоративному сегменту. Без них у вас не будет другого выхода, кроме как передавать ключи по другим каналам связи, что неудобно для обычных пользователей. А если хотите передать безопасно и не в открытом виде, то это будет или передача при личной встрече или что-то с шифрованием и с теми же сертифкитами. Для vpn это, по моему, минус.

                                                    Да и «ужас» бывает не всегда, использую сертификаты letsencrypt для ipsec, вся настройка — это указать путь к сертификату на сервере, на клиенты сертификат ставить не надо.
                                                    +2
                                                    Прошу заметить, что помимо описанного в статье wg-quick, wireguard интерфейсы умеет создавать systemd-networkd (с какой-то там версии, уточните в документации):
                                                    # cat /etc/systemd/network/15-vpn.netdev
                                                    [NetDev]
                                                    Name=vpn
                                                    Kind=wireguard
                                                    
                                                    [WireGuard]
                                                    PrivateKey = SOME_PRIVATE_KEY
                                                    ListenPort = 51820
                                                    
                                                    [WireGuardPeer]
                                                    PublicKey = SOME_PUBLIC_KEY
                                                    PresharedKey = SOME_PSK_KEY
                                                    AllowedIPs = 172.16.0.0/12
                                                    Endpoint = 1.2.3.4:1234
                                                    


                                                    Если у вас сервер на systemd — не используйте wg-quick, это очень… Странная штука.
                                                      0
                                                      Поддержку в systemd впилили не так давно. На серверах, где обычно стабильные версии дистрибутивов, это будет еще не скоро
                                                        –1

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


                                                        Мой главный посыл — избегать wg-quick, его юнитов и т.п.

                                                      0
                                                      Такую простоту использования и компактность кодовой базы удалось достичь за счет отказа от функционала дистрибьюции ключей. Здесь нет сложной системы сертификатов и всего этого корпоративного ужаса, короткие ключи шифрования распространяются примерно как SSH ключи. Но в связи с этим возникает проблема: WireGuard будет не так просто внедрять в некоторых уже существующих сетях.

                                                      openvpn.net/community-resources/static-key-mini-howto
                                                        0
                                                        Так WireGuard не статик кей.
                                                        0
                                                        А как правильно прописывать маршруты через интерфейс wg на андроиде, если есть рут, и есть необходимость задавать их вручную? (Android использует iproute2 и несколько таблиц маршрутизации)
                                                          0
                                                          А зачем их прописывать на Андроид. Ну и VPN на андроид через отдельный API реализован и роутов вроде как и видно не будет.
                                                          0
                                                          Вы упомянули высокую производительность и даже результаты бенчмарков, а могли бы вы добавить что-нибудь насчёт системных требований?
                                                          Полагаю, что наиболее важным параметром будет объём оперативной памяти.

                                                          Т.е. VPS'а с какими параметрами будет достаточно для УайрГарда?
                                                          А то у них на сайт только kernel requirements есть.
                                                            +1

                                                            Мизерные требования, основной ресурс — cpu, на {де,}шифрование трафика и логику с ключами. Оперативной памяти вообще крохи — буквально несколько десятков килобайт.
                                                            VPS — любой совершенно, главное, чтобы ядро было своё родное. Т.е. предпочтительно kvm, можно xen, ни в коем случае openvz.

                                                              0
                                                              Прошу извинить, что отвечаю так поздно — из-за работы совсем не до хабра было.
                                                              Спасибо за уточнение, информация очень кстати на фоне испытаний нового The Great Firewall of Russia.

                                                              Если вас не затруднит, подскажите ещё пожалуйста: а почему «ни в коем случае openvz»? Там какие-то нужные функции не виртуализировали, нужна свежая версия kernel или что-то ещё?
                                                              А то как раз самые лучшие предложения по ВПС, разумеется, на ОупенВЗ.
                                                                0
                                                                нужна свежая версия kernel

                                                                В OpenVZ своё не сменяемое ядро, и сейчас оно очень старое, типа 2.6.32.
                                                                  0
                                                                  OpenVZ v7 вроде вышел давно. Там же вроде новее все. Ну и плюс WireGuard — это dkms модуль пока.
                                                            0
                                                            Подскажите, вот установил wireguard на сервер (все норм), подключаюсь с винды через tunsafe и все вроде хорошо конектится, вот только инет на компе остается прежним (с айпишником моего провайдера, а не сервера) :) Если знаете как это решить напишите пожалуйста, буду вам очень-очень благодарен!
                                                              +1
                                                              tunsafe.com/support
                                                              Q: Can I route all network traffic throgh TunSafe?
                                                              A: Yes, TunSafe configures the computer to route all traffic through the peer with AllowedIPs=0.0.0.0/0

                                                              т.е. на клиенте нужно прописать AllowedIPs=0.0.0.0/0 и убедиться, что маршрут по-умолчанию — это интерфейс WireGuard, когда он включен.
                                                              На сервере нужно не забыть включить IPv4 forwarding и masquerade в iptables, все это описано в мануалах.
                                                                0
                                                                > убедиться, что маршрут по-умолчанию — это интерфейс WireGuard, когда он включен.

                                                                На самом деле нет (или я не понимаю в чем дело). Но вот для OpenVPN это правда.
                                                              +1
                                                              Windows [coming soon]

                                                              A Windows client is coming soon. In the meantime, you are strongly advised to stay away from Windows clients that are not released from this site, as they may be dangerous to use, despite marketing efforts.

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

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

                                                              Выше уже написали про тонкости что это не VPN а туннель и если на OpenVPN я могу спокойно подсунуть готовый конфиг для подключения а маршрутизацию по умолчанию настроить прямо на сервере то как это всё делать с Wireguard — вероятно никак, потому что вручную на каждом клиенте ковырять что то это ужас.

                                                              Ну а в целом — да, очень хочется высокой скорости уже сейчас, а IPsec я так ниразу и не осилил, особенно вопрос как поднять сервер и как поднять сервер на Windows не смотря даже на подробные разбобры вроде этого habr.com/ru/post/210410. Человечного простого описания как подключиться с Android тоже так и не нашёл.

                                                              P.S. плюс ещё не понятно как решать проблему когда кроме SSL по 443 порту больше ничего не работает, а UDP не работает вообще. У OpenVPN клиента под Android даже автоматический костыль на этот случай есть, а для Wireguard как и для IPsec со всем этим беспросветное дно.
                                                                +1
                                                                P.P.S. в общем я чувствую что заморачиваться нужно с
                                                                SoftEther VPN он хотя бы универсальную админку ко всему даёт.
                                                                  +1
                                                                  Вот статья про настройку сервера с чистым IKEv2 (без L2TP) и настройку клиентов, в том числе Android. В случае в windows 10 обратите внимание ещё вот на эту ссылку.
                                                                    +1
                                                                    И ещё момент: аутентификацию со стороны сервера лучше всего сделать по сертификатам от того же Let's Encrypt, а клиента аутентифицировать всё же удобнее по паролю через ms-chapv2.
                                                                      +1
                                                                      Благодарю, очень хорошая статья, схоронил её в закладки, но я пока занялся тюнингом OpenVPN и несколько банальных настроек уже увеличили скорость в полтора раза. Так что пока я заморачиваться VPN который требует кучу портов не стану. Плюс OpenVPN может помочь соблюдать MTU в 1500 байт разбивая пакеты самостоятельно, а потом собирая их, скорость конечно проседает, зато совместимость хорошая.

                                                                      P.S. постараюсь заняться написанием статьи про OpenVPN «здорового человека», но так времени не хватает, что просто жуть.

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

                                                                Самое читаемое