Настройка VPN-сервера SoftEtherVPN под Linux

  • Tutorial

      Как уже писалось на хабре, буквально в начале января сего года под лицензию GPL2 перешел очень интересный и, в своем роде, уникальный проект — SoftEther VPN. Написали его студенты японского University of Tsukuba. Данный продукт позиционирует себя как VPN-сервер с поддержкой огромного количества туннельных протоколов: L2TP, L2TP/IPsec, L2TPv3/IPsec, MS-SSTP, EtherIP/IPsec, OpenVPN, SSL-VPN (собственной разработки), L2VPN, а также такие хитрые штуки как туннелирование через ICMP и DNS. Поддерживает туннелирование как на третьем, так и на втором уровне, умеет VLAN и IPv6. Работает практически на всех известных платформах (даже ARM и MIPS) и к тому же не требует рутовых прав. С полной спецификацией можно ознакомиться вот тут. Если честно, когда я увидел список возможностей этой проги — я просто не поверил своим глазам и подумал: «Если ЭТО работает, то я ДОЛЖЕН это потестить!»
      Эта статья будет описывать процесс установки и настройки SoftEther VPN Server под Линукс. В следующей статье постараюсь нарисовать красивые сравнительные графики производительности.
      Данная софтина обладает на редкость приятным интерфейсом под Винду, однако под Линуксом вся настройка осуществляется через CLI. Мануал безусловно хорош, но мне например показался чересчур подробным, и к тому же с перекосом в сторону графического интерфейса и излишне красочных японских картинок. Поэтому решил выложить основные команды CLI для тех, кому лень лопатить много английских букв.

      Для начала — установим это чудо. У меня под рукой был VPS с 64-битным Дебиан 7 на борту, поэтому выбор был очевиден. Сразу предупреждаю: устанавливать нужно только с GitHub'a (на текущий момент версия релиза 4.04 build 9412)! На оффициальном сайте можно скачать исходники под разные платформы, однако засада в том, что makefile'ы там сгенерированы каким-то садистки-западлистским способом, и на выходе вы получаете всего два файла — сам бинарник сервера и его CLI-шка. Никакого копирования в /usr/bin/ и прочих цивилизованных вещей там не прописано. В отличие от этого, makefile на Гитхабе ведет себя гораздо более дружелюбно (хотя инит-скрипт все равно не делает, зараза).

      Прежде чем поставить прогу, рекомендую сходить сюда и узнать, что ей нужно для установки. Мне, например, понадобилось поставить ряд библиотек (потом их можно снести):
# apt-get install libreadline-dev libssl-dev libncurses5-dev zlib1g-dev
      Дальнейшая установка не проста, а очень проста, однако хочу обратить внимание, что вместо «make install» я пишу «checkinstall», дабы менеджер пакетов apt знал о новой программулине и мог потом ее корректно удалить (подробнее здесь).
# git clone github.com/SoftEtherVPN/SoftEtherVPN.git
# cd SoftEtherVPN\
# ./configure
# make
# checkinstall
      В процессе установщик попросит вас прочитать Лицензионное соглашение, а также указать вашу платформу и разрядность ОС. Кстати, прогу он поставит по-любому в /usr/vpnserver/, а бинарники в /usr/bin/, имейте ввиду. Если путь установки не нравится, это можно руками поменять в makefile'е. В конце установки он скажет:
— Installation completed successfully.

Execute 'vpnserver start' to run the SoftEther VPN Server background service.
Execute 'vpnbridge start' to run the SoftEther VPN Bridge background service.
Execute 'vpnclient start' to run the SoftEther VPN Client background service.
Execute 'vpncmd' to run SoftEther VPN Command-Line Utility to configure VPN Server, VPN Bridge or VPN Client.
--------------------------------------------------------------------
      Отсюда можно логически понять, как это волшебство запускается и останавливается. Можно оставить и так, а можно взять с офф. сайта простенький init-скрипт, который будет более привычным нам способом делать то же самое.

      Итак, VPN-сервер установлен и его можно запустить:
# vpnserver start
SoftEther VPN Server Service Started.
      Приступаем к конфигурированию. Вообще, мануал предлагает нам два способа это сделать: через его собственную командную строку vpncmd или через конфигурационный файл vpn_server.config, причем огромное предпочтение отдается первому способу. Операции с конфигурационным файлом производитель считает рискованным занятием и всячески пытается нас от этого отговорить. Дело в том, что сервер непрерывно читает этот файл и любые изменения в нем мгновенно отражаются на работе сервера. Единственный случай, когда настройка из конфиг-файла оправдана — это когда VPN-сервер выключен. Не знаю, зачем так сделано, но автору, в любом случае, виднее. Да и вообще, у проги хорошая CLI, после работы с которой о существовании конфиг-файла просто забываешь за ненадобностью.

      Кстати, сразу после установки обратил внимание, что прога зачем-то стукнулась по адресу 130.158.6.77:80. Оказалось в этом нет ничего подозрительного, просто таким образом сервер посылает keepalive-пакеты на свой сайт (keepalive.softether.org:80), чтобы не рвались по таймауту разные PPP-сессии. Сразу после установки я эту функцию отключил командой KeepDisable.

      Итак, сразу после запуска VPN-сервер уже работает и принимает подключения на порты TCP 443 (SSL VPN), 992, 1194 (OpenVPN) и 5555 (номера портов можно поменять командами ListenerCreate и ListenerDelete), однако чтобы начать использовать его необходимо сделать ряд простых настроек. Заходим в CLI командой vpncmd:
# vpncmd
vpncmd command - SoftEther VPN Command Line Management Utility
SoftEther VPN Command Line Management Utility (vpncmd command)
Version 4.04 Build 9412 (English)
Compiled 2014/01/15 17:22:14 by yagi at pc25
Copyright (c) SoftEther VPN Project. All Rights Reserved.

By using vpncmd program, the following can be achieved.

1. Management of VPN Server or VPN Bridge
2. Management of VPN Client
3. Use of VPN Tools (certificate creation and Network Traffic Speed Test Tool)

Select 1, 2 or 3:
      Выбор 1 перенесет нас в режим редактирования сервера, выбор 2 — в режим редактирования свойств клиента, а выбор 3 — режим тестирования и создания сертификатов сервера. Выбираем 1, сервер предложит ввести айпи адрес сервера, к которому мы хотим подключиться (Hostname of IP Address of Destination:), просто нажимаем Enter, т.к. собираемся редактировать локальный сервер. В третий и последний раз прога спросит нас имя виртуального хаба (Specify Virtual Hub Name:), с которым мы будем работать. Мы пока что не собираемся работать с виртуальными хабами, поэтому снова нажимаем Enter и попадаем в командную строку самого сервера.

      Необходимо пояснить, что такое виртуальные хабы в терминологии разработчика. Виртуальный хаб — это некая довольно самостоятельная инстанция VPN-сервера, обладающая собственным набором настроек виртуальных интерфейсов, политик безопасности и протоколов VPN. Всего можно создать до 4096 виртуальных хабов, при этом они никак не будут пересекаться друг с другом ни на 2-ом, ни на 3-ем уровне — то есть будут полностью изолированы друг от друга. Каждый виртуальный хаб работает со своим набором пользователей и ничего не знает про пользователей другого виртуального хаба, хоть они и находятся на одном физическом сервере. С другой стороны, если мы захотим, мы можем настроить их взаимодействие друг с другом, в терминологии автора это называется Virtual bridge/router. Таким образом, виртуальный хаб — это и есть то, с чем мы будем работать после указания определенных глобальных настроек сервера.

      После входа в vpncmd перед нами возникнет приглашение:
Connection has been established with VPN Server "localhost" (port 443).

You have administrator privileges for the entire VPN Server.

VPN Server>
Можно ввести help и почитать список команд.
      Первое, что мы должны сделать — это задать рутовый пароль сервера. Делается это командой ServerPasswordSet. Далее, как я уже писал командой KeepDisable отключаем keepalive-пакеты.
Далее, создаем виртуальный хаб командой HubCreate <имя виртуального хаба>, например
VPN Server>hubcreate vpn
HubCreate command - Create New Virtual Hub
Please enter the password. To cancel press the Ctrl+D key.

Password:
      Можно задать админский пароль для нового хаба, тогда можно будет делегировать администрирование этого хаба другому человеку. А можно для простоты нажать Enter и не делать этого (для этого в дальнейшем есть команда SetHubPassword). После создания хаба мы должны перейти в режим администрирования этого хаба командой Hub vpn. Посмотреть статус хаба можно командой StatusGet. Не буду приводить здесь вывод этой команды, т.к. он длинный и довольно понятный. Хаб можно выключить командой Offline и вернуть обратно командой Online.

      Мне понравилась команда SetEnumDeny. Дело в том, что когда в VPN-клиенте вводишь адрес VPN-сервера, он сразу же сдает тебе имена всех виртуальных хабов, зарегенных на сервере, как на картинке. Эта команда запрещает выводить имя данного хаба в списке. Типа небольшой, но бонус к безопасности.



      Ладно, займемся более интересными вещами. Создаем пользователя командой UserCreate и задаем ему пароль при помощи UserPasswordSet. Команды очень простые, достаточно минимального знания английского, чтобы понять диалоговые сообщения сервера. На данном этапе для простоты не будем возиться с сертификатами, а доверимся самоподписанному сертификату сервера, который он сгенерил на этапе установки.

      Вот в принципе и все, минимальная установка завершена и мы можем прицепиться к нашему серверу, указав его IP-адрес и любой из портов списка ListenerList. Автор рекомендует порт 5555, поскольку данный порт не требует рутовых прав в системе. Окно VPN клиента я уже приводил выше, там все интуитивно понятно и очень красиво. Аутентификация проходит и устанавливается VPN-туннель. Однако, в таком виде пользы от туннеля мало, т.к. он позволяет обращаться только к самому серверу и больше никуда.

      Допустим, наша задача более широка, и мы хотим использовать VPN-сервер для доступа в корпоративную сеть. Для этого нам понадобиться настроить NAT. Делается это довольно просто командой SecureNATEnable. Автоматом вместе с NAT включается и DHCP.

      Вообще, SecureNAT — это довольно интересная технология от авторов SoftEtherVPN. Как мы знаем, трансляция сетевых адресов в *NIX-системах осуществляется в ядре, соответственно для настройки NAT нужно иметь права суперпользователя. Создатели SoftEtherVPN решили, что это слишком излишне и написали свой собственный кастомный стек TCP/IP для того, чтобы фильтрация и натирование осуществлялось в userspace. Прикольная задумка, не знаю стоило ли оно того, но работает — это факт!
      Сменить адрес интерфейса SecureNAT'a можно командой SecureNatHostSet (по умолчанию 192.168.30.1/24), а диапазон выдаваемых адресов и другие опции DHCP (например, основной шлюз и DNS-сервера) — командой DhcpSet. Не правда ли, дружелюбная CLI? Например если ввести «secure?» и нажать Enter, то выведется список возможных автодополнений:
VPN Server/vpn>secure?
"secure": The command-name is ambiguous.
The specified command name matches the following multiple commands.
SecureNatDisable - Disable the Virtual NAT and DHCP Server Function (SecureNat Function)
SecureNatEnable - Enable the Virtual NAT and DHCP Server Function (SecureNat Function)
SecureNatHostGet - Get Network Interface Setting of Virtual Host of SecureNAT Function
SecureNatHostSet - Change Network Interface Setting of Virtual Host of SecureNAT Function
SecureNatStatusGet - Get the Operating Status of the Virtual NAT and DHCP Server Function (SecureNat Function)
Please re-specify the command name more strictly.
      По умолчанию никакая фильтрация пакетов не применяется, т.е. впн-клиенты могут неограниченно ходить в корпоративную подсеть и пользоваться корпоративным Интернетом, если таковой имеется. При желании можно добавить правила файрволла командой AccessAdd. В качестве критериев файрволла можно указать имя пользователя, MAC и IP адреса источника и назначения, порты, протоколы и флаги TCP. И самое главное, что это работает, я проверял! Учтите еще, что правила фильтрации разных виртуальных хабов никак не влияют друг на друга, что позволяет гибко управлять доступом к корпоративной среде.

      В качестве приятного бонуса доступен Dynamic DNS от softether.net. Свой VPN-сервер можно зарегить в DDNS командой DynamicDnsSetHostname, после чего нужно ввести желаемое имя домена 3-го уровня. Получится что-то вроде myvpn.softether.net. Согласитесь, мелочь, а приятно и притом совершенно бесплатно!

      Поговорим о протоколах VPN. Я протестил L2TP/IPsec и OpenVPN. Настройка двух, казалось бы, таких разных протоколов оказалась довольно простой. OpenVPN включен изначально на порту 1194 UDP, но чтобы оно заработало нужно в режиме глобального сервера (команда Hub без параметров) ввести IPsecEnable, после чего ответить на ряд вопросов на предмет того, хотим ли мы включить голый L2TP, шифрованный L2TP/IPsec, а также L2TPv3/IPsec. Самые главные вопросы — это Pre-shared key (PSK) для IPsec и Default Hub. С PSK все понятно, это ключ, который необходимо ввести на клиентском устройстве, а вот про Default Hub расскажу поподробнее.

      Дело в том, что тот же OpenVPN работает не через IPsec, но наследует политику учетных записей из IPsec. Поэтому при попытке коннекта по протоколу OpenVPN будет запрошено имя пользователя и пароль. Имя пользователя обязательно нужно вводить в формате «пользователь@хаб», но если мы указываем, какой хаб использовать по умолчанию, то "@хаб" можно опустить.

      Сгенерировать конфиг-файл для OpenVPN можно командой OpenVpnMakeConfig, после чего указать местоположение, куда сохранить сгенереный файл. Этот файл можно тут же скормить OpenVPN клиенту и коннект пойдет. Файл предоставляется сразу в двух вариантах — Layer2VPN и Layer3VPN, то бишь VPN-сервер как свич, и VPN-сервер как роутер. И то, и другое прекрасно работает. Удобно!

      Настройка L2TP/IPsec оказалась вообще тривиальной: на сервере после команды IPsecEnable ничего менять уже не надо, а в настройках например виндового встроенного VPN-клиента нужно указать протокол «L2TP IPsec VPN», в дополнительных параметрах указать предварительный ключ (PSK), который мы уже устанавливали, ну и, само собой, ввести учетные данные в формате, о котором я упоминал выше.
      Аналогичным образом все настраивается на Андроиде. Было проверено на 4.2.1, все работает с использованием только стандартных инструментов.

      Вывод: SoftEtherVPN — очень мощное и, самое главное, удобное средство построения VPN-туннелей. Конечно, я протестировал далеко не все возможности, но в большинстве случаев хватает и тех, что я написал. В ближайшем будущем постараюсь выложить сравнительные тесты производительности, а также тесты таких смешных штук как VPN over ICMP и DNS. С протоколами SSL VPN и MS SSTP пока связываться не хочу, т.к. неохота возиться с сертификатами, к тому же надо еще посмотреть на такие фичи проги, как Load Balancing aka кластеризация, отказоустойчивость, авторизация из RADIUS и AD и Layer2 VPN, включая VLAN-транкинг!

      Так что, мне кажется, софтина стоит, как минимум, того, чтобы приглядеться к ней повнимательнее. Производитель позиционирует свой продукт, как во всем превосходящий OpenVPN, даже обещает throughput под гигабит. В общем, надо тестить! На данном этапе мне эта штукенция очень даже нравится.
Share post

Similar posts

Comments 50

    +8
    вот как в пакеты засунут — присмотрюсь внимательнее :) А то самому следить за обновлениями безопасности такой громадины мне облом
      +1
      Если будете писать еще — было бы интересно почитать, про тунелирование через ICMP и DNS.
        0
        Он pptp умеет?
          0
          В мануале ничего на этот счет не сказано, значит, видимо, не умеет
            0
            Увы.

            Пока что я для себя его отметил, но особого интереса не вижу. Ну да, ещё один vpn. С учётом, что два туна или тапа можно объединить ssh, openvpn, sstunel и ещё пачкой других методов — ну да, ещё один.

            +1
            Умеет.
            Однако у меня от короткого знакомства с ним сложилось впечатление что ресурсов он кушает куда больше стандартных решений…
              +1
              Умеет? А где настраивать? Вроде как, не умеет он его.
                0
                Пардоньте. Ошибся. Спутал с l2tp, так как его у меня точно так же поддерживают все девайсы от смарта до роутера…
              +3
              Кому в наше время нужен pptp? Как минимум есть l2tp, если нужно что-то стандартное, и мульён прочих если не нужно.
                +1
                Плюс PPTP в том, что его умеют все.
                Вот мне, например, проще PPTP на телефоне настроить, чем мучиться с какими-то сертификатами или левыми клиентами.
                  0
                  OpenVPN же клиенты выпустил. Конечно можно не доверять клиентам из стора, но чем это лучше потенциально уязвимого pptp.
                    +2
                    Я на телефоне (андроид) как два пальца настраиваю L2TP с IPSEC безо всяких сертификатов — просто через pre-shared-key.

                    В итоге имеем:
                    1. Шифрование туннеля
                    2. Гораздо лучшую проходимость через всякие провайдерские файрволлы и NAT-ы т.к. PPTP использует GRE, который через одного блокируют, а L2TP/IPSEC при невозможности установления прямого ESP-соединения откатывается на инкапсуляцию в UDP, который проходит везде.

                    Я в свое время с PPTP намучался — не могут клиенты с телефона подключиться или с йоты какой-нибудь. Перевел на L2TP/IPSEC — проблем не знаю.
                      0
                      l2tp/ipsec через nat работает? Насколько я знаю, ipsec не очень с натом дружит…
                        0
                        Дружит, но с оговорками. У некоторых реализаций серверов есть проблемы при работе несколько клиентов находящихся за одним натом. Точнее говоря работать может только один клиент, остальных дисконнектит. В openswan это решается при помощи XFRM marks. ISA вроде бы тоже умела решать эту проблема.
                        А собсно проблема заключается в том, что несколько l2tp клиентов одновременно пытаются создать ipsec с одинаковым IPsec policy [udp/l2tp] === [udp/l2tp].
                        И… проблема только при использовании psk. С сертификатами такой беды нет.
                          0
                          Это, я думаю, ограничения конкретного сервера, а не протокола. У меня такой проблемы нет.
                            0
                            Так и есть. В двух известных мне реализациях ipsec под linux есть такая проблема. В openswan для этого используется можно включить XFRM marks. Как это решить в Racoon я даже не знаю. Если в SoftEtherVPN эта проблема решена, то это большое преимущество перед другими linux серверами.
                          0
                          Работает отлично через IPSEC NAT Traversal. Насчет нескольких клиентов за одним NAT-ом тоже проблемы такой не видел — коннектился из дома с двух ноутов одновременно — никаких проблем. Внешний IP один. В качестве сервера L2TP — Cisco ASA, клиенты стандартные в Win и OSX.
                      +1
                      l2 работает на l2. И через интернет не работает. сбрехал, ушёл читать.
                      pptp от openvpn отличается тем, что андроид его из коробки умеет. И умеет ограничивать весь трафик, если pptp лежит. А клиент openvpn этого не умеет, увы. Так что я для телефона использую pptp туннель, а для остальных машин — openvpn.
                        0
                        У него такое название — Layer2 — потому что через него еще можно и ethernet туннелировать, при желании. Правда, только в версии протокола v3 в режиме pseudowire. А так он работает по самому обычному UDP. И на него уже полностью почти перешел билайн для предоставления доступа домашним абонентам т.к. скорость работы тупо выше и не сильно грузит BRASы.

                        Да, андроид его тоже поддерживает из коробки, есличо.
                          0
                          Да, надо будет попытаться поднять. pptp меня всегда раздражал своей странной pp-логикой.

                          Кстати, можно попытаться использовать те же сертификаты, что для openvpn. Получится, наверное, забавно.
                          0
                          Умеет он все, умеет. OpenVPN Connect → Preferences → Seamless Tunnel.
                      +4
                      Я вот тут хвалю эту софтину, понимаете ли, а она тем временем на моей VPS-ке понаоткрывала штук 20 соединений со всеми частями света! Что-то мне это перестает нравится… Пока понаблюдаю за ее поведением, благо VPS-ку не жалко…
                        +1
                        Ну так вы случайно не включили vpngate?
                          0
                          А как это смотреть через CLI? Вроде виртуального хаба VPNGATE у меня нету…
                            +8
                            Ой, дурак я дурак… Это же мой собственный комп и понаоткрывал столько сессий, впн же встает основным шлюзом )) да уж… глупо вышло ))
                        +2
                        Поднял у себя на впске в хецнере под дебианом.
                        Ресурсов жрёт много, на одной машине с ejabberd уживается с трудом (при том, что серверами пользуюсь сугубо я). L2TP работает, PPTP работает, OpenVPN не проверял. Немного пришлось покрутить конфиг, чтобы отбить желание софта юзать DDNS и прочую ерунду, но в остальном претензий пока нет.
                          +1
                          Интересно, сколько одновременных сессий выдержит и обгонит ли accel-ppp?
                            0
                            Да не поддерживает он pptp!
                              0
                              accel-ppp вполне себе поддерживает еще и l2tp (v2), pppoe, ipoe/l2/vlan
                              0
                              По скорости у них есть графики http://www.softether.org/@api/deki/files/12/=1.3.jpg, по количеству одновременных сессий не видел.
                              +1
                              сервер непрерывно читает этот файл и любые изменения в нем мгновенно отражаются на работе сервера
                              прога зачем-то стукнулась по адресу 130.158.6.77:80
                              WTF??? Ну и NAT в юзерспейсе — тоже сомнительное преимущество. Хотя, конечно, красиво описано.
                                +2
                                Прикол NAT в юзерспейсе в том, что вам не нужно даже TUN/TAP использовать для него. Грубо говоря, можно даже на шаред-хостинге с shell-доступом без рут прав и без загрузки модулей поднять VPN.
                                +2
                                Судя по стилю настроек про unix-way авторы не слышали. Напоминает wizard-ы… То есть спец прога пишет конфиг, а демон всё время его читает. Жуть какая.

                                Не понятно зачем дублировать хорошо работающие функции фильтрования и роутинга пакетов, которые обычно работают на уровне ядра своим велосипедом в user-space.
                                  0
                                  Он так дырку в жёстком диске протрёт.
                                    +1
                                    Будем надеятся, что ядро довольно умное и закеширует =)
                                    0
                                    Согласен. Хотя насчет конфиг-файла, такой же схемой пользуются в маршрутизаторах Juniper Networks. То бишь вроде ничего особо криминального. А вот насчет натирования и фильтрации — явный велосипед. Почему-то авторы проги очень сильно хотели чтобы она работала в чистом юзерлэнде. Зачем, не совсем понятно…
                                      0
                                      Возможно потому, что проект кроссплатформенный.
                                        0
                                        Что мешало сделать кросплатформенные биндинги к разным OS? Это как раз пахнет окошечной одноплатформенностью, а *nix прибили гвоздями.
                                    0
                                    С протоколами SSL VPN и MS SSTP пока связываться не хочу

                                    Как раз хотелось бы узнать тест работы SSL VPN (SoftEtherVPN), потому что только для этого протокола заявляется поддержка почти до 1 Гбит/с, а точнее 980 Мбит/с, хотя это и не укладывается в моём мозгу с учётом вложенности в HTTPS. К тому же заявляется, что он единственный необнаружим для фаерволов (стандартный HTTPS).
                                      0
                                      Кто-нибудь разобрался, как в свойствах клиента указать, что я хочу прицепиться по ICMP или DNS? В мануале ни слова про это…
                                        0
                                        А разве не автоматом при невозможности иного?
                                        0
                                        Спасибо за напоминание :)
                                        пойду попробую завести на FreeBSD.
                                          0
                                          Удалено, ошибся вкладкой.
                                            0
                                            авторизация из RADIUS и AD

                                            Этот функционал пока не доступен.
                                              0
                                              Сертификаты у IPSec тоже.
                                              0
                                              Как я понял, динамический DNS выдается автоматом в последней версии, т.к. сразу увидел его по DymanicDnsGetStatus
                                                0
                                                смешных штук как VPN over ICMP и DNS.
                                                Уже не смешно https://geektimes.ru/post/289897/
                                                  0
                                                  Можно ли поменять udp порт и MTU IPSec, чтобы успешно проходить 2ip.ru/privacy?
                                                    0
                                                    android6 — l2tp ipsec не подрубается, «сбой» моментально. В логах сервера чет пусто…
                                                      0
                                                      пардон, завелось

                                                    Only users with full accounts can post comments. Log in, please.