Рейтинг:0

OpenVPN Изменение входящего трафика или полезной нагрузки с помощью специального сценария

флаг ph

Недавно я настроил OpenVPN с Dnsmasq в качестве DNS и хочу сделать что-то, о чем не могу найти никакой информации.

Вот мое текущее понимание, основанное также на том, что я сейчас настроил на своем сервере.

A. Клиент подключается к OpenVPN, скажем, с телефона

B. Клиенты отправляют трафик, т.е. открывают веб-сайт, скажем, YouTube.

C. Сервер OpenVPN принимает запрос.

D. Перенаправляет запрос на целевой сервер, например YouTube.

E. YouTube отвечает.

F. OpenVPN пересылает ответ клиенту от A

Конечно, вышеизложенное слишком упрощено.

Что я хочу сделать?

Между этапами C и D, например, после того, как OpenVPN принимает запрос (или получает ответ от целевого сервера, т.е. D->C), я хочу обработать фактические данные.

Например, типичный вариант использования.

Между D и C я хочу передать полезную нагрузку, например, скрипту Python, изменить весь текст «Я люблю тебя» в html веб-страницы на «Я тебя ненавижу» до того, как полезная нагрузка будет упакована и отправлена ​​клиенту.

Вопрос

Существуют ли какие-либо формы «крючков жизненного цикла» с OpenVPN, где я могу в основном прослушивать и изменять полезную нагрузку запроса?

Я понимаю, что любое входящее или исходящее соединение из OpenVPN защищено «форт-нокс». Меня интересует тот момент, когда полезная нагрузка ответа лежит голой на сервере.

Какие у меня есть доступные варианты? Нужно ли мне использовать другой пакет/программное обеспечение для достижения таких результатов?

флаг us
Единственное место, где я могу придумать, где вы можете отслеживать и манипулировать пакетом TCP, это физический сетевой интерфейс, такой как eth0 или ens2p0. Однако: если ваш VPN-сервер использует NAT для перенаправления трафика в Интернет, это становится немного сложнее, поскольку вы хотите передавать в Интернет трафик, выходящий из VPN, до того, как он пройдет через NAT. Это нетривиальная задача.
флаг us
Обновил мой ответ ниже, подробно объяснив, почему вы не можете добиться каких-либо целей, которые хотите.
Рейтинг:3
флаг us

Ваша идея неосуществима по нескольким причинам:

1)

Насколько я помню, в самой OpenVPN нет функции для передачи данных из VPN-подключения в пользовательский процесс перед пересылкой.

Для справки: проверьте, где TCP/IP используется в стеке OSI.

OpenVPN находится на уровне 3 стека OSI (сетевой уровень), а пакеты TCP принадлежат уровню 4 (транспортный уровень).

Только по этой причине ваш вопрос выходит за рамки того, чего хочет достичь OpenVPN.

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

Эти ситуации можно определить в файле конфигурации вашего сервера с помощью следующих настроек:

# клиент подключен к VPN-серверу
клиент-подключение "/script/client_connect.sh"

# клиент отключен от VPN-сервера
клиент-отключение "/script/client_disconnect.sh"

Все переменные среды, доступные для вашего пользовательского скрипта, доступны здесь:

https://openvpn.net/community-resources/reference-manual-for-openvpn-2-4/#scripting-and-environmental-variables

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

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

2)

Ссылаясь на эту диаграмму пакета IPv4 от Википедия:

Схема пакета IPv4

По сути, вы хотите манипулировать полем данных в зависимости от исходного или конечного адреса.

Это также известно как атака «человек посередине».

Как вы уже поняли, это сложно сделать, прослушивая интерфейс OpenVPN, так как весь контент зашифрован. Что происходит, так это то, что пакет IPv4, предназначенный для Интернета, инкапсулируется в другой пакет IPv4, предназначенный для сервера OpenVPN.

Инкапсулированный пакет IPv4 хранится в поле данных на приведенной выше диаграмме.

Это декапсулированный пакет, который пересылается в Интернет с VPN-сервера.

Однако есть оговорка:

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

Точно так же, когда хост отвечает ответом, у нас есть IPv4-адрес назначения, такой же, как у VPN-сервера.

Это означает, что для манипулирования полем данных нам нужно отслеживать, какие порты используются в таблица трансляции сетевых адресов (он же НАТ).

Используемые порты обычно являются динамическими по своей природе, поскольку более одного клиента VPN могут подключаться к Интернету через VPN и NAT, и каждый сеанс TCP (почта, Интернет, ssh и т. д.) использует другой порт.

Итак, если вы хотите манипулировать расшифрованный TCP-пакет это должно произойти после расшифровки, но до трансляции в NAT.

Теоретически вы можете перехватить пакет, используя iptables, но это нетривиально, когда VPN и NAT находятся на одной машине.

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

Это выполнимо как классическая атака «человек посередине». Хотя я не знаю, как это делается. :-)

... но это приводит меня к моему последнему аргументу:

3)

Большая часть трафика в Интернете шифруется по протоколу TLS.

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

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

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

Уже одно это делает вашу атаку «человек посередине» бесполезной.

Вот это максимально близко к полному ответу на ваш вопрос.

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

Эта часть НАМНОГО выше моей квалификации. :-)

флаг ph
Очень ценю подробный ответ. Дал мне много указателей, чтобы прочитать больше.
флаг us
Возможно, вы захотите пометить ответ как «принятый». В конце концов, вы не можете получить вознаграждение за свою репутацию. :-)

Ответить или комментировать

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