Vpn туннелирование что это такое
Перейти к содержимому

Vpn туннелирование что это такое

  • автор:

Что такое VPN? Зачем его использовать и как он работает?

Giteqa

VPN — это аббревиатура от Virtual Private Network. Как следует из названия, это виртуальная сеть, созданная через Интернет или публичная сеть между двумя или более физическими сетями (или устройствами) для создания расширенной частной сети.
Это помогает пользователям/устройствам отправлять и получать данные, как если бы пользователи были в одной напрямую подключенной частной сети.
Это означает, что приложения в VPN могут иметь те же функции и управляться так же, как и в частной сети.

Зачем использовать VPN?

Каждое устройство в Интернете имеет общедоступный IP-адрес, который используется для идентификации и подключения к этому устройству с помощью браузера, командной строки или любого другого метода.
Для подключения к устройству данные отправляются через Интернет.
Эти данные содержат такую ​​информацию, как IP-адреса, прокси, провайдер и т.д., Которые могут быть перехвачены, если они отправлены по незащищенной сети.
Чтобы защитить личность, конфиденциальность и данные, передаваемые через Интернет, VPN используются для установления частного соединения между двумя устройствами / сетями.
VPN можно использовать в различных сценариях. Чаще всего люди, работающие удаленно из офиса, хотят получить доступ к объектам, сети, файлам и т.д.
Из своего офиса, используя безопасное сетевое соединение через Интернет, как если бы они работали из офиса. Это также известно как VPN-соединение типа «точка-сеть«.
Другой распространенный случай — когда компания имеет много офисов в разных географических точках и хочет создать частное соединение через Интернет для соединения этих офисов / сетей.
Это также известно как соединение типа «сайт-сайт«.
Поскольку соединение происходит через общедоступную сеть, чтобы обеспечить безопасность данных и защиту от подслушивания, авторизованный доступ для защиты от потери данных, становится важным иметь безопасное и зашифрованное частное соединение между двумя сетями/устройствами, которое обеспечивается VPN.
Для предприятий VPN можно использовать для подключения к их облачной среде, и это может помочь им создать расширенную сеть для хранения, обработки других данных и информации.
В отдельных случаях VPN можно использовать для сокрытия вашего общедоступного IP-адреса и геолокации, поскольку все ваши запросы через Интернет отправляются с сервера, к которому вы создали VPN-соединение (туннель).

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

Когда вы используете VPN через Интернет, он создает частный зашифрованный туннель между двумя устройствами/сетями.
Теперь, с VPN, намного сложнее заполучить ваши данные, и даже если они будут взломаны, так как эти данные зашифрованы, то получить какую-либо информацию из этих данных практически невозможно.
Существует несколько протоколов туннелирования VPN, таких как PPTP (протокол туннелирования Point-to-Point), L2TP (протокол туннелирования второго уровня), IPSec (безопасность интернет-протокола), SSL (уровень защищенных сокетов) и т.д., Которые используются для создания туннелей VPN.

Например, если вы используете IPSec, который представляет собой набор протоколов, для создания VPN-туннеля, вы можете использовать следующий сценарий.
Допустим, у вас есть офис в Молдове, и вы хотите подключить его к другому офису в Россий, чтобы обмениваться информацией между этими офисами через Интернет в конфиденциальном, безопасном и зашифрованном виде.
Вы можете создать VPN-туннель между этими двумя офисами и начать доступ к устройствам/сетям как к одной большой частной сети, расположенной на двух континентах.
Чтобы получить этот частный VPN-туннель, вам необходимо использовать VPN технику/устройства или VPN-шлюзы, которые будут работать как два конца туннеля.
Однако, если вам нужно подключить удаленное устройство к любому из этих офисов, вы можете просто использовать VPN-соединение типа «point-to-site» с использованием SSL-VPN.
Для IPSec вы выполняете двухэтапный процесс создания VPN-туннеля. Первая фаза используется для аутентификации одноранговых узлов IPSec и для установки безопасного канала между одноранговыми узлами для включения обмена IKE (Internet Key Exchange).
Как только это будет сделано, вторая фаза IKE используется для согласования IPSec SA (Security Association) для настройки туннеля IPSec.
Проще говоря, первая фаза используется для определения того, как два одноранговых узла будут обмениваться ключами (согласование криптографических параметров), а вторая фаза определяет, как два одноранговых узла будут шифровать данные (путем создания ключевого материала для использования туннелем IPSec).
После успешного завершения обоих фазовых переговоров вы можете использовать этот VPN-туннель для связи между двумя сетями.
Mivocloud предоставляет услуги VPN-шлюза. Шлюз VPN используется для передачи зашифрованного трафика между VPC Mivocloud и корпоративными центрами обработки данных, корпоративными офисными сетями или интернет-платформами через Интернет.
Вы можете использовать эту услугу для установления надежных и безопасных соединений для передачи данных.

Что такое VPN-туннель?

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

Зеленая рябь с закрепленным на ней замком.

Как работает VPN-туннель?

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

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

Изображение «‎Что такое VPN?»

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

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

Кирпичная стена.

VPN-туннель скрывает ваше местоположение

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

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

Протоколы VPN-туннелирования

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

Текстовые облачка с различными VPN-протоколами.

Различные типы VPN-протоколов

Lightway

Разработанный с нуля компанией ExpressVPN, протокол Lightway обеспечивает более быстрые, безопасные и надежные VPN-подключения. Lightway дает возможность подключиться к VPN-серверу за доли секунды и сохранить VPN-соединение даже при смене сетей. Lightway имеет открытый исходный код и защищен криптографической библиотекой wolfSSL.

OpenVPN

OpenVPN — это исключительно гибкий VPN-протокол с открытым исходным кодом, поддерживаемый различными платформами. Настроить его самостоятельно может быть непросто, при этом OpenVPN отлично подходит для создания быстрых, безопасных и зашифрованных подключений. ExpressVPN позволяет выбрать между UDP (для более быстрых подключений) и TCP (для более надежных подключений).

IKEv2

Это один из более новых VPN-протоколов, доступных широкой аудитории. IKEv2 считается менее ресурсоемкой и более стабильной альтернативой OpenVPN. IKEv2 отлично подходит для использования на любых мобильных устройствах. Установить подключение по протоколу IKEv2 можно только через UDP, а эта опция блокируется некоторыми файрволами.

L2TP/IPsec

Протокол Layer 2 Tunneling Protocol (L2TP) сам по себе не обеспечивает ни надежного шифрования, ни возможностей аутентификации. Internet Protocol security (IPsec) — это гибкий и безопасный протокол, поддерживащий шифрование и аутентификацию для пакетов данных. Поэтому L2TP и IPsec часто используются вместе.

PPTP

Протокол Point to Point Tunneling Protocol (PPTP) был одним из первых в своем роде. Отсутствие шифрование и инструментов аутентификации сделало PPTP самым быстрым VPN-протоколом. Вместе с этим это означает, что ваш интернет-трафик может быть доступным для всех желающих. Мы не рекомендуем использовать PPTP, и этот протокол не поддерживается в приложениях ExpressVPN.

Конфигурация VPN-туннеля

Чтобы начать работу с ExpressVPN, зарегистрируйтесь ниже и загрузите нужное вам приложение для создания VPN-туннеля (для Windows, Mac, Android, iOS, Linux, роутеров и многих других платформ). Затем выберите сервер в одной из десятков стран, подключитесь к нему и наслаждайтесь безопасной и анонимной работой в Интернете.

Удобный и красивый интерфейс приложения позволяет легко создавать и отключать VPN-туннель, а также проводить тесты для определения загруженности того иного сервера.

Что такое VPN-туннель

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

Изображение записи

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

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

Что такое VPN-туннель

VPN-туннель — это сетевое соединение для безопасной передачи информации между двумя или более удаленными узлами в интернете.

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

Как работает VPN-туннель

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

Есть несколько протоколов туннелирования (например, GRE, ICMP или IP in IP), которые можно использовать для настройки VPN-туннелей. Выбор конкретного зависит от цели, ваших требований к стойкости шифрования и вычислительной сложности.

Кроме того, VPN-туннель может работать в нескольких режимах — «передача данных между двумя сетями» и «защита удаленного доступа к внутренним ресурсам сети».

Передача данных между двумя сетями

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

Защита удаленного доступа к внутренним ресурсам сети

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

Виды туннелирования VPN

Существует несколько видов туннелирования VPN, каждый из которых выполняет определенные функции в защите данных и настройке соединения:

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

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

Шифрование и безопасность

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

Алгоритмы шифрования

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

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

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

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

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

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

Методы шифрования

AES (Advanced Encryption Standard). Это один из наиболее распространенных и надежных методов симметричного шифрования. Использует один и тот же ключ для шифрования и дешифрования данных и шифрует данные блоками по 128 бит. AES имеет также другие варианты длины ключа — AES-128, AES-192 и AES-256. Последний считается наиболее надежным и часто используется в VPN-сервисах.

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

Blowfish и Twofish. Blowfish является симметричным блочным шифром, который был разработан в 1993 году. А Twofish — его наследником, ориентированным на безопасность и производительность. Оба метода используют шифрование с переменной длиной ключа, блоки по 64 бита и различные режимы их шифрования.

3DES (Triple Data Encryption Standard). Это метод симметричного шифрования, который использует три ключа. Он не считается безопасным и уже устарел, но все еще используется в некоторых VPN-сервисах.

RSA (Rivest-Shamir-Adleman). Это асимметричный методом шифрования, который использует два ключа — открытый и закрытый. Он используется для создания зашифрованных туннелей безопасного обмена данными. RSA является более безопасным, но медленным в сравнении с симметричными методами. Это особенно заметно при использовании ключей большей длины.

MPPE (Microsoft Point-to-Point Encryption). Это метод симметричного шифрования, который был разработан для работы в соединениях PPTP (Point-to-Point Tunneling Protocol). Он использует ключ длиной 40 или 128 бит и шифрует данные.

Camellia. Это метод симметричного шифрования, который обычно называют альтернативой AES. Он использует ключ длиной от 128 до 256 бит и шифрует данные блоками по 128 бит. Camellia считается наиболее безопасным методом шифрования.

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

Туннельные протоколы

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

PPTP (Point-to-Point Tunneling Protocol)

PPTP — однин из самых старых и наиболее распространенных протоколов для создания VPN-туннелей. Он поддерживается многими операционными системами, включая Windows, MacOS и Linux. И является симметричным протоколом, который использует шифрование MPPE для защиты данных, передаваемых через туннель.

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

L2TP (Layer 2 Tunneling Protocol)

L2TP — наиболее безопасный протокол, чем PPTP. Поддерживается почти всеми операционными системами. Использует асимметричное шифрование RSA и шифрование с ключом 256 бит. L2TP обеспечивает высокий уровень безопасности, но при этом может быть медленнее, чем другие протоколы.

IPSec (Internet Protocol Security)

IPSec — туннельный протокол, который может работать как для симметричного, так и для асимметричного шифрования. С помощью него можно обеспечить высокий уровень безопасности: IPSec шифрует данные с ключом до 256 бит. Однако может быть сложен в настройке и иметь низкую производительность на некоторых устройствах.

OpenVPN

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

IKEv2 (Internet Key Exchange version 2)

Это один из самых быстрых и безопасных протоколов для создания VPN-туннелей. IKEv2 особенно хорошо подходит для работы с мобильных устройствах, так как поддерживает быстрое соединение между сетевыми интерфейсами — например, между Wi-Fi и мобильной связью. Протокол можно настроить — например, выбрать подходящий алгоритм шифрования.

WireGuard

Это относительно новый протокол туннелирования, который уже зарекомендовал себя как быстрый и легковесный вариант. WireGuard использует симметричное шифрование и поддерживает различные методы аутентификации и шифрования, включая ChaCha20 и Poly1305. Этот протокол может работать на большинстве современных операционных систем, включая Windows, MacOS, Linux, Android и iOS.

SSTP (Secure Socket Tunneling Protocol)

Этот протокол был разработан специально для Windows и использует SSL-шифрование для создания защищенного туннеля. SSTP можно использовать для соединения с VPN-серверами через HTTP-прокси, что делает его идеальным вариантом для офиса. Несмотря на свою безопасность, этот протокол довольно медленный.

Выбор протокола зависит от требований к безопасности, производительности и доступности. В большинстве случаев достаточно OpenVPN и IKEv2, так как они обеспечивают высокую безопасность и быстрое соединение. PPTP и L2TP могут быть незначительно быстрее, но менее безопасны, а IPSec и SSTP имеют больше требований к настройке. WireGuard также можно назвать хорошим вариантом для создания мобильных VPN-туннелей за счет своей скорости.

Преимущества и недостатки использования VPN

Преимущества

  • Безопасная передача данных. VPN-соединение защищает данные от внешних угроз, таких как кража данных или взлом соединения.
  • Конфиденциальность. VPN обеспечивает защиту персональных данных, скрывая реальный IP-адрес пользователя.
  • Безопасный доступ к общественным Wi-Fi сетям. Не все Wi-Fi сети обеспечивают безопасную передачу конфиденциальных данных — например, паролей и логинов. VPN шифрует информацию, тем самым обеспечивает безопасный доступ к общественным сетям.

Недостатки

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

Варианты использования VPN

VPN можно применять как в частной, так и корпоративной сферах. Рассмотрим наиболее популярные способы.

Частная сфера

По сути, к частной сфере можно отнести все сценарии, о которых мы говорили ранее: от организации безопасного соединения с сетями Wi-Fi и обхода ограничений до обеспечения конфиденциальности в интернете.

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

Корпоративная сфера

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

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

Способы организации VPN

Чтобы защитить сетевой трафик или обеспечить безопасность персональных данных, рассмотрим основные способы организации VPN.

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

Собственный сервер

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

VPN-провайдер

Доступный и простой вариант организации VPN — аренда сервера у провайдера. При выборе VPN-провайдера необходимо учитывать:

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

VPN-провайдеры предоставляют простой способ организации VPN. Необязательно разбираться инфраструктурном оборудовании — все уже настроено за вас.

Прямой VPN-туннель между двумя компьютерами находящимися за NAT провайдеров с использованием UDP hole punching

Статья о том, как мне удалось организовать прямой (точка-точка) VPN-туннель между двумя компьютерами, каждый из которых находился за NAT’ом провайдеров, при помощи VPS и простых скриптов, используя стандартные утилиты Linux, без каких-либо настроек сетевого оборудования.

Введение

Существует множество программ (TeamViewer, Hamachi) для удаленного управления компьютером, передачи данных и т.п. Работают они на удивление хорошо и в любых условиях. Но как правило это платные сервисы. Как устроены эти программы неизвестно, да и особого желания их использовать они у меня не вызывают. Я как пользователь ОС Linux (в основном Ubuntu) использовал для передачи данных и управлением своими ПК связку из OpenVPN, SSH, VNC, RDP и прочие сервисы в зависимости от потребности. Для того чтобы организовать сеть между двух компьютеров я использовал VPN-сервер, что бы эти компьютеры подключались к OpenVPN серверу и весь трафик шел через сервер. Это не совсем хорошо, ведь трафик проходит двойной путь, в следствии этого терялась скорость.
Классическая схема организации VPN-туннелей и передачи данных между узлами через сервер

Теория

Я давно задумался о решении по организации канала передачи данных непосредственно от узла к узлу, которые находятся за NATом провайдеров, без использования серверов-посредников. Перебрав некоторое количество статей о различных технологиях типа GRE-туннелей, IPsec, UDP Hole Punching, OpenVPN и прочего, я понял, что узлы должны пробивать соединение навстречу друг другу, то есть посылать пакеты на IP и порт удаленного узла. Поставил несколько опытов по организации GRE-туннеля через NAT, передачу сообщения при помощи NetCat навстречу друг другу, иногда это работало, иногда нет, всё зависело от типа используемого провайдером NAT. Не так давно попалась на глаза интересная статья, в которой было описание организации работы OpenVPN соединения между двумя компьютерами (далее узлами). Я прочитал, проверил и заработало, но при условии, что локальный порт узла и внешний порт будут совпадать, то есть мой провайдер будет использовать Cone NAT. Мне же стало интересно организовать туннель между двумя компьютерами при условии, что оба будут находятся за любым типом (Cone или Symmetric) NAT, то есть локальный порт может не совпадать с внешним портом. Задача уперлась в невозможность определения текущего порта внешнего интерфейса без внешней помощи. Если внешний IP-адрес хоть как-то можно узнать (например: curl ifconfig.me), а вот с определением текущего внешнего порта возникла трудность.

Практика

Для решения этой задачи пришлось использовать VPS (S-синий овал), на нем я поднял скрипт который выполнял роль «Соединителя», что-то типа STUN-сервера: при помощи утилиты TCPDump получал UDP-пакет (далее везде используется UDP протокол) на определенный интерфейс и порт, парсил содержимое пакета, определял IP-адрес/порт источника и отвечал утилитой NetCat возвращая текущие параметры (IP-адрес и порт) соединения, а так же параметры (IP-адрес и порт) удаленного узла к которому нужно подключиться, если эти данные были доступны, иначе ждал пока они не появятся. Все это дело сопоставлялось с идентификатором (ID) соединения, так как несколько соединений могли мешать друг другу, при использовании ID все решалось. Также была проблема того, что узел получал свои же старые данные и пытался по ним подключиться и это решилось с помощью хеша Hostname.

image

На узлах A и B я использовал скрипт и сгенерированный заранее ключ для авторизации VPN-соединения, работало это так: запускался скрипт, случайно выбирался локальный порт в диапазоне от 20000 до 65000 и с этого порта отправлялся пакет на VPS, который содержал в себе ID соединения и хеш hostname, с помощью утилиты NetCat и тут же запускался TCPDump ожидая ответа. В ответ приходил пакет который содержал в себе текущие данные (IP-адрес/порт) этого узла, а при наличие данных удаленного узла, они тоже приходили и начинался обмен приветствиями между узлами. Если же данных удаленного узла не было, то опрос повторялся с периодичностью 30-45 секунд, для поддержания сессии. В момент когда все необходимые данные (IP-адрес и порт текущего узла и удаленного) были на узлах, начинался обмен пакетами, пакет содержал в себе число m=0 и сгенерированное число от 0 до 254 (это число использовалось для генерации внутреннего IP-адреса VPN-соединения). Удаленный узел получив пакет с m=0 отправлял в ответ m=1 и так далее до 10. При получении пакета m=10 инициировалась посылка пачки пакетов с периодичность в 1 секунду с m=13 и запуск OpenVPN, удаленный узел получив m=13 тоже запускал OpenVPN используя локальный порт, IP-адрес и порт удаленного узла, а также сгенерированный внутренний IP вида 10.X.X./30.

Схема прямого VPN-туннеля и передачи данных между узлами, без участия сервера
Внимание: скрипты написаны и проверены на ОС Ubuntu 18.04 и Debian 9

Скрипт на VPS:

#!/bin/bash if [[ $1 == '' ]]; then echo -e "Укажите номер порта который нужно слушать"; exit; fi iface=`ip route get 8.8.8.8 | head -n 1 | sed 's|.*dev ||' | awk ''` a=0 until (( $a == 500)); do packet=`tcpdump -i $iface udp port $1 -vvn -c1 -A` if [[ "$packet" == *"Ident"* ]]; then pack=`echo "$packet" | grep -e "udp sum ok" -e "Ident"` myip=`echo $pack | sed 's/\./ /g' | awk ''` myport=`echo $pack | sed 's/\./ /g' | awk ''` id=`echo $pack | sed 's|.*Ident:||' | awk ''` myname=`echo $pack | sed 's|.*Ident:||' | awk ''` echo "$myip:$myport $myname" > /tmp/vpn2-$id-$myname echo "MyData $myip:$myport $(cat /tmp/vpn2-$id-* | grep -v $myname | awk )" | nc $myip $myport -u -p $1 -w 1 cat /tmp/vpn2-$id-* topoint=`cat /tmp/vpn2-$id-* | grep -v "$myname" | sed 's/:/ /g'` if [[ $topoint != '' ]]; then ip=`echo $topoint | awk ''` port=`echo $topoint | awk ''` echo "MyData $ip:$port $(cat /tmp/vpn2-$id-* | grep $myname | awk )" | nc $ip $port -u -p $1 -w 1 fi fi done

Запускается автоматически строкой в /etc/rc.local

#!/bin/bash nohup /путь-до-скрипта/connector2.sh 13013 > /var/log/connector2.log & exit

где 13013 — это порт который нужно слушать, /var/log/connector2.log — лог.

Скрипт на узлах: # cat vpn7.sh

#!/bin/bash ######################## Задаем цветной текст ### WARN='\033[37;1;41m' # END='\033[0m' # RED='\033[0;31m' # $ # GREEN='\033[0;32m' # $ # ################################################# ####################### Проверяем наличие необходымих приложений ######################################################### al="ip echo readlink dirname ps grep awk kill md5sum shuf nc curl sleep openvpn tcpdump cat" ch=0 for i in $al; do which $i > /dev/null || echo -e "$Для работы необходим $i $"; which $i > /dev/null || ch=1; done if (( $ch > 0 )); then echo -e "$Ой, отсутствуют необходимые для корректной работы приложения$"; exit; fi ####################################################################################################################### if [[ $1 == '' ]]; then echo -e "$Введите идентификатор соединения (любое уникальное слово, должно быть одинаковое с двух сторон!) $ \t $Для запуска в автоматическом режиме при включении компьютера можно прописать в /etc/rc.local строку nohup //vpn7.sh > /var/log/vpn7.log 2>/dev/hull & $"; exit; fi ABSOLUTE_FILENAME=`readlink -f "$0"` # полный путь до скрипта DIR=`dirname "$ABSOLUTE_FILENAME"` # каталог в котором лежит скрипт ############################### Проверка наличия и загрузка конфигурационного файла ################################## cfg="$DIR/vpn.cfg" if [[ -f "$cfg" ]]; then echo "$(date) Загружаю конфигурационный файл $cfg" source "$cfg" else echo "$(date) Конфигурационный файл не обнаружен!" fi ############################### Проверка наличия секретного ключа ################################## key="$DIR/secret.key" if [ ! -f "$key" ]; then echo -e "$Секретный ключ VPN-соединения не найден, для генерации ключа выполните: \ openvpn --genkey --secret secret.key Внимание: ключ используется для авторизации и должен \ быть одинаковым с двух сторон. $ # ls -l secret.key -rw------- 1 root root 637 ноя 27 11:12 secret.key # chmod 600 secret.key"; exit; fi ######################################################################################### localport=`shuf -i 20000-65000 -n 1` # Выбор локального порта name=`uname -n | md5sum | awk ''` # Имя узла ipsrv="45.141.103.45" # IP-адрес сервера получения данных о второй стороне portsrv="13013" ############################### Запуск цикла ########### until [[ $count > 100 ]]; do ######################################################################################### until [[ -n "$iftosrv" ]]; do echo "$(date) Определяю сетевой интерфейс"; iftosrv=`ip route get $ipsrv | head -n 1 | sed 's|.*dev ||' | awk ''`; sleep 5; done # Определение интерфейса netcattosrv="nc -u $ipsrv $portsrv -p $localport -w 1" # Команда посылки пакета NC tcpdumptosrv="tcpdump -i $iftosrv udp and src port $portsrv and src $ipsrv and dst port $localport -n -c1 -A" # Команда приема пакета id=`echo $1| md5sum | awk ''` # Преобразеум имя узла в md5 что бы не светить реальное имя ##################### Получение данных о себе и удаленного узла ################################### echo -e "$(date) $Фаза 1 - Получение данных с сервера $ipsrv:$portsrv $" echo -e "$(date) $Использую интерфейс $iftosrv и локальный порт $localport $" until [[ -n "$ip" && -n "$port" ]]; do if [[ -z "$data" ]]; then sleep 1 && echo "Ident: $id $name" | $netcattosrv > /dev/null & sleep 4 && pid=`ps xa | grep "$tcpdumptosrv" | grep -v grep | awk ''` && if [[ -n $pid ]]; then kill $pid; echo "$(date) Нет ответа от сервера, пробую еще раз. "; fi & data=`$tcpdumptosrv` sleep 2 fi if [[ -n "$data" ]]; then #echo "Ответ: $data" data=`echo "$data" | grep "MyData" | sed 's|.*MyData ||' | sed 's/:/ /g'` myip=`echo "$data" | awk ''` myport=`echo "$data" | awk ''` ip=`echo "$data" | awk ''` port=`echo "$data" | awk ''` data='' if [[ -z $tst ]]; then echo -e "$(date) $Мой внешний IP: $myip и порт: $myport $"; fi if [[ -n $localport && -n $myport && -z $tst ]];then if [[ $localport == $myport ]]; then echo -e "$(date) $Мой локальный порт $localport и внешний порт $myport одиноковые, используется CONE NAT $"; tst=1 else echo -e "$(date) $Мой локальный порт $localport и внешний порт $myport разные, используется SYMMETRIC NAT $"; tst=1 fi fi fi if [[ -n "$ip" && -n "$port" ]]; then echo -e "$(date) $Получил данные об удаленном узле: IP: $ip Порт: $port, переходим на следующий этап. $"; else sleep=`shuf -i 30-45 -n 1`; echo -e "$(date) $Нет данных удаленного узла, возможно он еще не вышел на связь, ожидаю данных $sleep секунд и проверяю еще раз. $"; sleep $sleep && pid=`ps xa | grep "$tcpdumptosrv" | grep -v grep | awk ''` && if [[ -n $pid ]]; then kill $pid; fi & data=`$tcpdumptosrv` fi done ###################### Организация соединения с удаленным узлом iftopeer=`ip route get "$ip" | head -n 1 | sed 's|.*dev ||' | awk ''` echo -e "$(date) $Фаза 2 - Установка соединения с удаленным узлом $ip:$port$" echo -e "$(date) $Попытка установки соединения: $myip:$myport -> $ip:$port $" m=0 t=0 connect=0 until (( $connect >= 10 )); do if [ -z "$oktet" ]; then echo "$(date) Октета нет, генерирую и сохраняю в $cfg" oktet=`shuf -i 0-254 -n 1` echo "oktet=$oktet" >> $cfg fi netcattopeer="nc -u $ip $port -p $localport -w 1" tcpdumptopeer="tcpdump -i $iftopeer udp and port $localport and src "$ip" -n -c1 -A" until (( $m >= 10 )); do for w in ; do for pid1nc in `ps xa | grep "$netcattopeer" | grep -v grep | awk ''`;do kill $pid1nc; done; echo "445Hi: $m $oktet" | $netcattopeer > /dev/null & sleep 1 for pidnc in `ps xa | grep "$netcattopeer" | grep -v grep | awk ''`;do kill $pidnc; done done & sleep 4 && pid=`ps xa | grep "$tcpdumptopeer" | grep -v grep | awk ''` && sleep 10 && if [[ -n $pid ]]; then kill $pid && echo -e "$(date) $ Нет ответа от пира, пробую еще раз. $"; fi & peer=`$tcpdumptopeer` if [[ -n $peer ]]; then newport=`echo "$peer" | grep " IP " | sed "s|.* $ip.||" | awk ''` if (( $newport != $port )); then echo -e "$(date) $Порт изменился $port -> $newport $"; port=$newport; netcattopeer="nc -u $ip $port -p $localport -w 1" fi mm=`echo "$peer" | grep "445Hi: " | sed 's|.*445Hi: ||' | awk ''` echo -e "$(date) $ Получил: $mm - передаю: $mm+1 $" if (( $m <= $mm )); then m=$(( $mm + 1 )); fi text=`echo "$peer" | grep "445Hi: " | sed 's|.*445Hi: ||' | awk ''` else (( t++ )) echo -e "$(date) $ Данных нет $t раз $" if (( $t > 5 ));then echo -e "$(date) $ Превышен интервал ожидания, переподключаюсь $"; m=10; connect=1012; ip=''; port=''; fi fi done if (( $connect < 1012 )); then echo -e "$(date) $Значение: $m $" if [[ -n $endoktet ]]; then echo "$(date) Обнаружен конечный октет = $endoktet" if [[ $endoktet == 1 ]]; then ipaddress="10.$text.$oktet.1" else ipaddress="10.$oktet.$text.2" fi else echo "$(date) Не обнаружен конечный октет, генерирую и сохраняю в $cfg" if [[ $port > $myport ]]; then ipaddress="10.$text.$oktet.1" echo "endoktet=1" >> $cfg else ipaddress="10.$oktet.$text.2" echo "endoktet=2" >> $cfg fi fi m=12 for w in ; do for pid2nc in `ps xa | grep "$netcattopeer" | grep -v grep | awk ''`;do kill $pid2nc; done; echo "445Hi: $m $oktet" | $netcattopeer > /dev/null; sleep 0.5; done for pidnc in `ps xa | grep "$netcattopeer" | grep -v grep | awk ''`; do kill $pidnc && echo -e "$(date) $Завершен процесс $pidnc (NetCat) для освобождения порта $localport$"; done rpfilter=`cat /proc/sys/net/ipv4/conf/all/rp_filter` if [[ $rpfilter == 1 ]]; then echo -e "$(date) $rp_filter=$rpfilter - активна защита от подмены адресов (спуфинга)$"; else echo -e "$(date) $Внимение, rp_filter=$rpfilter! Включаю (sysctl -w net.ipv4.conf.all.rp_filter=1) «строгий режим» проверки для защиты от подмены адресов (спуфинга) $"; sysctl -w net.ipv4.conf.all.rp_filter=1 fi echo -e "$(date) $ Запускаюсь. IP-адрес: $ipaddress. $" $(which lsmod) | grep tun || $(which modprobe) tun openvpn --remote $ip --rport $port --lport $localport \ --proto udp --dev tap --float --auth-nocache --verb 3 --mute 20 \ --ifconfig "$ipaddress" 255.255.255.252 \ --secret "$DIR/secret.key" \ --auth SHA256 --cipher AES-256-CBC \ --ncp-disable --ping 10 --ping-exit 40 \ --comp-lzo yes echo -e "$(date) $ Соединение прервано. $" m=0 t=0 (( connect++ )); fi done done

Скопировать скрипт в буфер и вставить в тектовый редактор, например:

# nano vpn7.sh

Сделать скрипт исполняемым:

# chmod +x vpn7.sh

Для первого запуска сгенерируем ключ авторизации secret.key, на удаленной стороне генерировать не надо, нужно скопировать его:

# openvpn --genkey --secret secret.key 

Запустим скрипт, например так:

# ./vpn7.sh 517vA0051smB4dE

Ключ 517vA0051smB4dE сгенерировал на strongpasswordgenerator.com

Запускается автоматически строкой в /etc/rc.local

#!/bin/bash nohup /путь-до-скрипта/vpn7.sh >/var/log/vpn7.log 2>/dev/hull & exit

где ID-соединения — это любая уникальная фраза для вашего соединения, /var/log/vpn7.log — лог соединения, ipsrv=«45.141.103.45» — IP-адрес узла где запущен connector2.sh (первый скрипт).

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

  • использовать узел для хранения особо важных данных, и иметь к ним доступ, допустим, в случае утери ноутбука все данные будут на узле
  • использовать на ноутбуке удаленный рабочий стол компьютера
  • организовать связи с компьютером друга и поиграть в сетевую игру
  • иметь доступ к домашней камере видеонаблюдения с рабочего компьютера или просмотреть веб-камеру ноутбука
  • простота в настройке и использовании
  • трафик идет напрямую
  • трафик шифруется и защищен от перехвата
  • нет необходимости пробрасывать порты
  • скрипт запускается автоматически
  • главный недостаток это использования VPS как источника данных для соединения, но я думаю над этим
  • некоторые провайдеры блокируют трафик между другими провайдерами (замечено у сотовых операторов)
  • при использовании с обоих сторон одного провадера может не сработать, зависит от типа NAT
  • при использовании провадером «жесткого» NAT может не сработать

Думаю на фоне дефицита белых IPv4 адресов моё решение будет актуально, ровно до тех пор, пока в каждый дом не придет IPv6.

  • команда активации защиты от подмены адресов, уязвимость CVE-2019-14899
  • команды завершающие зависшие процессы NC, ускоряется процесс установки соединения
  • внутренние IP-адреса генерируются при первом запуске и их составляющие хранятся в vpn.cfg

Другая моя реализация VPN-туннеля, без использования VPS, с использованием STUN и Яндекс.Диска опубликована тут

  • udp hole punching
  • openvpn
  • vpn over NAT
  • Сетевые технологии
  • Разработка для интернета вещей

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *