Мне нужно создать конфигурацию OpenVPN клиент-сервер таким образом, чтобы на стороне клиента каждому IP-пакету присваивались некоторые метаданные (например, идентификатор или имя), а с другой стороны каждый из них обрабатывался по-разному в зависимости от назначенных им метаданных. с. Для отправки метаданных я могу придумать два пути:

  • Использование поля ToS, хотя оно маленькое.
  • Добавление к полезной нагрузке и, следовательно, изменение длины / контрольной суммы / ...

Есть ли лучший способ, чтобы пометить каждый пакет? Предоставляет ли OpenVPN решение для этого требования?

На стороне сервера (то есть на стороне сервера OpenVPN), есть ли способ использовать существующий механизм для MITM-типа каждого пакета? Чтобы быть более точным, мне нужно прочитать все метаданные (с которыми идет каждый IP-пакет) и записать некоторую статистику классификации или их брандмауэр.

Предоставляет ли OpenVPN чистое решение для этого? В противном случае я должен коснуться кода на стороне сервера OpenVPN и собрать их самостоятельно?

+------+   + ----+   +--------+           +--------+   +-----+    +----------+
| apps |---| tun |---| socket | ========= | socket |---| tun | ---| Internet |
+------+   +-----+   +--------+           +--------+   +-----+    +----------+
                   ^                                 ^
                   |                                 |
here packets are marked by my custom OpenVPN client  |
                                                     |
                        here I'd need to firewall packets based on the "metadata"

2 ответа2

1

Если у вас есть собственный клиент OpenVPN, вам нужно будет обрабатывать разметку любым способом, каким вы решите сделать это, написав код. Обратите внимание, что PID процесса, который инициировал пакет, недоступен клиенту OpenVPN и фактически может вообще не быть доступным как свойство пакета. Вам нужно будет поместить процессы на клиенте в сетевые пространства имен или тому подобное, чтобы получить такую информацию.

Если вам нужны другие виды "метаданных", укажите, что вы хотите.

На стороне сервера iptables может делать все, что угодно, без необходимости изменять сервер OpenVPN. Вы можете сопоставить на ToS с --tos , вы можете сопоставить на TTL с --ttl-* , вы можете сопоставить любые четыре байта с --u32 , или вы можете запустить полную программу фильтра BPF с --bytecode вы решили добавить заголовки расширений или что-то еще. Для сопоставления пакетов вы можете вставить их в желаемый выходной интерфейс, вы можете пометить их внутренне и направить их или что угодно еще. Смотрите man iptables-extensions для подробностей.

Так что эта часть проста, сложная часть состоит в том, чтобы сначала выяснить, какие метаданные вы хотите, кроме PID, а затем найти способ добавить их в пакеты, если у клиента OpenVPN действительно нет способа получить эти метаданные.

редактировать

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

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

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

Я до сих пор не знаю вариант использования, который у вас есть для этого, но из вашего описания ваших планов я вполне уверен, что это не сработает, потому что все замедлится до ползания. Пожалуйста, пересмотрите все, что вы пытаетесь сделать, укажите сценарий использования (чего вы хотите достичь?) И выясните какое-нибудь решение в пространстве ядра с использованием iptables и, возможно, нескольких клиентов и серверов OpenVPN, если вам нужна некоторая сегрегация.

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

Удачи, вам это понадобится.

редактировать

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

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

1

SELinux Labeled Networking позволяет вам писать политику маркировки трафика вплоть до процесса, который его генерирует. Политика на удаленном хосте делает доступ к решениям / фильтрации на основе маркировки. Однако сеть с метками поддерживается только в сетях с метками IPSec и CIPSO, но не в OpenVPN.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .