Русский
Русский
English
Статистика
Реклама

Openvpn

Прокладываем L2 туннели в OpenVPN

03.07.2020 12:17:33 | Автор: admin

Недавно меня попросили разобраться в настройке L2 туннеля для моста между двумя удалёнными локальными сетями, и я был поражён, насколько мало удобных решений мне удалось найти. Раньше я не интересовался этой темой и наивно полагал, что любой адекватный VPN-протокол умеет ловить широковещательные пакеты и пересылать их по обычному L3 туннелю. К сожалению, доступных из коробки универсальных решений нет. Есть несколько протоколов и инструментов для них, большинство из которых работает в очень ограниченных условиях или вовсе объявлено deprecated. Самым приятным вариантом я поделюсь дальше.

Почему именно L2?


Этим вопросом я задался в первую очередь: я довольно редко работаю с сетевой периферией, и мне казалось что довольно давно уже всё оборудование умеет ходить по L3. Как бы не так: кому-то нужен доступ к офисным принтерам, кому-то к видеорегистраторам, а кто-то просто хочет зарубиться с другом в LAN-дуэли не выходя из дома, разумеется. Также очень привлекательной выглядит идея общих/сетевых папок в офисе, доступных из дома, особенно в период повальной удалёнки.

При этом среди разработчиков VPN-клиентов L2-бриджи почему-то считаются чем-то вроде странного каприза одного-двух процентов пользователей, который по большому счёту никому не нужен. Совсем иначе обстоят дела в промышленных сетях, где много устаревшего или плохо совместимого оборудования, и концепция L2VPN (представленная кучей других аббревиатур) реализована на уровне сети и оборудования провайдера.

Технологии


Их много, и они все работают со странностями и ограничениями:

  • Например, протокол Layer 2 Tunneling Protocol (L2TP) должен, судя по названию, обеспечивать поддержку OSI L2 и в том числе проброс broadcast'a. Но нет, общепринятая связка L2TP + IPsec не позволяет бриджевать сети на уровне L2!
  • PPTP стал мемом из-за крупных уязвимостей, сейчас кое-как починен, но к L2 уже не имеет отношения.
  • MPLS жутко запутанный промышленный протокол на основе меток. Изучить его сложно, а поднять можно только на специализированном железе или RouterOS (с ограничениями, куда ж без них).
  • PPPoE и феерический PPPoEoE тоже работают, но на проприетарных железках. Режим PPPoE вообще есть на многих роутерах, но как его правильно готовить известно по большей части только на фирменном оборудовании типа Cisco.
  • EoIP должен быть стать тем самым L2VPN made right, но он тоже работает только на микротиках, что существенно сужает круг применения. Как и PPTP, использует GRE, не проходит через NAT.

И тут я с удивлением обнаружил, что настоящий Ethernet Bridging умеет OpenVPN!

Мы часто пользуемся личным или рабочим VPNом, у многих он вообще включён на постоянной основе для обхода блокировок (хотя эта тенденция идёт на спад после снятия блокировки Telegram). В своих рабочих задачах я тоже постоянно пользуюсь удаленными хостами для разработки, и почти всегда использую OpenVPN. Долгое время я не понимал, зачем нужна связка OpenVPN Access Server + OpenVPN Connect на клиенте. Для моих задач мне всегда хватало классической версии с ручной правкой конфигов, и выделенные админки и GUI казались неуместными в стройном тонком клиенте. Но оказалось, что для настройки бриджа интерфейс гораздо удобнее чем простыни конфигов в терминале, хотя и с ним не всё идеально.

Настройка


Дело в том, что Access Server (AS) выходил как платный и довольно дорогой продукт, поэтому в него старательно напихали всевозможных плюшек, лишь бы купили. Таким образом в веб-админке появился подпункт меню, позволяющий выбрать режим сети (L2 bridging/L3 routing), а через какое-то время тихонько был оттуда выпилен по всё той же причине это никому не нужно. Тем не менее, сам функционал бриджинга и соответствующие скрипты не удаляли и их по-прежнему можно настроить.

Установка


Нам потребуется сервер или виртуальная машина. Образ для неё находится на странице загрузки, а мы будем дальше разбирать кейс с установкой на сервер под Ubuntu 18.04:

apt update && apt -y install ca-certificates wget net-tools gnupgwget -qO - https://as-repository.openvpn.net/as-repo-public.gpg | apt-key add -echo "deb http://as-repository.openvpn.net/as/debian bionic main">/etc/apt/sources.list.d/openvpn-as-repo.listapt update && apt -y install openvpn-as

После установки сервер поднимется самостоятельно, вы увидите такое сообщение:

+++++++++++++++++++++++++++++++++++++++++++++++Access Server 2.8.4 has been successfully installed in /usr/local/openvpn_asConfiguration log file has been written to /usr/local/openvpn_as/init.logAccess Server Web UIs are available here:Admin  UI: https://185.209.31.165:943/adminClient UI: https://185.209.31.165:943/+++++++++++++++++++++++++++++++++++++++++++++++

Сразу нужно указать пароль для админской учётки:

passwd openvpn

Затем можно открывать админку в браузере (на :943/admin, как указано выше), логиниться под пользователем openvpn с указанным паролем и настраивать сервер.



AS бесплатна для использования двумя пользователями, дальше можно добавлять только за $18/месяц за одного пользователя, так что лучше сразу спроектировать свои процессы под использование туннеля двумя клиентами.

Возвращаем бриджинг


cd /usr/local/openvpn_as/scripts./sacli --key "von.general.osi_layer" --value "2" ConfigPut./sacli start

Если всё прошло успешно, в выведенном json'е будет такое:

{ "errors": {}, "last_restarted": "Thu Jul  2 00:07:37 2020", "service_status": {   "api": "on",   "auth": "on",   "bridge": "on",        ...    }}

В админке статус OSI Layer: 3 (routing/NAT) поменяется на 2 (bridging)

NB: в последних версиях может оставаться информация о L3 при включённом bridge. Почему не разбирался, безопасные в этом плане версии около 2.4

Собственно на этом ноу-хау заканчивается, дальше вам нужно просто настроить под себя сервер, завести второго пользователя через тот же веб-интерфейс и залогиниться на пользовательскую страницу на 943 порту (без /admin). Там будут ссылки на скачивание клиентов OpenVPN Connect под все платформы с запечённым конфигом для подключения (кроме мобильных приложений, там придется вбить адрес вручную, а дальше всё само установится).



После успешного подключения и бриджевания клиентов, будет доступен L2-туннель с TCP/UDP трафиком. Клиенты могут выступать натом для внутренней сети, это всё тоже настраивается в админке.

Подробнее..

Что лучше выбрать Wireguard или OpenVPN? Любимый VPN Линуса Торвальдса

12.01.2021 16:20:24 | Автор: admin


Технологии VPN редко становятся объектами пристального внимания: есть и есть. Создатель Wireguard Jason A. Donenfeld оказался везунчиком после нетипичной для Линуса Торвальдса резко хвалебной оценки качества кода.

Can I just once again state my love for it and hope it gets merged soon? Maybe the code isnt perfect, but Ive skimmed it, and compared to the horrors that are OpenVPN and IPSec, its a work of art.

Вскоре после этого Wireguard оказался в основной ветке стабильного ядра Linux. Чем же Wireguard так замечателен и отличается от остальных VPN?

Шифрование: отличия Wireguard от OpenVPN


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

Протоколы шифрования Wireguard


  • Краткость сестра таланта 4000 строк кода стало чуть ли не визитной карточкой Wireguard.
  • Детерминированный набор современных криптографических алгоритмов:
  • ChaCha20 для симметричного шифрования также используется в AEAD структуре RFC7539;
  • Poly1305 для аутентификация, также используется в AEAD структуре RFC7539;
  • Curve25519 эллиптическая кривая для протокола безопасного обмена ключей Diffie-Hellman;
  • Blake2 в RFC7693 соответствующая хеш-функция;
  • SipHash2-4 псевдослучайная функция для поиска расшифрованных открытых ключей инициатора сессии установления связи;
  • HKDF для извлечения ключей;
  • UDP в качестве протокола транспортного уровня;
  • Perfect forward secrecy принцип предотвращения компрометации сессионных ключей.

В отличие от OpenVPN, Wireguard не использует сертификаты X.509 и лишен сопутствующих проблем. Вместо этого Wireguard использует асимметричное шифрование с открытым и закрытым ключом.

Протоколы шифрования OpenVPN


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

aes-128-cbc aes-128-ecb aes-192-cbc aes-192-ecb
aes-256-cbc aes-256-ecb aria-128-cbc aria-128-cfb
aria-128-cfb1 aria-128-cfb8 aria-128-ctr aria-128-ecb
aria-128-ofb aria-192-cbc aria-192-cfb aria-192-cfb1
aria-192-cfb8 aria-192-ctr aria-192-ecb aria-192-ofb
aria-256-cbc aria-256-cfb aria-256-cfb1 aria-256-cfb8
aria-256-ctr aria-256-ecb aria-256-ofb base64
bf bf-cbc bf-cfb bf-ecb
bf-ofb camellia-128-cbc camellia-128-ecb camellia-192-cbc
camellia-192-ecb camellia-256-cbc camellia-256-ecb cast
cast-cbc cast5-cbc cast5-cfb cast5-ecb
cast5-ofb des des-cbc des-cfb
des-ecb des-ede des-ede-cbc des-ede-cfb
des-ede-ofb des-ede3 des-ede3-cbc des-ede3-cfb
des-ede3-ofb des-ofb des3 desx
idea idea-cbc idea-cfb idea-ecb
idea-ofb rc2 rc2-40-cbc rc2-64-cbc
rc2-cbc rc2-cfb rc2-ecb rc2-ofb
rc4 rc4-40 rc5 rc5-cbc
rc5-cfb rc5-ecb rc5-ofb seed
seed-cbc seed-cfb seed-ecb seed-ofb
sm4-cbc sm4-cfb sm4-ctr sm4-ecb


Для хеш сумм доступны такие функции.

(1:701)$ openssl dgst --list

Supported digests:

-blake2b512 -blake2s256 -md4
-md5 -md5-sha1 -mdc2
-ripemd -ripemd160 -rmd160
-sha1 -sha224 -sha256
-sha3-224 -sha3-256 -sha3-384
-sha3-512 -sha384 -sha512
-sha512-224 -sha512-256 -shake128
-shake256 -sm3 -ssl3-md5
-ssl3-sha1 -whirlpool

OpenVPN в связке с OpenSSL поддерживает PKI стандарты RSA, DSA и ECDSA, однако не все из них пригодны для любых пользовательских сценариев. Так, ключи ECDSA пока еще не получили широкой поддержки со стороны корневых CA.

  • UDP/TCP в качестве протокола транспортного уровня;
  • Perfect forward secrecy принцип предотвращения компрометации сессионных ключей.

Выводы по стандартам шифрования и безопасности


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

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

Сравнение производительности


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

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

  • Технологии IPSEC, OpenVPN и Wireguard;
  • Процессоры IntelCore i7-3820QM и Intel Core i7-5200U;
  • Сетевые карты Intel 82579LM и Intel I218LM gigabit Ethernet;



Сравнение производительности различных VPN со стороны Jason A. Donenfeld-а

В обеих тестах на пропускную способность и время отклика ping, Wireguard значительно превзошел OpenVPN, а заодно и две вариации IPSec-а. Кроме того, во время теста на пропускную способность с использованием OpenVPN и IPSec утилизация CPU достигала 100%. В то же время использование Wireguard так сильно не загружало центральный процессор, давая тем самым возможность полностью утилизировать ресурсы сетевой карты Gigabit Ethernet.

Естественно предположить, что автор Wireguard может быть предвзятым в составлении сценариев и трактовке результатов замера производительности технологий VPN. Следовательно имеет смысл ознакомиться с другими тестами скорости разных VPN. Благо все, что для этого нужно VPS сервер, VPN и пакет iperf3.

Но и другие подобные тесты показывают превосходство Wireguard в тестах производительности.


Сравнение производительности Wireguard и OpenVPN

Неожиданным фактом можно считать, что openvpn-tcp быстрее openvpn-udp, однако при ближайшем рассмотрении все становится на свои места. TCP-поток имеет меньше завершенных тестов, чем UDP. Во всяком случае и тут Wireguard показывает лучшие результаты производительности.

В той же серии тестов любопытно сравнение скорости VPN-соединения в зависимости от число открытых сокетов. При росте их количества производительность Wireguard скачкообразно падает, хотя продолжает оставаться выше, чем openvpn-tcp и openvpn-udp.


Сравнение производительности Wireguard и OpenVPN в зависимости от числа открытых сокетов. TestID 0-600 соответствует openvpn-udp, 700-1200 openvpn-tcp и 1300-1800 Wireguard

Выводы по скорости VPN-соединения


Синтетические тесты скорости от разных авторов, с использованием пакета iperf3, позволяют предположить, что Wireguard быстрее, чем OpenVPN.

Конфиденциальность данных


VPN-протоколы уделяют гораздо большее внимание безопасности соединения, нежели конфиденциальности. Однако возможность сохранения анонимности тоже имеет значение кому охота писать объяснительные по факту закачки учебника Oracle, или эмулятора топологии Cisco? Ничто так хорошо не выдает факт правонарушения, как IP адрес пользователя.

Настройки Wireguard в явном виде содержат IP адреса пользователей и это обстоятельство не позволит им остаться незамеченным после того, как сервером заинтересуются правоохранительные органы. Сетевой трафик прочитать конечно не удастся, однако можно идентифицировать самих участников защищенного соединения.

Сама настройка защищенного соединения Wireguard довольно проста. Сперва установка.

(1:530)$ sudo emerge -av wireguard-modules wireguard-toolsThese are the packages that would be merged, in order:Calculating dependencies... done![binary  N     ] net-dns/openresolv-3.11.0  USE="(-selinux)" [binary  N     ] virtual/resolvconf-1 [ebuild  N     ] net-vpn/wireguard-modules-1.0.20201221  USE="module -debug -module-src" [binary  N     ] net-vpn/wireguard-tools-1.0.20200827  USE="wg-quick" Would you like to merge these packages? [Yes/No] 

Создаем открытый и закрытый ключи.

(1:531)$ wg genkey | tee privatekey | wg pubkey > publickey

Далее, необходимо настроить файл /etc/wireguard/wg0.conf.

/etc/wireguard/wg0.conf[Interface]Address = 10.0.0.1/24, fdc9:1f28:04d7:9ee9::1/64SaveConfig = trueListenPort = 51820PrivateKey = 2JtKAUFzecmgIVzbscQh3iUZrZanxIzvbejcIkvC5Hk= #PEER_A_PRIVATE_KEY[Peer]PublicKey = rgqd1cHKgRWX3IkYYSlrKA/SW3qZUhSJMqwTq4+3eFs= #PEER_B_PUBLIC_KEYPresharedKey = PEER_A-PEER_B-PRESHARED_KEYAllowedIPs = 10.0.0.2/32, fdc9:1f28:04d7:9ee9::2/128Endpoint = pb.example.com:51280

Второй участник подключения должен у себя настроить такой же файл, указав в нем свой закрытый ключ и открытый ключ участника A. Для установки соединения каждая из сторон выполняет wg-quick up interface_name.

Из этого видно, что при настройке Wireguard IP адрес, либо имя узла задаются в явном виде и будут видны в системных лог-файлах и таблицах SNMP до момента перезагрузки сервера.
OpenVPN лучше защищает конфиденциальность клиентских подключений, так как не требует до установки защищенного соединения прописывать IP адреса, или сетевое имя клиентских компьютеров.

Выводы по конфиденциальности данных


В этой номинации OpenVPN имеет определенное преимущество ввиду того, что лишь Wireguard предполагает хранение IP-адреса пользователей на VPN-сервере в течение длительного времени.

Итоги: какой же VPN выбрать?


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

  • Если вы обычный пользователь;
  • VPN вам нужен для обхода всяких нелепых ограничений РКН;
  • скорость для вас имеет значение, например для файлообмена, или работы вашего приложения;

Используйте Wireguard.

  • Бизнес пользователи средней и крупной компании использующие VPN для удаленного доступа к внутренней сети;
  • бизнес пользователи, предоставляющие удаленный доступ по VPN к ИТ ресурсам, содержащим конфиденциальные данные, или коммерческую тайну;
  • все, кому нужно надежное и проверенное временем решение для VPN;


То лучше используйте OpenVPN.

Ну а какой брать под VPN вы и так знаете.

Подробнее..

Из песочницы OpenVPN с двухуровневой иерархией ЦС

22.07.2020 02:07:20 | Автор: admin
Недавно мне довелось столкнуться с таском по созданию двухуровневой иерархии Центра Сертификации для OpenVPN на debian. Много раз доводилось поднимать OpenVPN с одним центром сертификации и прекрасно понимал, как должно быть в теории с двумя ЦС, но на практике столкнулся с тем, что не понимаю что и где подписывать. Гугл ответов, которые подошли бы для linux, мне не дал (или я не догугли) и начал я разбираться с этим. Ниже я привел мануал, который составил в процессе создания и настройки.

Сразу хочу отметить, что тут я больший упор делал на настройку ЦС чем на OpenVPN.

Перед тем как мы начнем, я расскажу кому это может пригодиться на своем примере.

У меня была задача создать систему для большой компании таким образом, чтобы сертификаты сервера OpenVPN подписывались только одним человеком, VPN серверов достаточно много, под каждый отдел поднято по несколько VPN серверов. Сотрудников (клиентов) еще больше и контролировать (выписывать/отзывать) сертификаты всякий раз, когда пришел/ушел сотрудник очень тяжкая ноша (не говоря уже о временных сотрудниках). Сотрудников каждого отдела контролирует начальник отдела, который и выписывает или отзывает сертификаты новым/старым сотрудникам соответственно.

Для чего нужны сертификаты и цифровые ключи очень много говорилось и я не буду повторять других авторов, но если коротко, то:

  • для удостоверения надежности (происходит двойное рукопожатие) клиент и сервер убеждаются в том кто они, можно ли друг другу доверять и устанавливают соединение;
  • шифрования/дешифрования;
  • исключения Man in the middle (MITM) дабы быть уверенным, что кто-то не перехватывает сообщения/трафик;
  • для создания зашифрованных паролей, что повышает безопасность и усложняет доступ злоумышленников на хост.

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



При создании ЦС создается два файла: ca.crt открытый ключ и ca.key закрытый ключ.
Закрытый ключ должен быть защищен и не должен передаваться третьим лицам.

Когда надо создать подчиняющийся/подписывающий ЦС, мы создаем на нем закрытый ключ и запрос на подпись у RootCA.

Откуда компьютеры и пользователи по всему миру будут знать, что могут доверять какому-либо сервису или сайту, спросите вы? Все просто (ну в теории), Открытый ключ ЦС (RootCA) помещается на пользовательские компьютеры и эти компьютеры доверяют всем сертификатам, которые были выпущены данным ЦС. На практике это конечно сложнее и не дешево. Но в пределах своей компании достаточно легко осуществимо.

Для реализации нам необходимо три сервера. В данной мануале будем использовать debian 9. Сервера назовем согласно их применению: OpenVPN, SubCA, RootCA.

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

Для этого ваш пользователь должен быть в группе sudo.

Если sudo на сервере не установлено, тогда авторизовываемся под root:

# su - root# apt-get install sudo -y# usermod -aG sudo username# exit

На всех серверах устанавливаем необходимые утилиты (утилиты могут отличаться в зависимости от верований и убеждений, обязательной является wget, ufw, vim т.к. тут я привел команды с данными утилитами):

# sudo apt-get update# sudo apt-get upgrade# sudo apt-get install wget curl net-tools ufw vim -y# cd ~# wget -P ~/ https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.4/EasyRSA-3.0.4.tgz# tar xvf EasyRSA-3.0.4.tgz

На сервере OpenVPN устанавливаем openvpn:

# sudo apt-get install openvpn -y

Переходим на сервер RootCA. Тут нам надо создать файл, откуда easyrsa будет брать значения переменных:

# mv ~/EasyRSA-3.0.4 ~/easyrsa/# cd ~/easyrsa/# cp vars.example vars# vim vars

Находим блок, удалим # и подставим свои значения. Дабы при подписании сертификатов не вводить наши данные мы их пропишем тут:

#set_var EASYRSA_REQ_COUNTRY"US"#set_var EASYRSA_REQ_PROVINCE"California"#set_var EASYRSA_REQ_CITY"San Francisco"#set_var EASYRSA_REQ_ORG"Copyleft Certificate Co"#set_var EASYRSA_REQ_EMAIL"me@example.net"#set_var EASYRSA_REQ_OU"My Organizational Unit"

Далее находим следующие установки, удалим # и редактируем их значения. Эти директивы отвечают за сроки жизни сертификатов (первая за срок сертификата ЦС, вторая за срок сертификата, который подписывается):

#set_var EASYRSA_CA_EXPIRE3650         #-->  3650#set_var EASYRSA_CERT_EXPIRE3650         #-->  1825

Далее:

# ./easyrsa init-pki

При запуске следующей команды будет запрошен CN. Можно оставит значение по умолчанию, но лучше ввести имя идентифицирующее хост (RootCA). Значение nopass говорит о том, что пароль создавать не надо:

# ./easyrsa build-ca nopass

Переходим на сервер SubCA и выполняем аналогичные шаги с небольшими изменениями:

# mv ~/EasyRSA-3.0.4 ~/easyrsa/# cd ~/easyrsa/# cp vars.example vars# vim vars

Находим блок, удалим # и подставим свои значения:

#set_var EASYRSA_REQ_COUNTRY"US"#set_var EASYRSA_REQ_PROVINCE"California"#set_var EASYRSA_REQ_CITY"San Francisco"#set_var EASYRSA_REQ_ORG"Copyleft Certificate Co"#set_var EASYRSA_REQ_EMAIL"me@example.net"#set_var EASYRSA_REQ_OU"My Organizational Unit"

Далее находим следующие установки, удалим # и редактируем их значения:

#set_var EASYRSA_CA_EXPIRE3650         #-->  1825#set_var EASYRSA_CERT_EXPIRE3650         #-->  365

Далее:

# ./easyrsa init-pki

При запуске следующей команды будет запрошен CN. Можно оставит значение по умолчанию, но лучше ввести имя идентифицирующее хост (SubCA). Значение subca говорит о том, что мы создаем подчиненный ЦС и нам надо создать запрос на подпись сертификата:

# ./easyrsa build-ca subca nopass

Далее находим файл ~/easyrsa/pki/reqs/ca.req (это и есть тот самый запрос) и передаем его серверу RootCA (можно использовать два способа: WinSCP и scp):

# scp ~/easyrsa/pki/reqs/ca.req user@ip_RootCA:/tmp

Переходим на сервер RootCA и подписываем запрос. Перед тем как подписать запрос, мы должны импортировать его в рабочую директорию. для подписания сертификата для подчиненного ЦС используем атрибут ca и имя сертификата (можно его назвать ca, но дабы не путаться, назовем его именем сервера, которому его подписываем, а когда передадим его серверу, переименуем):

# cd ~/easyrsa/# ./easyrsa import-req /tmp/ca.req SubCA# ./easyrsa sign-req ca SubCA

Будет запрошено подтверждение, надо ввести yes.
Возвращаем SubCA подписанный сертификат.

# scp ~/easyrsa/pki/issued/SubCA.crt user@ip_SubCA:/tmp

Переходим на сервер SubCA и перемещаем сертификат в рабочую директорию easyrsa:

# mv /tmp/SubCA.crt ~/easyrsa/pki/ca.crt

На данный момент у нас уже есть корневой ЦС и подписанный корневым вторичный ЦС.
Теперь займемся сервером OpenVPN. В его настройке некоторые предыдущие шаги повторяются. Переходим на сервер OpenVPN.

# cd ~/easyrsa/# ./easyrsa init-pki

Теперь начнем создавать сертификаты на подпись. Мы создадим ключ Диффи-Хеллмана (dh.pem/dh2048.pem/dh1024.pem), который будет использоваться при обмене ключами, и создадим подпись HMAC (ta.key), для усиления функции проверки целостности TLS.

Сертификаты для сервера OpenVPN мы будем подписывать на RootCA, а сертификаты для пользователей мы будем подписывать на SubCA. Сразу создадим директорию где мы будем складывать ключи, сертификаты и конфигурации клиентов.

# mkdir -p ~/client-configs/files/# mkdir ~/client-configs/keys/# chmod 700 ~/client-configs/# sudo mkdir /etc/openvpn/vpnsrv1/# ./easyrsa gen-req vpnsrv1 nopass# ./easyrsa gen-req dumasti nopass# ./easyrsa gen-dh# sudo openvpn --genkey --secret ta.key# cp /home/dumasti/easyrsa/pki/private/dumasti.key ~/client-configs/keys/# sudo cp /home/dumasti/easyrsa/pki/dh.pem /etc/openvpn/vpnsrv1/# sudo cp /home/dumasti/easyrsa/ta.key /etc/openvpn/vpnsrv1/# sudo cp /home/dumasti/easyrsa/ta.key ~/client-configs/keys/# sudo cp /home/dumasti/easyrsa/pki/private/vpnsrv1.key /etc/openvpn/vpnsrv1/# scp ~/easyrsa/pki/reqs/vpnsrv1.req user@ip_RootCA:/tmp# scp ~/easyrsa/pki/reqs/dumasti.req user@ip_SubCA:/tmp

Переходим на сервер RootCA и подписываем сертификат. Для подписания сертификата для сервера используем атрибут server, для клиента client:

# cd ~/easyrsa/# ./easyrsa import-req /tmp/vpnsrv1.req vpnsrv1# ./easyrsa sign-req server vpnsrv1

Будет запрошено подтверждение, надо ввести yes.

# scp ~/easyrsa/pki/issued/vpnsrv1.crt user@ip_OpenVPN:/tmp# scp ~/easyrsa/pki/ca.crt user@ip_OpenVPN:/tmp/RootCA.crt

Переходим на сервер SubCA и подписываем сертификат:

# cd ~/easyrsa/# ./easyrsa import-req /tmp/dumasti.req dumasti# ./easyrsa sign-req client dumasti

Будет запрошено подтверждение, надо ввести yes.

# scp ~/easyrsa/pki/issued/dumasti.crt user@ip_OpenVPN:/tmp# scp ~/easyrsa/pki/ca.crt user@ip_OpenVPN:/tmp/SubCA.crt

Возвращаемся на сервер OpenVPN и переносим подписанные сертификаты в нужные директории:

# cd /tmp

Для того, чтобы сервер OpenVPN принял клиентские ключи, мы должны объединить в один файл открытые ключи клиента и подчиненного/подписывающего ЦС:

# cat dumasti.crt SubCA.crt > ~/client-configs/keys/dumasti.crt# cp /tmp/RootCA.crt ~/client-configs/keys/ca.crt# sudo mv /tmp/RootCA.crt /etc/openvpn/vpnsrv1/# sudo mv /tmp/vpnsrv1.crt /etc/openvpn/vpnsrv1/

Теперь у нас есть все необходимые сертификаты в нужных местах. Осталось создать конфигурацию сервера OpenVPN и клиента (у каждого могут быть свои убеждения и взгляды в данном вопросе, но для примера тут будет следующая конфигурация).

Можно использовать шаблон конфигурации сервера и клиента и отредактировать под себя:

# sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/# sudo gzip -d /etc/openvpn/server.conf.gz# cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client-configs/base.conf

Но ниже я приведу содержимое уже готовых файлов конфигурации (символы; и # комментируют строку):

# sudo cat /etc/openvpn/vpnsrv1.confport 1194proto udpdev tunca vpnsrv1/RootCA.crtcert vpnsrv1/vpnsrv1.crtkey vpnsrv1/vpnsrv1.keydh vpnsrv1/dh.pemserver 10.8.0.0 255.255.255.0ifconfig-pool-persist ipp.txt;push "route 192.168.10.0 255.255.255.0";push "route 192.168.20.0 255.255.255.0";client-config-dir ccd;client-config-dir ccdpush "redirect-gateway def1 bypass-dhcp"push "dhcp-option DNS 208.67.222.222"push "dhcp-option DNS 208.67.220.220"client-to-client;duplicate-cnkeepalive 10 120tls-auth vpnsrv1/ta.key 0key-direction 0cipher AES-256-CBCauth SHA256max-clients 100user nobodygroup nogrouppersist-keypersist-tunstatus /var/log/openvpn/openvpn-status.loglog-append /var/log/openvpn/openvpn.logverb 3;mute 20explicit-exit-notify 1# cat ~/client-configs/base.confclientdev tunproto udpremote your_server_ip 1194;remote my-server-2 1194;remote-randomresolv-retry infinitenobinduser nobodygroup nogrouppersist-keypersist-tunremote-cert-tls server;tls-auth ta.key 1cipher AES-256-CBCauth SHA256key-direction 1verb 3;mute 20# script-security 2# up /etc/openvpn/update-resolv-conf# down /etc/openvpn/update-resolv-conf

Так же нам надо настроит файервол и пересылку пакетов. Можно настроить iptables, но тут мы рассмотрим ufw.

Для начала узнаем имя нашего интерфейса:

# ip addr 

Откроем следующие порты (у меня ssh на 22 порту, а openvpn на 1194, если у вас другие, то действуйте соответственно):

# sudo ufw allow 1194# sudo ufw allow 22

Далее откройте файл конфигурации ufw и вставьте туда следующее перед началом цепочки filter (замените мои значения на свои):

# sudo vim /etc/ufw/before.rules# START OPENVPN RULES# NAT table rules*nat:POSTROUTING ACCEPT [0:0]# Allow traffic from OpenVPN client to eth0 (change to the interface you discovered!)-A POSTROUTING -s 10.8.0.0/8 -o ens192 -j MASQUERADECOMMIT# END OPENVPN RULES

Перед этим:

# Don't delete these required lines, otherwise there will be errors*filter

Нужно разрешить UFW пересылку пакетов по умолчанию. Находим нужную строку и меняем значение DROP на ACCEPT:

# sudo vim /etc/default/ufwDEFAULT_FORWARD_POLICY="ACCEPT"

Настраиваем пересылку пакетов. Находим строку #net.ipv4.ip_forward=0 или #net.ipv4.ip_forward=1, удалим #, если стоит значение 0, то меняем его на 1:

# sudo vim /etc/sysctl.confnet.ipv4.ip_forward=1# sudo sysctl -p# sudo ufw enable

Далее запускаем наш VPN:

# sudo systemctl start openvpn@vpnsrv1

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

# ip addr

Должен появиться новый сетевой интерфейс tun0 с ip 10.8.0.1

# sudo systemctl status openvpn@vpnsrv1

Если надо, чтобы VPN стартовал самостоятельно после перезагрузки добавляем службу в автозапуск:

# sudo systemctl enable openvpn@vpnsrv1

Далее создаем конфигурацию клиента. Ранее мы поместили все ключи и сертификаты в директорию ~/client-configs/keys/.

Создадим скрипт, который соберет конфигурацию, ключи и сертификаты в один файл user.ovpn:

# cd ~/client-configs/# vim configs-maker.sh#!/bin/bash# First argument: Client identifierKEY_DIR=/home/dumasti/client-configs/keysOUTPUT_DIR=/home/dumasti/client-configs/filesBASE_CONFIG=/home/dumasti/client-configs/base.confcat ${BASE_CONFIG} \<(echo -e '<ca>') \${KEY_DIR}/ca.crt \<(echo -e '</ca>\n<cert>') \${KEY_DIR}/${1}.crt \<(echo -e '</cert>\n<key>') \${KEY_DIR}/${1}.key \<(echo -e '</key>\n<tls-auth>') \${KEY_DIR}/ta.key \<(echo -e '</tls-auth>') \> ${OUTPUT_DIR}/${1}.ovpn

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

Сделаем файл исполняемым:

# chmod +x configs-maker.sh

Запустим его:

# sudo ./configs-maker.sh dumasti

Теперь переносим клиентскую конфигурацию на свой компьютер из директории /home/dumasti/client-configs/files/

Запускаем VPN.

Из соображений безопасности сервера, на которых стоят ЦС, должны быть выключены и включаются только для подписания сертификатов.

Не обойдем вниманием и отзыв сертификатов. Для того, чтобы отозвать сертификат мы идем на сервер ЦС на котором был подписан сертификат и выполняем следующее (Для примера мы отзовем пользовательский сертификат (dumasti), который мы подписывали на сервере SubCA). Идем на сервер SubCA:

# cd ~/easyrsa/# ./easyrsa revoke dumasti

Будет запрошено подтверждение отзыва, вводим yes

# ./easyrsa gen-crl

Был сформирован файл crl.pem. Его нам надо поместить на сервер OpenVPN и в конфигурации сервера добавить директиву и путь к файлу:

# scp ~/easyrsa/pki/crl.pem user@ip_OpenVPN:/tmp

Переходим на сервер OpenVPN:

# sudo mv /tmp/crl.pem /etc/openvpn/vpnsrv1/# sudo vim /etc/openvpn/vpnsrv1.conf

Там где прописаны ключи и сертификаты добавляем следующую строку:

crl-verify vpnsrv1/crl.pem

Перезапускаем openvpn:

# sudo systemctl restart openvpn@vpnsrv1

Теперь клиент dumasti не сможет подключиться к VPN.

Благодарю за внимание!
Подробнее..

VPN ещё раз просто о сложном

21.12.2020 16:08:05 | Автор: admin

Вы сталкивались с ошибкой Это видео не доступно для просмотра в Вашей стране? Пробовали заходить на LinkedIn? Подобные ограничения можно обойти с помощью включения VPN на своем девайсе. В последнее время огромное количество людей было вынуждено перейти на дистанционный формат работы и многие работодатели обязали своих сотрудников пользоваться VPN для защищенного доступа к корпоративным сервисам. Сегодня мы постараемся разобраться в том, что такое VPN и как это работает.

Disclaimer: я искала на Хабре базовую статью о VPN, но нашла из базы только часть цикла "Сети для самых маленьких". Это очень крутая работа, но она сразу не выпадает. Поэтому я решила обобщить все собранные мной определения, знания и структуры, а в начале дать ссылку на "Сети". Надеюсь, это поможет другим пользователям Хабра.

Ну и немного освежила тему - в нашем 2020 VPN многим пригодился.

Что такое VPN?

VPN Virtual Private Network виртуальная частная сеть.

Это совокупность технологий, позволяющих обеспечить одно или несколько сетевых соединений (логическую сеть) поверх другой сети (например, Интернет).

Расшифровка названия: сеть объединение нескольких устройств каким-либо видом связи, позволяющее обмениваться информацией. Виртуальная неосязаемая, не физическая, то есть не важно, по каким именно каналам связи она проложена. Физическая и логическая топологии могут как совпадать, так и отличаться. Частная в эту сеть не может войти посторонний пользователь, там находятся только те, кому разрешили доступ. В частной сети надо маркировать участников и их трафик, чтобы отличить его от остальной, чужой информации. Также в такой сети обеспечивается защита данных криптографическими средствами, попросту говоря, шифруется.

Приведем еще одно определение: VPN это сервис, позволяющий защитить приватные данные при пользовании Интернетом.

Зачем нужен VPN?

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

  • Чтобы объединить разные части одной компании. Офисы могут быть удалены друг от друга на любое расстояние.

  • Внутри компаний для объединения и изоляции отделов.

  • При подключении к Wi-fi в кафе, метро и т.д., чтобы хакеры не могли украсть ваши данные. При пользовании публичной сетью безопасно, разве что просматривать сайты в браузере. А вот если использовать соц.сети, злоумышленник может не только перехватить вашу конфиденциальную информацию, но и использовать ее в своих целях, авторизовавшись в этой самой соц.сети от Вашего имени. Еще хуже, если ему удастся взломать почту. Тогда атаке подвергнутся все приложения, привязанные к этому почтовому ящику. Но самой неприятной может оказаться утечка данных вашей банковской карты, если вы решили перевести кому-то деньги, подключившись к бесплатному Wi-fi.

  • Для получения доступа к сайтам, которые заблокированы на определенной территории. Приведем пример: Teen Spirit снимает передачу Орёл и Решка и продает ее двум телеканалам: российской Пятнице и украинскому Интеру. Обычно телеканалы на следующий день после выхода премьеры по телевидению, выкладывают выпуск на свой ютуб-канал, чтобы те, кто не успел посмотреть передачу по телевизору, имели возможность сделать это в интернете и, конечно же, для того, чтобы заработать дополнительно на встроенной в ютуб рекламе. На Украине выпуски выходят на день раньше, чем в России. Соответственно, Интер выкладывает видео на ютуб, когда по Пятнице передачу еще не показали. Поэтому в России в этот день запрещен доступ к этому видео.

  • Для обеспечения анонимности. Нельзя вычислить, какие сайты вы посещали, каким браузером пользуетесь, где находитесь и т.д. Надобность скрыть свою геолокацию может может возникнуть в путешествиях. Например, в Турции запрещен YouTube и WhatsApp. Значит, просто так зайти в привычные соц.сети не получится, а с VPN это сделать вполне возможно.

  • Чтобы в браузере оставалась история поиска, на основе которой создается таргетированная реклама

  • Чтобы сэкономить, например, при покупке авиабилетов. Авиакомпании устанавливают разные цены на одни и те же билеты для покупателей из разных регионов. А VPN позволяет изменить информацию о геолокации.

Как можно пользоваться VPN?

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

Использование VPN на смартфонах и айфонах реализуется через мобильные приложения. Самые популярные из них это OpenVPN для Android и Cloak для iOS.

О плюсах VPN и о том, как его можно установить уже Вы прочитали. Самое время поговорить о минусах.

Чем приходится платить за безопасность в Интернете?

  1. Низкая скорость интернета. На дополнительное шифрование требуется время. Также часто трафик проходит большее расстояние, что связано с удаленностью расположения VPN-сервера.

  2. Периодический разрыв VPN-подключения, внезапный выход трафика в публичную сеть. Часто можно не заметить разрыв подключения и утечку данных, также VPN-соединение может не восстанавливаться автоматически, что не удобно. Во современных ОС на базе Windows предусмотрена функция VPN Reconnect. Если ее нет, то придется использовать особые программы или специальные настройки маршрутизации, которые контролируют VPN-соединение и в случае его разрыва сначала блокируют передаваемую информацию, закрывают приложения, потом обновляют VPN-подключение.

  3. К сожалению, IPv6 почти никогда не поддерживается VPN. Следовательно, когда в публичной сети используется IPv6, и в интернет-ресурсе он также поддерживается, трафик пойдет по умолчанию по открытой IPv6 сети. Чтобы такого не произошло можно просто отключить IPv6 в ОС.

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

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

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

Проблема кроется еще и в том, что сами мировые стандарты шифрования могут быть уязвимыми. Так, в 2013 году NIST (The National Institute of Standards and Technology организация, утверждающая стандарты шифрования в США) обвинили в том, что он разрешил включить в новый стандарт уязвимую версию генератора псевдослучайных чисел. Это позволило сильно упростить расшифровку информации, защищенной с применением этого генератора. Более того, составителей стандартов нередко обвиняют в сознательном усложнении описаний стандартов.

А законно ли вообще использовать VPN в России? В России действует закон Яровой, направленный против терроризма и экстремизма. С другой стороны его можно рассматривать как шаг в сторону регулирования и контролирования интернета, потому что этот закон обязует операторов связи хранить всю информацию о деятельности в интернете . Но если провайдер не сохраняет логи, то штрафовать будут его, а не конечных пользователей. Поэтому сейчас существует довольно много VPN-провайдеров, в том числе и бесплатных.

Как работает VPN?

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

Вы подключаетесь к VPN, система идентифицирует вашу сеть и начинает аутентификацию (сравнивает введенный пароль с паролем в своей базе данных).

Далее сервер Вас авторизует, то есть предоставляет право на выполнение определенных действий: чтение почты, интернет-серфинг и т.д. После установления соединения весь трафик передается между вашим ПК и сервером в зашифрованном виде. Ваш ПК имеет IP-адрес, предоставленный интернет-провайдером. Этот IP блокирует доступ к некоторым сайтам. VPN сервер меняет ваш IP на свой. Уже с VPN-сервера все данные передаются к внешним ресурсам, которые вы запрашиваете. Теперь можно просматривать любые ресурсы и не быть отслеженным.

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

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

Рассмотрим популярные VPN:

PPTP Point-to-Point Tunneling Protocol

+ поддерживается всеми ОС

+ не требует много вычислительных мощностей

- плохая защищенность. Методы шифрования устарели, плохая архитектура, есть ошибки в реализации протокола от Microsoft. Нет шифрования по умолчанию, на взлом требуется менее суток.

Используется, когда защита данных не очень важна или когда нет других вариантов.

L2TP Layer 2 Tunneling Protocol

+ более эффективен для построения виртуальных сетей

- более требователен к вычислительным ресурсам

- не предполагает шифрования по умолчанию

Работает совместно с другими протоколами, чаще всего IPSec.

Используется интернет-провайдерами и корпоративными пользователями.

IPSec Internet Protocol Security группа протоколов и стандартов для безопасных соединений.

+ хорошая архитектура

+ надежность алгоритмов

- сложен в настройке (следовательно, снижение защиты, если настроить неправильно)

- требует много вычислительных ресурсов

+ этот недостаток компенсируется путем аппаратного ускорения алгоритма шифрования АЕС

Часто используется совместно с другими технологиями.

SSL Secure Sockets Layer & TLS Transport Layer Security группа методов, включающая в себя протоколы SSL и TLS и другие методы защиты.

+ беспрепятственно пропускаются большинством публичных сетей

- довольно низкая производительность

- сложность в настройке, необходимость установки дополнительного ПО

используется на веб-сайтах, URL которых начинается с https (там еще виден зеленый замочек)

некоторые реализации: OpenVPN, Microsoft SSTP.

+ OpenVPN имеет открытый код, реализован практически для всех платформ, считается очень надежным.

Заключение

VPN комплекс технологий, позволяющих создать логическую сеть поверх физической. Используется для обеспечения защиты трафика от перехвата злоумышленниками и безопасной деятельности в интернете. VPN открывает доступ к заблокированным ресурсам, так что многие готовы мириться с более низкой скоростью интернета и возможными логами программ. Хотя VPN использует довольно надежные алгоритмы шифрования, включение VPN-клиента на вашем ПК не гарантирует 100% сохранности конфиденциальной информации, поэтому следует внимательно отнестись к выбору VPN-провайдера.

Ссылки:

https://blog.themarfa.name/kak-rabotaiet-vpn-i-pochiemu-eto-luchshie-tor-ili-proxy/

https://help-wifi.com/poleznoe-i-interesnoe/chto-takoe-vpn-dlya-chego-on-nuzhen-i-kak-polzovatsya/

https://www.kaspersky.ru/blog/vpn-hardships/11622/

https://www.kaspersky.ru/blog/vpn-implementations/11156/

https://www.kaspersky.ru/blog/vpn-explained/10635/

https://ru.wikipedia.org/wiki/VPN

https://pcsecrets.ru/internet/dlya-chego-nuzhen-vpn-i-kak-on-rabotaet-plyusy-i-minusy.html

https://www.youtube.com/watch?v=VDJXSrS8TCc

Подробнее..

На коленке агрегация VPN, или Надежная связь на ненадежных каналах

25.03.2021 14:07:14 | Автор: admin

Представьте задачу: необходимо обеспечить стабильным интернетом и покрыть бесшовным Wi-Fi здание площадью 300 м2 с возможной расчетной нагрузкой до 100 человек. На первый взгляд, "вроде изян". Но стоит добавить пару деталей, и задача усложняется:

  • здание стоит в лесопарковой зоне, где нет оптики, так что наш вариант мобильная связь;

  • нужно обеспечить регулярные видеотрансляции, то есть добиться стабильного интернета при единственном GSM-провайдере;

  • бюджет ограничен.

Итого: потери и отвалы от базовой станции подкрадываются в самое неподходящее время.

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

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

Схема решения вкратце

Итак, при первом столкновении с проблемой отвалов я начал с агрегации частот и убедился, что это не поможет. Смена категории LTE-модема с Cat4 на Cat6 или еще круче Cat12 давала преимущество в скорости, но в потерях и отвалах нет. Пришел к выводу, что нужен второй LTE-провайдер. При этом при переключении не должен потеряться ни один кадр и трансляция не должна отвалиться.

На помощь пришла такая связка: агрегация, она же bonding, и TCP-OpenVPN-туннель поверх этого.

  • в облаке создал "сервер агрегации" виртуалку с CLOUD HOSTED ROUTER (CHR) на базе Router OS;

  • на ней поднял L2TP-сервер с включенным шифрованием IPsec;

  • поверх L2TP over IPsec создал два EoIP-туннеля;

  • EoIP-туннели агрегированы bonding-интерфейсом;

  • вишенка на торте TCP-шный OpenVPN-туннель.

Итоговая схема:

Вместо виртуальной машины в дата-центре в качестве R1 может выступать любая железка с достаточной производительностью. Например, тот же MikroTik серии CCR, компьютер, размещенный где угодно. Главное позаботиться о производительности и стабильных каналах связи, использовать схемы активного резервирования (VRRP в помощь).

Поддержка OpenVPN UDP реализована только в 7-й версии RouterOS, поэтому в этой конфигурации безальтернативно используется протокол TCP.

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

Теперь расскажу подробнее о строительстве схемы. Начнем с R1 (облачного маршрутизатора) и далее R2 (филиального).

Маршрутизатор R1

  1. Сначала берем второй белый IP в дата-центре. У меня CHR находился за Edge в облаке VMware, так что обязательно пробрасываем порты на Edge UDP 1701, 500 и 4500 NAT-T IPSec Network Address Translator Traversal. Также делаем разрешающее правило в межсетевом экране Edge.

  2. Добавляем в таблицу firewall filter разрешающее правило доступа к маршрутизатору извне для портов UDP 1701, 500 и 4500. Если у вас белые IP непосредственно на маршрутизаторе без пробросов через Edge, галочку NAT Traversal НУЖНО СНЯТЬ!

    Проверяем дефолтный IPsec-профиль:

    /ip ipsec profile set [ find default=yes ] dh-group=modp1024 enc-algorithm=3de
    
  3. Создаем профиль для L2TP-туннелей:

    /ppp profile add change-tcp-mss=no name=profile01 use-compression=no use-encryption=no use-mpls=no use
    

    и настраиваем учетные записи:

    /ppp secretadd local-address=172.16.0.1 name=l2tp_R1-R2_ISP1 password=ros7.elements.forever profile=profile01 remote-address=172.16.0.2 service=l2tpadd local-address=172.16.0.5 name=l2tp_R1-R2_ISP2 password=ros7.elements.forever profile=profile01 remote-address=172.16.0.6 service=l2tp
    
  4. Активируем L2TP-сервер и включаем шифрование IPsec:

    /interface l2tp-server server set authentication=mschap2 caller-id-type=number default-profile=profile01 enabled=yes ipsec-secret=ВАШ КРУТОЙ ПАРОЛЬ use-ipsec=yes
    
  5. Поднимаем два EoIP-туннеля поверх L2TP/IPsec-туннелей:

    /interface eoipadd keepalive=1s,5 local-address=172.16.0.1 mac-address=00:00:00:00:00:A1 name=eoip-tun1_over_l2tp_R1-R2_ISP1 remote-address=172.16.0.2 tunnel-id=1add keepalive=1s,5 local-address=172.16.0.5 mac-address=00:00:00:00:00:B1 name=eoip-tun2_over_l2tp_R1-R2_ISP2 remote-address=172.16.0.6 tunnel-id=2
    

    Обязательно указываем минимальный keepalive timeout равным 1 секунде и для каждого EoIP-туннеля указываем уникальный ID.

  6. Настраиваем bonding и назначаем на него IP-адрес:

    /interface bondingadd lacp-rate=1sec mii-interval=1ms mode=broadcast name=bonding1 slaves=eoip-tun1_over_l2tp_R1-R2_ISP1,eoip-tun2_over_l2tp_R1-R2_ISP2
    
    /ip address add address=172.16.1.1/30 interface=bonding1
    

    Тут важно заметить, что в поле mode (режим работы bonding-интерфейса) я указал broadcast, чтобы пакеты отправлялись сразу по двум тоннелям. Таким образом потеря пакета на любом из двух интерфейсов не приведет к потере пакета на bonding-интерфейсе. Остальные значения устанавливаем, как на картинке.

Активируем OpenVPN-сервер

Так как у меня OpenVPN использовался еще и для внешних подключений, то я предварительно сгенерировал сертификаты и импортировал их в CHR. На этом останавливаться подробно не буду. Создаем /ppp profile и /ppp secret для OpenVPN:

/ppp profile add change-tcp-mss=no name=profile02 use-compression=no use-encryption=no use-mpls=no use/ppp secret add local-address=172.16.2.1 name=ovpn_over_bonding1 password=ros7.elements.forever profile=profile02 remote-address=172.16.2.2 service=ovpn/interface ovpn-server serverset auth=sha1 certificate=server.crt_0 cipher=aes256 default-profile=profile02 enabled=yes keepalive-timeout=30 port=1194 require-client-certificate=yes

Обязательно прописываем в nat-таблицу межсетевого экрана правило для нашей серой филиальной сети за маршрутизатором R2, чтобы трафик выходил наружу через R1:

/ip firewall natadd action=masquerade chain=srcnat out-interface-list=WAN src-address=192.168.1.0/24

Обратный маршрут до серой сети за маршрутизатором R2 указываем через OpenVPN-туннель:

/ip routeadd check-gateway=ping distance=1 dst-address=192.168.1.0/24 gateway=172.16.2.2

Маршрутизатор R2

  1. Первым делом прописываем маршруты от одного интерфейса LTE-модема до одного белого IP-адреса дата-центра. Запрещаем в настройках межсетевого экрана в цепочке output прохождение пакетов с другого интерфейса:

    /ip routeadd distance=1 dst-address= 198.51.100.10/32 gateway=lte1add distance=1 dst-address= 198.51.100.20/32 gateway=lte2/ip firewall filteradd action=drop chain=output dst-address= 198.51.100.10 out-interface=lte2add action=drop chain=output dst-address= 198.51.100.20 out-interface=lte1
    
  2. Приводим в соответствие с R1 дефолтный конфиг /ip ipsec profile:

    /ip ipsec profile set [ find default=yes ] dh-group=modp1024 enc-algorithm=3de
    
  3. Создаем /ppp profile:

    и два L2TP/IPsec-подключения к дата-центру для каждого из провайдеров:

    /ppp profile add change-tcp-mss=no name=profile01 use-compression=no use-encryption=no use-mpls=no use/interface l2tp-clientadd allow=mschap2 connect-to= 198.51.100.10 disabled=no ipsec-secret= ros7.elements.forever keepalive-timeout=30 name=l2tp_to_R1_over_ISP1 password=ros7.elements.forever    profile=profile01 use-ipsec=yes user=l2tp_R1-R2_ISP1add allow=mschap2 connect-to= 198.51.100.20 disabled=no ipsec-secret= ros7.elements.forever keepalive-timeout=30 name=l2tp_to_R1_over_ISP2 password=ros7.elements.forever    profile=profile01 use-ipsec=yes user=l2tp_R1-R2_ISP2
    
  4. Создаем EoIP-туннели по аналогии с R1, только меняем местами local и remote IP L2TP/IPsec-линков маршрутизатора R2. Bonding-интерфейс такой же, как на R1:

    /interface eoipadd keepalive=1s,5 local-address=172.16.0.2 mac-address=00:00:00:00:00:A2 name=eoip-tun1_over_l2tp_R1-R2_ISP1 remote-address=172.16.0.1 tunnel-id=1add keepalive=1s,5 local-address=172.16.0.6 mac-address=00:00:00:00:00:B2 name=eoip-tun2_over_l2tp_R1-R2_ISP2 remote-address=172.16.0.5 tunnel-id=2/interface bondingadd lacp-rate=1sec mii-interval=1ms mode=broadcast name=bonding1 slaves=eoip-tun1_over_l2tp_R1-R2_ISP1,eoip-tun2_over_l2tp_R1-R2_ISP2/ip address add address=172.16.1.2/30 interface=bonding1
    
  5. Также импортируем сертификаты, создаем профиль:

    Настраиваем OpenVPN-клиента на R2:

    /ppp profile add change-tcp-mss=no name=profile02 use-compression=no use-encryption=no use-ipv6=no use-mpls=no use-upnp=no/interface ovpn-clientadd certificate=client.crt_0 cipher=aes256 connect-to=172.16.1.1 mac-address=00:00:00:00:00:C2 name=ovpn_over_bonding1 password=ВАШ КРУТОЙ ПАРОЛЬ profile=profile02 use-peer-dns=no user="ovpn_over_bonding1 " verify-server-certificate=yes
    
  6. Туннели загорелись волшебной буквой R, а EoIP еще и RS. OpenVPN тоже завелся. Теперь можно направлять трафик с компьютера трансляций в наш слоеный бутерброд в OpenVPN-туннель. Для этого создаем правило /ip firewall mangle и прописываем сразу новую таблицу маршрутизации:

    /ip firewall mangleadd action=mark-routing chain=prerouting dst-address-list=google_sites dst-port=1935 new-routing-mark=pc_to_stream-youtube_over_R1 passthrough=yes protocol=tcp src-address=192.168.1.1
    
  7. Создаем маршрут через наш OpenVPN-туннель с данной таблицей маршрутизации:

    /ip routeadd check-gateway=ping distance=1 gateway=172.16.2.1 routing-mark=pc_to_stream-youtube_over_R1
    

И готово!

Траблшутинг

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

  • Утилиты RouterOS в разделе /tools очень полезны при траблшутинге. Еще неплохо работает связка /tools Packet Sniffer + Wireshark.

  • Не забудьте "поиграться с mtu", чтобы достичь лучшей производительности туннелей.

  • Качество сигнала никто не отменял. RSRP, RSRQ и SINR покажут, насколько все хорошо. При большом удалении от базовой станции и плохом сигнале помогут внешние направленные антенны.

  • Важно! Если провайдер фильтрует трафик и идет блокировка L2TP, то можно поднять другие туннели в качестве основы для EoIP, например: OpenVPN или SSTP.

  • Чтобы проверить все в деле, можно сымитировать сбой. Отключаем любой из LTE-интерфейсов или создаем потери искусственно: добавляем в межсетевой экран правило частичной блокировки пакетов и указываем при создании нового правила значение в поле random.

Что еще можно улучшить и оптимизировать

  • Не рекомендую заворачивать весь интернет-трафик, так как это вызовет повышенные накладные расходы (утилизация процессоров, каналов и др.). Лучше пользоваться маркировкой для гарантированной доставки действительно необходимого трафика, а все остальное отправлять на LTE-провайдеров. К примеру, я так делал с загрузкой видеофайлов на облачный диск.

  • QOS хорошая штука, особенно на каналах LTE, и особенно с VoIP. Не забываем про это, чтобы остальной трафик не забил и так не слишком широкий канал.

  • Можно усилить безопасность, если ограничить подключение извне к портам для L2TP и IPsec маршрутизатора R1. Указываем белый IP LTE-провайдера с помощью firewall и адресных листов. Хоть адрес и из NAT и на нем висит не один клиент, все равно будет лучше. Так как IP динамический, то нужно включить на MikroTik функцию ip cloud, чтобы DNS-сервера всегда знали актуальный IP, технология DDNS.

Конечно же, у схемы есть коммерческие аналоги с возможностями работы из коробки, например: peplink MAX HD4 LTE и тому подобное оборудование, агрегирующие соединения. Тут бизнес сам оценивает их стоимость для себя.

Оставляю ссылки на похожие темы:

Также тем, кому интересна эта тема, рекомендую покопать в сторону MPTCP (Multipath TCP).

Подробнее..

Превращаем одноплатник Cubietruck в Wi-Fi Hotspot с Captive portal, VPN-шлюзом и Ad block

25.05.2021 10:11:06 | Автор: admin
raspap

Для построения Wi-Fi сети обычно используют готовые маршрутизаторы, функционал которых всегда ограничен прошивкой. А если необходимо добавить блокировщик рекламы, VPN шлюз и красивый Captive portal, покупать новую железку? Стоимость устройства с таким функционалом будет уже весьма высока. Можно взять Linux с Hostapd и сделать точку доступа с Wi-Fi, но в отличие от готовых маршрутизаторов не будет наглядного Web-интерфейса. И для решения этой задачи был создан проект RaspAP, который на базе устройств с ОС Debian создает Wi-Fi Hotspot с Captive portal, VPN-шлюзом, Ad block. Для RaspAP в отличие от OpenWrt не требуется непосредственная поддержка устройства, достаточно поддержки последней версии Debian. RaspAP работает поверх уже установленных ОС: Raspberry Pi OS, Armbian, Debian, Ubuntu. Как сделать Wi-Fi Hotspot на RaspAP прошу под кат.

RaspAP open-source проект создания беспроводного маршрутизатора из многих популярных устройств работающих на ОС Debian, включая Raspberry Pi. Содержит удобный Web-интерфейс для настройки, блокировщик рекламы, осуществляет шлюзование сетевого трафика через OpenVPN или WireGuard.

Используя RaspAP можно быстро развернуть Hotspot с доступом в сеть Интернет, где угодно: в магазине или торговом центре, заправке, кафе и ресторане, библиотеке, больнице, аэропорте и вокзале, а также в совершенно непривычных, уединенных местах, например на вершине горы. Благодаря наличию Captive portal, посетители подключаясь к Сети, обязательно увидят информацию, которую владелец Wi-Fi желает довести до пользователей. Это может быть информация о соглашение использования публичного hotspot, и т.д.

Поддерживаемые устройства и ОС


Для устройств на ARM-архитектуре заявлена официальная поддержка, устройства на x86 процессорах в настоящее время находится в стадии Beta.

raspap

Поддерживаемые ОС и архитектуры RaspAP

Базовой платформой работы RaspAP является устройство Raspberry Pi. Но благодаря поддержки Armbian на основе Debian, список поддерживаемых устройств становится весьма широким.

Wi-Fi Hotspot на RaspAP будет развернут на одноплатном компьютере Cubietruck, процессор AllWinner A20 (ARM32), с ОС Armbian (на базе Debian). Для задач маршрутизации сетевого трафика для нескольких клиентов процессора AllWinner A20 с двумя ядрами Cortex-A7 будет недостаточно, но вы можете взять гораздо более мощное устройства из каталога поддерживаемых проектом Armbian.

RaspAP


raspap

Под капотом RaspAP использует hostapd, dnsmasq, iptables, веб-интерфейс работает на lighttpd с php-скриптами. С точки зрения использования новых функций применяется политика спонсорства. Если оформить ежемесячное спонсорство, то ваш аккаунт на GitHub будет добавлен в группу Insiders, которые первыми получают возможность протестировать новые функции. Функции доступные на данный момент только спонсорам будут помечены Insiders Edition.

raspap

Веб-интерфейс RaspAP

Возможности RaspAP:

  • Графический интерфейс для настройки и отображения графиков активности клиентских устройств;
  • Поддержка сертификатов SSL;
  • Интеграция с Captive portal;
  • Управление DHCP-сервером;
  • Поддержка адаптеров 802.11ac 5 ГГц;
  • Автоопределение внешних беспроводных адаптеров.

Пройдемся коротко по основным функциям RaspAP.

Точка доступа


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

  • Interface: wlan0
  • SSID: raspi-webgui
  • Wireless Mode: 802.11n 2.4GHz
  • Channel: 1
  • Security Type: WPA2
  • Encryption Type: CCMP
  • Passphrase: ChangeMe

К AP можно подключаться по ключевой паре SSID + пароль или по QR-коду. В случае бездействия клиента, AP может его отключить (требуется поддержка в драйверах). В Insiders Edition доступна возможность изменять мощность в dBm. Для обеспечения гарантированной работы можно задать ограниченное количество подключаемых клиентов.

Для Raspberry Pi Zero W доступен режим виртуализации беспроводного устройства. Единственное на борту Wi-Fi устройство будет работать в режиме клиента и точки доступа. Режим виртуализации сетевых интерфейсов работает и на других адаптерах USB Wi-Fi таких как RTL8188.

Блокировщик рекламы (Ad blocking)


Блокирует ads, трекеры и узлы из черного списка. В качестве источника черного списка выступает проект notracking, список обновляется автоматически. Блокируются следующие типы узлов: tracking, поставщики рекламы, сбор аналитики, фишинговые и мошенические сайты, содержащие вредоносные программы, веб-майнеры.

Captive portal


raspap

Captive portal

Из коробки интегрирован nodogsplash. nodogsplash легкое и простое решения создания кастомизируемых порталов. Поддерживает различные политики работы клиентов.

Поддержка дисплея для вывода состояния работы


Статистическую работу можно выводить на TFT-экран Adafruit Mini PiTFT контроллер ST7789. Скрипт вывода информации написан на Python, поэтому программный код можно легко адаптировать и для другого дисплея, например для ILI9341.

raspap

Вывод информации о работе AP

Поддержка различных сетевых устройств в качестве WAN-интерфейса (Insiders Edition)


В качестве доступа к сети Интернет, RaspAP поддерживает несколько различных типов сетевых устройств, такие как:

  • Ethernet interface (eth);
  • Wireless adapter (wlan);
  • Mobile data modem (ppp);
  • Mobile data adapter with built-in router;
  • USB connected smartphone (USB tethering);

Это особенно удобно когда вы путешествуете или работает в полевых условиях.

OpenVPN


raspap

Сетевой трафик можно туннелировать используя клиента OpenVPN. В Insiders Edition доступна возможность хранения нескольких профилей OpenVPN с функцией быстрого переключения между ними.

WireGuard (Insiders Edition)


raspap

WireGuard быстрый и современный VPN, в котором используется самая современная криптография. Он более производителен, чем OpenVPN, и обычно считается наиболее безопасным, простым в использовании и самым простым решением VPN для современных дистрибутивов Linux. Благодаря низкому overhead, если устройство работает от батареи, то время работы при использование WireGuard будет больше, чем при использование OpenVPN.

Доступ к Web-интересу настроек через SSL


raspap

Для защиты сетевого трафика от перехвата, доступно шифрование по SSL в пределах локальной сети. Проект mkcert позволяет в несколько простых шагов развернуть корневой центр сертификации и генерировать сертификаты, подписанные вашим собственным частным ЦС.

Постановка задачи


Установка RaspAP будет произведена из публичного репозитория, на Cubietruck установлена последняя версия Armbian (на основе Debian): Armbian 21.02.3 Buster, Linux 5.10.21-sunxi. На борту имеется встроенный адаптер wlan0, будет выступать в качестве клиентского доступа к сети Интернет (WAN-интерфейс). Для Hotspot подключим RTL8188 USB WiFi dongle wlan1.

  • IP конфигурация для wlan0: address 192.168.43.12 netmask 255.255.255.0 gateway 92.168.43.1.
  • IP конфигурация для wlan1: address 10.3.141.1 netmask 255.255.255.0 gateway 10.3.141.1.

Конфигурация DHCP-сервера:

  • Диапазон выдаваемых IP-адресов 10.3.141.50 10.3.141.254;
  • Шлюз/DNS-сервер: 10.3.141.1.

Для шлюзования сетевого трафика через OpenVPN установим на VPS сервер SoftEther VPN Server. SoftEther VPN Server мультипротокольный VPN-сервер, который может поднимать L2TP/IPsec, OpenVPN, MS-SSTP, L2TPv3, EtherIP-серверы, а также имеет свой собственный протокол SSL-VPN, который неотличим от обычного HTTPS-трафика (чего не скажешь про OpenVPN handshake, например), может работать не только через TCP/UDP, но и через ICMP (подобно pingtunnel, hanstunnel) и DNS (подобно iodine), работает быстрее (по заверению разработчиков) текущих имплементаций, строит L2 и L3 туннели, имеет встроенный DHCP-сервер, поддерживает как kernel-mode, так и user-mode NAT, IPv6, шейпинг, QoS, кластеризацию, load balancing и fault tolerance, может быть запущен под Windows, Linux, Mac OS, FreeBSD и Solaris и является Open-Source проектом под GPLv2.

Для VPS сервера выберем тариф на vdsina.ru за 330 р./месяц, в который включена квота на 32 ТБ трафика, чего более чем достаточно. SoftEther VPN Server будет развернут в Docker контейнере, поэтому выбор ОС CentOS/Debian/Ubuntu не принципиально важен.

Развертывание сервера выполняется просто и очень быстро, по результату необходимо отметить автоматическую выдачу DNS имени, можно не покупать доменное имя.

raspap

VPS сервер на vdsina.ru

Сервер был развернут в Московской локации, IP-адрес 94.103.85.152, dns-имя: v636096.hosted-by-vdsina.ru. Подключение к серверу будет по DNS имени.

raspap

Итоговая схема сети

Как будет выглядеть Web-интерфейс RaspAP и подключение к Hotspot


Подключение к AP SSID: raspi-webgui


Подключение к AP raspi-webgui

Конфигурационные файлы RaspAP


Для установки RaspAP есть Quick installer, но он выполняется без задания параметров и wlan0 настроен как Hotspot, что нам не подходит. Поэтому воспользуемся Manual installation, с некоторыми изменениями т.к. руководство содержит некоторые ошибки и сам RaspAP работает с некоторыми некритичными багами, из-за этого пришлось немного больше потратить время на установку. О багах будет в ходе установки.

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

Список конфигурационных файлов (GitHub):

  • hostapd.conf служба hostapd
  • default_hostapd служба hostapd
  • 090_raspap.conf служба dnsmasq.d
  • 090_wlan1.conf служба dnsmasq.d
  • defaults.json служба raspap
  • dhcpcd.conf служба raspap
  • config.php портал конфигурации RaspAP

hostapd.conf служба hostapd

Содержит настройки AP по умолчанию такие как: ssid, channel, password и т.д.

hostapd.conf
driver=nl80211ctrl_interface=/var/run/hostapdctrl_interface_group=0beacon_int=100auth_algs=1wpa_key_mgmt=WPA-PSKssid=raspi-webguichannel=1hw_mode=gwpa_passphrase=ChangeMeinterface=wlan1wpa=2wpa_pairwise=CCMPcountry_code=RU## Rapberry Pi 3 specific to on board WLAN/WiFi#ieee80211n=1 # 802.11n support (Raspberry Pi 3)#wmm_enabled=1 # QoS support (Raspberry Pi 3)#ht_capab=[HT40][SHORT-GI-20][DSSS_CCK-40] # (Raspberry Pi 3)## RaspAP wireless client AP mode#interface=uap0## RaspAP bridge AP mode (disabled by default)#bridge=br0



default_hostapd служба hostapd

Настройка службы hostapd, параметр DAEMON_CONF определяет путь к настройкам.

default_hostapd
# Location of hostapd configuration fileDAEMON_CONF="/etc/hostapd/hostapd.conf"



090_raspap.conf служба dnsmasq.d

Настройка службы dnsmasq, параметр conf-dir определяет путь к настройкам.

090_raspap.conf
# RaspAP default configlog-facility=/tmp/dnsmasq.logconf-dir=/etc/dnsmasq.d


090_wlan1.conf служба dnsmasq.d

Настройка dnsmasq для сетевого интерфейса wlan1. Содержит диапазон выдаваемых IP-адресов, и другие сетевые настройки. Необходимо обратить внимание на название файла по маске 090_[ИДЕНТИФИКАТОР_ИНТЕРФЕЙСА_HOTSPOT].conf. Если у вас сетевой интерфейс для hostspot будет назваться например wlan2, то следует задать название файла 090_wlan2.conf.

090_wlan1.conf
# RaspAP wlan0 configuration for wired (ethernet) AP modeinterface=wlan1domain-neededdhcp-range=10.3.141.50,10.3.141.255,255.255.255.0,12hdhcp-option=6,10.3.141.1


defaults.json служба raspap

Настройка DHCP серверов для интерфейсов wlan0 и wlan1.

defaults.json
{  "dhcp": {    "wlan1": {       "static ip_address": [ "10.3.141.1/24" ],      "static routers": [ "10.3.141.1" ],      "static domain_name_server": [ "10.3.141.1" ],      "subnetmask": [ "255.255.255.0" ]    },    "wlan0": {      "static ip_address": [ "192.168.43.12/24" ],      "static routers": [ "192.168.43.1" ],      "static domain_name_server": [ "1.1.1.1 8.8.8.8" ],      "subnetmask": [ "255.255.255.0" ]    },    "options": {      "# RaspAP default configuration": null,      "hostname": null,      "clientid": null,      "persistent": null,      "option rapid_commit": null,      "option domain_name_servers, domain_name, domain_search, host_name": null,      "option classless_static_routes": null,      "option ntp_servers": null,      "require dhcp_server_identifier": null,      "slaac private": null,      "nohook lookup-hostname": null    }  },  "dnsmasq": {    "wlan1": {      "dhcp-range": [ "10.3.141.50,10.3.141.255,255.255.255.0,12h" ]    },    "wlan0": {      "dhcp-range": [ "192.168.43.50,192.168.50.150,12h" ]    }  }}


dhcpcd.conf служба raspap

Настройка для сетевого интерфейса wlan0, который выходит в сеть Интернет.

dhcpcd.conf
# RaspAP default configurationhostnameclientidpersistentoption rapid_commitoption domain_name_servers, domain_name, domain_search, host_nameoption classless_static_routesoption ntp_serversrequire dhcp_server_identifierslaac privatenohook lookup-hostname# RaspAP wlan0 configurationinterface wlan0static ip_address=192.168.43.12/24static routers=192.168.43.1static domain_name_server=1.1.1.1 8.8.8.8


config.php портал конфигурации RaspAP

Файл настроек графического Web-интерфейса. Содержит переменные влияющие на отображение настроек. Самый главный параметр define('RASPI_WIFI_AP_INTERFACE', 'wlan1');. В качестве значения указать сетевой интерфейс hotspot wlan1.

config.php
...define('RASPI_WIFI_AP_INTERFACE', 'wlan1');...define('RASPI_ADBLOCK_ENABLED', true);define('RASPI_OPENVPN_ENABLED', false);...


Пошаговая установкаRaspAP


Руководство установки доступно в разделе Manual installation.

Шаг 1 Подключение адаптера USB WiFi RTL8188


Подключаем адаптер в любой доступный USB порт. В Armbian драйвера уже есть, поэтому проверим подключение командой lsusb:

root@bananapim64:~# lsusbBus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hubBus 003 Device 004: ID 0bda:c811 Realtek Semiconductor Corp.Bus 003 Device 002: ID 1a40:0101 Terminus Technology Inc. HubBus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hubBus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hubBus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hubBus 005 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hubroot@bananapim64:~#

В списке присутствует Realtek Semiconductor Corp., значит адаптер успешно распознался. Если вывести название интерфейса для подключенного адаптера, то его имя будет wlxe81e0584796d, что несколько далеко от привычного именования вида wlanX. Для задания названия для адаптера wlan1, необходимо выполнить следующие действия (более подробнее почитать про именование сетевых интерфейсов по ссылке1,ссылке2):

$ sudo ln -s /dev/null /etc/udev/rules.d/80-net-setup-link.rules$ sudo reboot

После перезагрузки в системе будет два беспроводных адаптера: wlan0 и wlan1.

Шаг 2 Настройка сетевых интерфейсов


Настроим сетевые интерфейсы в конфигурационном файле: /etc/network/interfaces.

# Network is managed by Network managerauto loiface lo inet loopback# WANauto wlan0allow-hotplug wlan0iface wlan0 inet dhcp# Wi-Fi APauto wlan1iface wlan1 inet static    address 10.3.141.1    netmask 255.255.255.0    gateway 10.3.141.1

Шаг 3 Установка RaspAP


Теперь приступаем к установке RaspAP.
Обновление системы:

sudo apt-get updatesudo apt-get full-upgrade

Установка зависимостей для не RPi OS:

sudo apt-get install software-properties-common sudo add-apt-repository ppa:ondrej/phpsudo apt-get install dhcpcd5

Установка пакетов:

sudo apt-get install -y lighttpd git hostapd dnsmasq iptables-persistent vnstat qrencode php7.3-cgi

PHP:

sudo lighttpd-enable-mod fastcgi-php    sudo service lighttpd force-reloadsudo systemctl restart lighttpd.service

Создание Web-портала:

sudo rm -rf /var/www/htmlsudo git clone https://github.com/RaspAP/raspap-webgui /var/www/htmlWEBROOT="/var/www/html"CONFSRC="$WEBROOT/config/50-raspap-router.conf"LTROOT=$(grep "server.document-root" /etc/lighttpd/lighttpd.conf | awk -F '=' '{print $2}' | tr -d " \"")HTROOT=${WEBROOT/$LTROOT}HTROOT=$(echo "$HTROOT" | sed -e 's/\/$//')awk "{gsub(\"/REPLACE_ME\",\"$HTROOT\")}1" $CONFSRC > /tmp/50-raspap-router.confsudo cp /tmp/50-raspap-router.conf /etc/lighttpd/conf-available/sudo ln -s /etc/lighttpd/conf-available/50-raspap-router.conf /etc/lighttpd/conf-enabled/50-raspap-router.confsudo systemctl restart lighttpd.servicecd /var/www/htmlsudo cp installers/raspap.sudoers /etc/sudoers.d/090_raspap

Создание конфигурации:

sudo mkdir /etc/raspap/sudo mkdir /etc/raspap/backupssudo mkdir /etc/raspap/networkingsudo mkdir /etc/raspap/hostapdsudo mkdir /etc/raspap/lighttpdsudo cp raspap.php /etc/raspap 

Установка разрешения:

sudo chown -R www-data:www-data /var/www/htmlsudo chown -R www-data:www-data /etc/raspap

Настройка контролирующих скриптов:

sudo mv installers/*log.sh /etc/raspap/hostapd sudo mv installers/service*.sh /etc/raspap/hostapdsudo chown -c root:www-data /etc/raspap/hostapd/*.sh sudo chmod 750 /etc/raspap/hostapd/*.sh sudo cp installers/configport.sh /etc/raspap/lighttpdsudo chown -c root:www-data /etc/raspap/lighttpd/*.shsudo mv installers/raspapd.service /lib/systemd/systemsudo systemctl daemon-reloadsudo systemctl enable raspapd.service

Установка стартовых настроек, настройки в каталоге ~/temp, при необходимости заменить на свои:

sudo apt-get install -y curl unzipmkdir -p ~/tempcurl -SL --output ~/temp/config_ct.zip https://github.com/devdotnetorg/Site/raw/master/Uploads/files/config_ct.zipunzip ~/temp/config_ct.zip -d ~/temprm ~/temp/config_ct.zipесли есть: sudo mv /etc/default/hostapd ~/default_hostapd.oldесли есть: sudo cp /etc/hostapd/hostapd.conf ~/hostapd.conf.oldsudo cp ~/temp/default_hostapd /etc/default/hostapdsudo cp ~/temp/hostapd.conf /etc/hostapd/hostapd.confsudo cp config/090_raspap.conf /etc/dnsmasq.d/090_raspap.confsudo cp ~/temp/090_wlan1.conf /etc/dnsmasq.d/090_wlan1.confsudo cp ~/temp/dhcpcd.conf /etc/dhcpcd.confsudo cp ~/temp/config.php /var/www/html/includes/sudo cp ~/temp/defaults.json /etc/raspap/networking/sudo systemctl stop systemd-networkdsudo systemctl disable systemd-networkdsudo cp config/raspap-bridge-br0.netdev /etc/systemd/network/raspap-bridge-br0.netdevsudo cp config/raspap-br0-member-eth0.network /etc/systemd/network/raspap-br0-member-eth0.network 

Оптимизация PHP:

sudo sed -i -E 's/^session\.cookie_httponly\s*=\s*(0|([O|o]ff)|([F|f]alse)|([N|n]o))\s*$/session.cookie_httponly = 1/' /etc/php/7.3/cgi/php.inisudo sed -i -E 's/^;?opcache\.enable\s*=\s*(0|([O|o]ff)|([F|f]alse)|([N|n]o))\s*$/opcache.enable = 1/' /etc/php/7.3/cgi/php.inisudo phpenmod opcache

Настройка маршрутизации:

echo "net.ipv4.ip_forward=1" | sudo tee /etc/sysctl.d/90_raspap.conf > /dev/nullsudo sysctl -p /etc/sysctl.d/90_raspap.confsudo /etc/init.d/procps restartsudo iptables -t nat -A POSTROUTING -j MASQUERADEsudo iptables -t nat -A POSTROUTING -s 192.168.43.0/24 ! -d 192.168.43.0/24 -j MASQUERADEsudo iptables-save | sudo tee /etc/iptables/rules.v4

Включение hostapd:

sudo systemctl unmask hostapd.servicesudo systemctl enable hostapd.service

OpenVPN:

sudo apt-get install openvpnsudo sed -i "s/\('RASPI_OPENVPN_ENABLED', \)false/\1true/g" /var/www/html/includes/config.phpsudo systemctl enable openvpn-client@clientsudo mkdir /etc/raspap/openvpn/sudo cp installers/configauth.sh /etc/raspap/openvpn/sudo chown -c root:www-data /etc/raspap/openvpn/*.sh sudo chmod 750 /etc/raspap/openvpn/*.sh

Ad blocking:

sudo mkdir /etc/raspap/adblockwget https://raw.githubusercontent.com/notracking/hosts-blocklists/master/hostnames.txt -O /tmp/hostnames.txtwget https://raw.githubusercontent.com/notracking/hosts-blocklists/master/domains.txt -O /tmp/domains.txtsudo cp /tmp/hostnames.txt /etc/raspap/adblocksudo cp /tmp/domains.txt /etc/raspap/adblock sudo cp installers/update_blocklist.sh /etc/raspap/adblock/sudo chown -c root:www-data /etc/raspap/adblock/*.*sudo chmod 750 /etc/raspap/adblock/*.shsudo touch /etc/dnsmasq.d/090_adblock.confecho "conf-file=/etc/raspap/adblock/domains.txt" | sudo tee -a /etc/dnsmasq.d/090_adblock.conf > /dev/null echo "addn-hosts=/etc/raspap/adblock/hostnames.txt" | sudo tee -a /etc/dnsmasq.d/090_adblock.conf > /dev/nullsudo sed -i '/dhcp-option=6/d' /etc/dnsmasq.d/090_raspap.confsudo sed -i "s/\('RASPI_ADBLOCK_ENABLED', \)false/\1true/g" includes/config.php

При конфигурирование через Web-интерфейс столкнулся с багом, который при изменение настроек DHCP сервера на интерфейсе wlan1 удаляет файл конфигурации 090_wlan1.conf и не создает его заново. В результате DHCP сервер не выдает IP-конфигурацию новым клиентам. Временное решение этой проблемы заключается в блокировке файла на удаление, необходимо выполнить следующую команду (по блокировке файлов почитать по ссылке):

sudo chattr +i /etc/dnsmasq.d/090_wlan1.conf

После установки необходимо перезагрузить систему:

sudo reboot now

После перезагрузке появится Wi-Fi точка доступа с SSID raspi-webgui и паролем ChangeMe. Портал будет доступен по адресу: http://10.3.141.1.

Установка SoftEther VPN Server на VPS сервер


На сервер v636096.hosted-by-vdsina.ru установим Docker по официальному руководству Install Docker Engine on Ubuntu.

Создание сети для Docker контейнеров


Для подсети в которой будет контейнер с SoftEther VPN Server определим следующие параметры:

  • Название сети: vpnnetwork;
  • Subnet: 172.22.0.0/24;
  • Driver: bridge;
  • Range: 172.22.0.0/25;
  • gateway: 172.22.0.127;
  • HostMin: 172.22.0.1;
  • HostMax: 172.22.0.126;
  • Hosts/Net: 126.

Для создание внутренней сети Docker выполним команду:

$ docker network create --driver bridge --subnet 172.22.0.0/24 --ip-range=172.22.0.0/25 --gateway 172.22.0.127 vpnnetwork

Для проверки доступности сети выполнить команду: ping 172.22.0.127.

Создание контейнера с SoftEther VPN Server


Для создание контейнера будем использовать образ siomiz/softethervpn. До запуска основного контейнера необходимо создать конфигурацию, в которой указать пароль для управления сервером параметр SPW и пароль для управления хабом параметр HPW. Файл конфигурации будет располагаться по пути /usr/vpnserver/vpn_server.config. Выполнить следующие команды:

$ mkdir -p /usr/vpnserver$ docker run --name vpnconf -e "SPW={PASSWORD}" -e "HPW={PASSWORD}" siomiz/softethervpn echo$ docker cp vpnconf:/usr/vpnserver/vpn_server.config /usr/vpnserver/vpn_server.config$ docker rm vpnconf

Для уменьшения размера контейнера возьмем образ на основе Alpine, все журналы log в null. Выполнить следующие команды для создание контейнера:

$ docker run --name vps-server-softethervpn -d --cap-add NET_ADMIN --restart always --net vpnnetwork --ip 172.22.0.2 -p 443:443/tcp -p 992:992/tcp \-p 1194:1194/udp -p 5555:5555/tcp -v /usr/vpnserver/vpn_server.config:/usr/vpnserver/vpn_server.config \-v /dev/null:/usr/vpnserver/server_log -v /dev/null:/usr/vpnserver/packet_log -v /dev/null:/usr/vpnserver/security_log siomiz/softethervpn:alpine

Если контейнер запустился, то переходим к следующему шагу.

Настройка SoftEther VPN Server


Для настройки SoftEther VPN Server лучше использовать графическую утилиту для ОС Windows. Для загрузки необходимо перейти на страницу SoftEther Download Center. В списке Select Component, выбрать SoftEther VPN Server Manager for Windows, далее Select Platform windows. Можно выбрать пакет .zip без необходимости установки. Пакет softether-vpn_admin_tools-v4.34-9745-rtm-2020.04.05-win32.zip распаковать и запустить vpnsmgr.exe.

Создаем новый профиль кнопка New Setting, указываем следующие настройка:

  • Setting Name: VDSina_ru_main_server
  • Host Name: v636096.hosted-by-vdsina.ru
  • Port Number: 443
  • Password: пароль который был указан в переменной SPW при создание конфигурационного файла vpn_server.config

Затем подключаемся к серверу кнопка Connect.

При первом подключение появится вопрос об включение поддержки протокола IPSec. Если в дальнейшем планируете подключать мобильные устройства без использования программных клиентов, то выбрать Да. В данном случае поддержка IPSec не требуется, отвеваем Нет.

Для настройки алгоритма шифрования нажать на кнопку Encryption and Network. По умолчанию включен алгоритм DHE-RSA-AES256-SHA. Из списка выбрать другие более стойкие комбинации шифрования, но нужно помнить чем сильнее алгоритм, тем больше нагрузка на CPU сервера и на конечное маршрутизирующее устройство.

По умолчанию будет доступен хаб DEFAULT, удаляем его.

Создаем новый хаб кнопка Create a Virtual Hub. Укажем Virtual Hub Name: VPNROOT. Открываем настройки хаба кнопка Manage Virtual Hub.

Создадим пользователя подключения, кнопка Manage Users, затем кнопка New. Аутентификация будет по паре логин/пароль, укажем имя: officeuser1.

Для отделение подсети клиентов VPN сервера и подсети Docker контейнеров включим NAT, кнопка Virtual NAT and Virtual DHCP Server (SecureNAT), далее кнопка Enable SecureNAT. Изменим подсеть VPN клиентов на: 192.168.30.x, закроем окно, кнопка Exit.

На этом настройка сервера закончена.


Последовательность действий по настройке SoftEther VPN Server

Получение файлов конфигурации *.ovpn


Для подключения OpenVPN клиента необходимо получить файлы конфигурации *.ovpn, для этого переходим на главный экран настроек SoftEther VPN Server и нажимаем на кнопку OpenVPN / MS-SSTP Settings. Далее, в следующем окне генерируем файлы конфигурации, кнопка Generate a Sample Configuration File for OpenVPN Clients. Сохраняем архив OpenVPN_Sample_Config_v636096.hosted-by-vdsina.ru_20210519_150311.zip, для дальнейшего подключения потребуется файл f1167ecd086e_openvpn_remote_access_l3.ovpn.


Последовательность действий по получению файлов конфигурации *.ovpn

Настройка OpenVPN на RaspAP


Создание маршрутов
Теперь переходим в консоль Cubietruck и добавляем маршруты:

sudo iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADEsudo iptables -A FORWARD -i tun0 -o wlan1 -m state --state RELATED,ESTABLISHED -j ACCEPTsudo iptables -A FORWARD -i wlan1 -o tun0 -j ACCEPT

Делаем копию существующих маршрутов и сохраняем новые

cp /etc/iptables/rules.v4 /etc/iptables/rules.v4.baksudo iptables-save | sudo tee /etc/iptables/rules.v4

Настройка профиля OpenVPN

Переходим на портал по адресу 192.168.43.12/openvpn_conf и указываем данные для подключения:

  • Username: officeuser1
  • Password: указанный для officeuser1 в SoftEther VPN Server
  • Для конфигурационного файла выбираем файл f1167ecd086e_openvpn_remote_access_l3.ovpn.

Сохраняем настройки и перезапускаем OpenVPN. Если подключение удалось, но в поле IPV4 ADDRESS будет публичный IP-адрес VPN сервера: 94.103.85.152 (v636096.hosted-by-vdsina.ru).

raspap
Страница настроек OpenVPN в RaspAP

Настройка Captive portal


Установка Captive portal в руководстве Captive portal setup.

Для установки выполним следующие действия:

sudo apt-get updatesudo apt-get install -y libmicrohttpd-devcd ~/git clone https://github.com/nodogsplash/nodogsplash.gitcd nodogsplashmakesudo make install

Далее необходимо внести изменения в конфигурационный файл /etc/nodogsplash/nodogsplash.conf. Указать следующие параметры:

...GatewayInterface wlan1...GatewayAddress 10.3.141.1...

Регистрация службы и запуск:

sudo cp ~/nodogsplash/debian/nodogsplash.service /lib/systemd/system/sudo systemctl enable nodogsplash.servicesudo systemctl start nodogsplash.service sudo systemctl status nodogsplash.service

Страницы html для изменение дизайна страниц располагаются по пути: /etc/nodogsplash/htdocs/. Теперь выполним подключение к AP SSID: raspi-webgui.

Устранение проблем


Первым делом необходимо проверить IP-конфигурацию сетевых интерфейсов, командами: ifconfig или ip a.

Проверить занятость портов, командами:

netstat -ntlp | grep LISTENlsof -i | grep LISTENlsof -nP -i | grep LISTEN

Если установка RaspAP выполняется на Ubuntu, то вы можете столкнуться с конфликтом использования 53 порта, который занят службой systemd-resolved. Для отключения данной службы, воспользоваться материалом How to disable systemd-resolved in Ubuntu.

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

sudo systemctl status hostapd.servicesudo systemctl status dnsmasq.servicesudo systemctl status lighttpd.servicesudo systemctl status openvpn-client@clientsudo systemctl status nodogsplash.servicesudo systemctl status raspapd.service


Что дальше?


Для проверки совместимости необходимо RaspAP развернуть на Banana Pi BPI-M64 (Armbian 21.02.1 на основе Ubuntu 18.04.5 LTS). Далее, развернуть на x86 с другим более новым адаптером, например USB Realtek 8811CU Wireless LAN 802.11ac. На GitHub размещен репозиторий raspap-docker, который оборачивает RaspAP в контейнер, но по факту запускает скрипт автоматической установки, что несколько неудобно и неправильно. Поэтому для более широкого распространения RaspAP необходимо его правильно обернуть в Docker контейнер для ARM и x86 архитектур.

Итог


Проект RaspAP безусловно заслуживает внимания, основные функции работают отлично. Это единственный проект связанный с Wi-Fi сетями, работающий поверх существующей ОС, у которого работает Web-интерфейс (пока есть небольшие баги). Для личного использования, теста, стоит попробовать. Но для продакшен в бизнесе пока лучше не использовать, необходимо более детально просмотреть исходный код и конфигурацию на предмет безопасности. В любом случае, проект добавил себе в закладки, надеюсь баги исправят в скором времени.



На правах рекламы


VDSina предлагает виртуальные серверы на Linux и Windows выбирайте одну из предустановленных ОС, либо устанавливайте из своего образа.

Присоединяйтесь к нашему чату в Telegram.

Подробнее..

Представляем ovpn-admin веб-интерфейс для управления пользователями OpenVPN

17.03.2021 16:04:48 | Автор: admin

Обслуживая большое количество проектов, мы пришли к необходимости простого управления OpenVPN (сертификатами и маршрутами для пользователей), подразумевая под этим веб-интерфейс вместо того, чтобы ходить по серверам/контейнерам и выполнять в них вручную команды. Поскольку существующие для этого решения (вроде Pritunl и OpenVPN AS) коммерческие, несколько лет назад мы создали (и используем по сей день) свой интерфейс.

Недавно мы его переписали с Python на Go и обновили внешний вид*, что и навело на мысль поделиться разработкой с более широким сообществом. Итак, встречайте ovpn-admin!

* За первоначальный вариант на Python благодарю коллегу @vitaliy-sn, а за нескучные обои обновлённый интерфейс erste.

Возможности и интерфейс

Ovpn-admin это Open Source-проект, реализующий веб-интерфейс для управления OpenVPN. В настоящий момент утилита поддерживает только Linux и умеет:

  • добавлять пользователей (генерировать сертификаты для них);

  • отзывать/восстанавливать сертификаты пользователей;

  • выдавать готовый файл конфига;

  • отдавать метрики для Prometheus: срок действия сертификатов, количество пользователей (всего/подключенных), информация о подключенных пользователях;

  • (опционально) прописывать CCD (client-config-dir) для каждого пользователя;

  • (опционально) работать в режиме master/slave (синхронизация сертификатов и CCD с другим сервером);

  • (опционально) задавать/менять пароль для дополнительной авторизации в OpenVPN.

Вот как выглядит интерфейс ovpn-admin:

Список пользователей и возможные действия с нимиСписок пользователей и возможные действия с нимиОкно добавления кастомных маршрутов для пользователяОкно добавления кастомных маршрутов для пользователяПример панели на основе метрик, полученных от ovpn-adminПример панели на основе метрик, полученных от ovpn-admin

Как попробовать

Ovpn-admin можно установить в систему или запускать в Docker-контейнере. Инструкции описаны в README проекта.

Исходный код проекта распространяется на условиях свободной лицензии (Apache License 2.0). Будем рады новым фичам, а также, конечно, ожидаем ваши issues и просто обсуждения на GitHub или в комментариях к этому посту.

Планы по развитию

Что бы хотелось улучшить в проекте? На данный момент у нас такой список доделок:

  • добавить возможность дополнительной авторизации через OTP;

  • добавить Helm-чарт как вариант установки;

  • добавить группы пользователей;

  • уйти от вызова утилиты easyrsa для генерации сертификатов;

  • уйти от вызова bash.

P.S.

Читайте также в нашем блоге:

Подробнее..

Скрипт для создания OpenVPN сервера, или как один админ удаленку облегчал

01.04.2021 16:06:37 | Автор: admin
image
Доброго дня товарищи! Во время пандемии у всех был выбор, что использовать для организации удаленного доступа. Я выбрал OpenVPN. Чтобы помочь другим, (в первую очередь себе, конечно), был написан скрипт для простой установки сервера Ovpn на centos 8 с нуля, без заморочек.
Интересующимся под кат, там скрипт и небольшие пояснения.

Весь скрипт комментирован, а также настроен на общение с пользователем. Это очень облегчает понимание.
Вкратце. Создается пользователь openvpn, нужен в основном для обмена клиентскими конфигами, чтобы не давать лишнего доступа по ssh\ftp тем, кому нужно их скачать.
Проверки на число добавлены для уменьшения ошибок на дурака. Тем, кто захочет сломать точно сломает, но так хоть что-то. Дополнительных утилит самый минимум.
В этом скрипте selinux настраивается, а не отключается. Из настроек пользователя остаются несколько строк файла vars, а также порт, протокол, ip-адрес, и количество пользователей. Ко всем вопросам пользователю, есть пояснение. Остальная установка проходит по стандартной процедуре настройки OpenVPN сервера. Хотел сделать silent режим, но думаю это уже лишнее. Готовые файлы конфигурации складываются в папку /home/openvpn/ ready_conf. Они уже готовы к использованию.
Скрипт здесь, а также есть на github
На centos 7 заменой dnf на yum не проверял. Если есть желание можете попробовать, потом расскажете.
Скрипт установки
#!/bin/bashecho "Этот скрипт создаст OpenVPN сервер с нуля, от вас потребуется указать количество клиентов и минимальные настройки"echo "К каждому пункту будет пояснение"echo "Для начала создадим пользователя openvpn"      #Создадим нового пользователя openvpn с правами администратора      #Проверка на наличие пользователя в системе, для отсутствия ошибок при повторном запускеusername=openvpn #переменная с именем пользователяclient_name=client #имя клиентаanswer=y #ответ пользователяgrep "^$username:" /etc/passwd >/dev/nullif [[ $? -ne 0 ]]; then   adduser openvpn; usermod -aG wheel openvpn; passwd openvpn   echo "Пользователь создан"else   echo "Пользователь уже создан в системе"fi      #Создание клиентов по умолчаниюecho "Укажите количество клиентов по умолчанию. Потом можно добавить еще по необходимости"read quantity_client      #Проверка-значение число, иначе сначалаif [[ $quantity_client =~ ^[0-9]+$ ]]; then   #количество клиентов   echo "Будут создано "$quantity_client" клиентских конфигураций с именами "$client_name"[X].ovpn"else   echo "введённый символ не является числом, попробуйте снова"   echo "Попробовать снова? (y/n/e)"   read answer   case $answer in           "y")              $0              ;;           "n")              echo "bye"              exit              ;;           "e")              exit              ;;            *)              echo "error"              ;;   esacfiecho 'Установим утилиты необходимые для дальнейшей работы'dnf install wget -y; dnf install tar -y; dnf install zip -y      #Начинаем установку. Подключим репозиторий и скачаем сам дистрибутивdnf install epel-release -y; sudo dnf install openvpn -y      #Проверка наличия директории openvpn если есть то удаляем и создаем заново, иначе создаемif [[ -e /etc/openvpn ]]; then   rm -rf /etc/openvpn   mkdir /etc/openvpn; mkdir /etc/openvpn/keys; chown -R openvpn:openvpn /etc/openvpn   echo "Удалена старая директория openvpn, создана новая"else   mkdir /etc/openvpn; mkdir /etc/openvpn/keys; chown -R openvpn:openvpn /etc/openvpn   echo "создана новая дирктория openvpn"fi      #Скачиваем easy-rsawget -P /etc/openvpn https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.8/EasyRSA-3.0.8.tgztar -xvzf /etc/openvpn/EasyRSA-3.0.8.tgz -C /etc/openvpnrm -rf /etc/openvpn/EasyRSA-3.0.8.tgz      #Создадим файл vars, с настройками пользователяtouch /etc/openvpn/EasyRSA-3.0.8/vars      #Значения переменных для varsecho "Укажите основные настройки создания сертификатов"echo "Для каждого пункта есть настройки по умолчанию, их можно оставить"echo "Страна(по умолчанию RH):"; read countryif [[ -z $country ]]; then   country="RH"fiecho "Размер ключа(по умолчанию 2048):"; read key_sizeif [[ $key_size =~ ^[0-9]+$ ]]; then #проверка на число   echo "Установлен размер ключа:" $key_sizeelse   key_size=2048; echo "Значение ключа установлено по умолчанию"fiecho "Укажите область\край(по умолчанию Tegucigalpa"; read provinceif [[ -z $province ]]; then   province="Tegucigalpa"fiecho "Город(по умолчанию Tegucigalpa)"; read cityif [[ -z $city ]]; then   city="Tegucigalpa"fiecho "email(по умолчанию temp@mass.hn)"; read mailif [[ -z $mail ]]; then   mail="temp@mass.hn"fiecho "срок действия сертификата, дней(по умолчанию 3650/10 лет): "; read expireif [[ $expire =~ ^[0-9]+$ ]]; then   echo "Срок действия сертификата" $expire "дней"else   expire=3650fi      #Набиваем varscat <<EOF > /etc/openvpn/EasyRSA-3.0.8/varsset_var EASYRSA_REQ_COUNTRY $countryset_var EASYRSA_KEY_SIZE $key_sizeset_var EASYRSA_REQ_PROVINCE $provinceset_var EASYRSA_REQ_CITY $cityset_var EASYRSA_REQ_ORG $domain_nameset_var EASYRSA_REQ_EMAIL $mailset_var EASYRSA_REQ_OU $domain_nameset_var EASYRSA_REQ_CN changemeset_var EASYRSA_CERT_EXPIRE $expireset_var EASYRSA_DH_KEY_SIZE $key_sizeEOF      #Теперь инициализируем инфраструктуру публичных ключейcd /etc/openvpn/; /etc/openvpn/EasyRSA-3.0.8/easyrsa init-pki      #Создаем свой ключ/etc/openvpn/EasyRSA-3.0.8/easyrsa build-ca nopass      #Создаем сертификат сервера/etc/openvpn/EasyRSA-3.0.8/easyrsa build-server-full server_cert nopass      #Создаем Диффи Хелмана/etc/openvpn/EasyRSA-3.0.8/easyrsa gen-dh      #crl для информации об активных/отозванных сертификатах/etc/openvpn/EasyRSA-3.0.8/easyrsa gen-crl      #Теперь копируем все что создали в папку keyscp /etc/openvpn/pki/ca.crt /etc/openvpn/pki/crl.pem /etc/openvpn/pki/dh.pem /etc/openvpn/keys/cp /etc/openvpn/pki/issued/server_cert.crt /etc/openvpn/keys/cp /etc/openvpn/pki/private/server_cert.key /etc/openvpn/keys/      #Получим настройки для файла server.confecho "Сейчас соберем информацию для файла конфигурации сервера."echo "Порт(по умолчанию 1194):"; read port_numif [[ $port_num =~ ^[0-9]+$ ]]; then #проверка на число   echo "Установлен порт:" $port_numelse   port_num=1194; echo "Номер порта установлен по умолчанию"echo "Протокол(по умолчанию udp)для установки tcp введите 1"; read protocolfiif [[ $protocol -eq 1 ]]; then   protocol="tcp"   echo "Выбран протокол tcp"else   protocol="udp"   echo "Выбран протокол udp"fi      #Теперь создадим директорию и файлы для логовmkdir /var/log/openvpntouch /var/log/openvpn/{openvpn-status,openvpn}.log; chown -R openvpn:openvpn /var/log/openvpn      #Включаем движение трафикаecho net.ipv4.ip_forward=1 >>/etc/sysctl.confsysctl -p /etc/sysctl.conf      #Настроим selinuxdnf install policycoreutils-python-utils -ydnf install setroubleshoot -ysemanage port -a -t openvpn_port_t -p $protocol $port_num/sbin/restorecon -v /var/log/openvpn/openvpn.log/sbin/restorecon -v /var/log/openvpn/openvpn-status.log      #Настроим firewalldfirewall-cmd --add-port="$port_num"/"$protocol"firewall-cmd --zone=trusted --add-source=172.31.1.0/24firewall-cmd --permanent --add-port="$port_num"/"$protocol"firewall-cmd --permanent --zone=trusted --add-source=172.31.1.0/24firewall-cmd --direct --add-rule ipv4 nat POSTROUTING 0 -s 172.31.1.0/24 -j MASQUERADEfirewall-cmd --permanent --direct --add-rule ipv4 nat POSTROUTING 0 -s 172.31.1.0/24 -j MASQUERADEsystemctl restart firewalld     #Создадим server.confmkdir /etc/openvpn/servertouch /etc/openvpn/server/server.conf#chmod -R a+r /etc/openvpncat <<EOF > /etc/openvpn/server/server.confport $port_numproto $protocoldev tunca /etc/openvpn/keys/ca.crtcert /etc/openvpn/keys/server_cert.crtkey /etc/openvpn/keys/server_cert.keydh /etc/openvpn/keys/dh.pemcrl-verify /etc/openvpn/keys/crl.pemtopology subnetserver 172.31.1.0 255.255.255.0route 172.31.1.0 255.255.255.0push "route 172.31.1.0 255.255.255.0"push "dhcp-option DNS 8.8.8.8"push "dhcp-option DNS 8.8.4.4"keepalive 10 120persist-keypersist-tunstatus /var/log/openvpn/openvpn-status.loglog-append /var/log/openvpn/openvpn.logverb 2mute 20daemonmode serveruser nobodygroup nobodyEOFecho "Добавим сервер в автозагрузку и запустим"sudo systemctl enable openvpn-server@serversudo systemctl start openvpn-server@serversudo systemctl status openvpn-server@server      #Начнем создавать клиентов      #Директория для готовых конфиговmkdir /home/openvpn/ready_confecho "IP к которому необходимо подключаться клиентам в формате 111.111.111.111"; read ip_adress      #Создадим темповый файл конфигурации клиента с настройкамиtouch /home/openvpn/temp_conf_client.txtcat <<EOF > /home/openvpn/temp_conf_client.txtclientdev tunproto $protocolremote $ip_adress $port_numpersist-keypersist-tunverb 3route-method exeroute-delay 2EOF      #теперь функция создания клиентовcreate_client () {   cd /etc/openvpn/   /etc/openvpn/EasyRSA-3.0.8/easyrsa build-client-full "$client_name$quantity_client" nopass   cp /home/openvpn/temp_conf_client.txt /home/openvpn/ready_conf/"$client_name$quantity_client"'.ovpn'{   echo "<ca>"; cat "/etc/openvpn/pki/ca.crt"; echo "</ca>"   echo "<cert>"; awk '/BEGIN/,/END/' "/etc/openvpn/pki/issued/$client_name$quantity_client.crt"; echo "</cert>"   echo "<key>"; cat "/etc/openvpn/pki/private/$client_name$quantity_client.key"; echo "</key>"   echo "<dh>"; cat "/etc/openvpn/pki/dh.pem"; echo "</dh>"} >> "/home/openvpn/ready_conf/"$client_name$quantity_client".ovpn"}       #Запускать функцию создания клиентов, по счетчикуwhile [[ $quantity_client -ne 0 ]]; do   create_client   let "quantity_client=$quantity_client-1"done/etc/openvpn/EasyRSA-3.0.8/easyrsa gen-crl #генерируем crl для информации об активных сертификатахcp /etc/openvpn/pki/crl.pem /etc/openvpn/keys/ #Копируем в директорию с активными сертификатамиsudo systemctl restart openvpn-server@server #перезапускаем сервер, для применения crlcd /home/openvpn/ready_conf/; ls -alh ./echo "сейчас вы в директории с готовыми файлами конфигураций, их уже можно использовать"echo "скрипт завершен успешно"exec bash

Подробнее..

Делаем OpenVPN клиент для iOS

10.06.2021 02:22:28 | Автор: admin
Привет всем!
Давайте рассмотрим как создать собственное приложение, поддерживающее OpenVPN-протокол. Для тех, кто об этом слышит впервые ссылки на обзорные материалы, помимо Википедии, приведены ниже.

С чего начать?


Начнем с фреймворка OpenVPNAdapter написан на Objective-C, ставится с помощью Pods, Carthage, SPM. Минимальная поддерживаемая версия ОС 9.0.
После установки необходимо будет добавить Network Extensions для таргета основного приложения, в данном случае нам понадобится пока Packet tunnel опция.

image

Network Extension


Затем добавляем новый таргет Network Extension.
Сгенерированный после этого класс PacketTunnelProvider приведем к следующему виду:

import NetworkExtensionimport OpenVPNAdapterextension NEPacketTunnelFlow: OpenVPNAdapterPacketFlow {}class PacketTunnelProvider: NEPacketTunnelProvider {    lazy var vpnAdapter: OpenVPNAdapter = {        let adapter = OpenVPNAdapter()        adapter.delegate = self        return adapter    }()    let vpnReachability = OpenVPNReachability()    var startHandler: ((Error?) -> Void)?    var stopHandler: (() -> Void)?    override func startTunnel(options: [String : NSObject]?, completionHandler: @escaping (Error?) -> Void) {        guard            let protocolConfiguration = protocolConfiguration as? NETunnelProviderProtocol,            let providerConfiguration = protocolConfiguration.providerConfiguration        else {            fatalError()        }        guard let ovpnContent = providerConfiguration["ovpn"] as? String else {            fatalError()        }        let configuration = OpenVPNConfiguration()        configuration.fileContent = ovpnContent.data(using: .utf8)        configuration.settings = [:]        configuration.tunPersist = true        let evaluation: OpenVPNConfigurationEvaluation        do {            evaluation = try vpnAdapter.apply(configuration: configuration)        } catch {            completionHandler(error)            return        }        if !evaluation.autologin {            guard let username: String = protocolConfiguration.username else {                fatalError()            }            guard let password: String = providerConfiguration["password"] as? String else {                fatalError()            }            let credentials = OpenVPNCredentials()            credentials.username = username            credentials.password = password            do {                try vpnAdapter.provide(credentials: credentials)            } catch {                completionHandler(error)                return            }        }        vpnReachability.startTracking { [weak self] status in            guard status == .reachableViaWiFi else { return }            self?.vpnAdapter.reconnect(afterTimeInterval: 5)        }        startHandler = completionHandler        vpnAdapter.connect(using: packetFlow)    }    override func stopTunnel(with reason: NEProviderStopReason, completionHandler: @escaping () -> Void) {        stopHandler = completionHandler        if vpnReachability.isTracking {            vpnReachability.stopTracking()        }        vpnAdapter.disconnect()    }}extension PacketTunnelProvider: OpenVPNAdapterDelegate {        func openVPNAdapter(_ openVPNAdapter: OpenVPNAdapter, configureTunnelWithNetworkSettings networkSettings: NEPacketTunnelNetworkSettings?, completionHandler: @escaping (Error?) -> Void) {        networkSettings?.dnsSettings?.matchDomains = [""]        setTunnelNetworkSettings(networkSettings, completionHandler: completionHandler)    }    func openVPNAdapter(_ openVPNAdapter: OpenVPNAdapter, handleEvent event: OpenVPNAdapterEvent, message: String?) {        switch event {        case .connected:            if reasserting {                reasserting = false            }            guard let startHandler = startHandler else { return }            startHandler(nil)            self.startHandler = nil        case .disconnected:            guard let stopHandler = stopHandler else { return }            if vpnReachability.isTracking {                vpnReachability.stopTracking()            }            stopHandler()            self.stopHandler = nil        case .reconnecting:            reasserting = true        default:            break        }    }    func openVPNAdapter(_ openVPNAdapter: OpenVPNAdapter, handleError error: Error) {        guard let fatal = (error as NSError).userInfo[OpenVPNAdapterErrorFatalKey] as? Bool, fatal == true else {            return        }        if vpnReachability.isTracking {            vpnReachability.stopTracking()        }        if let startHandler = startHandler {            startHandler(error)            self.startHandler = nil        } else {            cancelTunnelWithError(error)        }    }    func openVPNAdapter(_ openVPNAdapter: OpenVPNAdapter, handleLogMessage logMessage: String) {    }}


И снова код


Возвращаемся к основному приложению. Нам необходимо работать с NetworkExtension, предварительно импортировав его. Обращу внимание на классы NETunnelProviderManager, с помощью которого можно управлять VPN-соединением, и NETunnelProviderProtocol, задающий параметры новому соединению. Помимо передачи конфига OpenVPN, задаем возможность передать логин и пароль в случае необходимости.

var providerManager: NETunnelProviderManager!    override func viewDidLoad() {        super.viewDidLoad()        loadProviderManager {            self.configureVPN(serverAddress: "127.0.0.1", username: "", password: "")        }     }    func loadProviderManager(completion:@escaping () -> Void) {       NETunnelProviderManager.loadAllFromPreferences { (managers, error) in           if error == nil {               self.providerManager = managers?.first ?? NETunnelProviderManager()               completion()           }       }    }    func configureVPN(serverAddress: String, username: String, password: String) {      providerManager?.loadFromPreferences { error in         if error == nil {            let tunnelProtocol = NETunnelProviderProtocol()            tunnelProtocol.username = username            tunnelProtocol.serverAddress = serverAddress            tunnelProtocol.providerBundleIdentifier = "com.myBundle.myApp"             tunnelProtocol.providerConfiguration = ["ovpn": configData, "username": username, "password": password]            tunnelProtocol.disconnectOnSleep = false            self.providerManager.protocolConfiguration = tunnelProtocol            self.providerManager.localizedDescription = "Light VPN"            self.providerManager.isEnabled = true            self.providerManager.saveToPreferences(completionHandler: { (error) in                  if error == nil  {                     self.providerManager.loadFromPreferences(completionHandler: { (error) in                         do {                           try self.providerManager.connection.startVPNTunnel()                         } catch let error {                             print(error.localizedDescription)                         }                                                                   })                  }            })          }       }    }


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

image

Добавим возможность выключения VPN-соединения.

do {            try providerManager?.connection.stopVPNTunnel()            completion()        } catch let error {            print(error.localizedDescription)        }


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

Проверять статус подключения Вашего VPN в приложении можно с помощью статусов.

if providerManager.connection.status == .connected {      defaults.set(true, forKey: "serverIsOn")}


Всего этих статусов 6.

@available(iOS 8.0, *)public enum NEVPNStatus : Int {    /** @const NEVPNStatusInvalid The VPN is not configured. */    case invalid = 0    /** @const NEVPNStatusDisconnected The VPN is disconnected. */    case disconnected = 1    /** @const NEVPNStatusConnecting The VPN is connecting. */    case connecting = 2    /** @const NEVPNStatusConnected The VPN is connected. */    case connected = 3    /** @const NEVPNStatusReasserting The VPN is reconnecting following loss of underlying network connectivity. */    case reasserting = 4    /** @const NEVPNStatusDisconnecting The VPN is disconnecting. */    case disconnecting = 5}


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

Полезные ссылки:
OpenVPNAdapter
Habr
Конфиги для теста
Подробнее..
Категории: Разработка под ios , Vpn , Swift , Ios , Openvpn

Категории

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

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru