Как создать второй туннель GUE на другом порту

Вопрос или проблема

Как можно создать несколько туннелей GUE в одном и том же (по умолчанию) пространстве имен сети с одинаковым удаленным IP-адресом, но разными портами?

До сих пор мне удалось успешно создать ровно один туннель GUE в каждом пространстве имен. В качестве обходного пути для проблемы с 1 туннелем на пространство имен, я настроил по одному netns для каждого туннеля и пересылал пакеты в зависимости от их номера порта.

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

sudo ip fou show
port 1037 gue local 10.0.0.252 peer REMOTE_IP peer_port 1037 dev eth0
port 1036 gue local 10.0.0.252 peer REMOTE_IP peer_port 1036 dev eth0

Однако, когда первый порт 1036 уже настроен в том же (по умолчанию) netns, добавление второго устройства GUE выдает ошибку:

sudo ip link add name guetun1 type ipip remote REMOTE_IP local 10.0.0.252 encap fou encap-sport 1037 encap-dport 1037 mode ipip dev eth0
RTNETLINK answers: File exists

Это не срабатывает только тогда, когда предыдущий туннель GUE уже настроен, в противном случае это работает. Это также работает при настройке в другом netns. Просто удаление существующей ссылки gue заставляет команду, приведенную выше, работать: sudo ip link del guetun0.

Переименование ссылок (gue0 в guetun0, tunl0 в tunnel0) не устраняет ошибку.

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

Ответ или решение

Создание нескольких туннелей GUE (Generic UDP Encapsulation) с использованием одного и того же удаленного IP-адреса, но разных портов, может представить собой вызов из-за ограничений текущей реализации в ядре Linux. Основная проблема, с которой вы столкнулись, связана с тем, что ядро Linux, вероятно, ассоциирует GUE интерфейсы по локальным и удаленным IP-адресам, игнорируя при этом номера портов. Давайте более детально рассмотрим эту проблему и предложим возможные решения.

Теория
Generic UDP Encapsulation (GUE) — это метод заключения различных типов пакетов в UDP, что позволяет упростить их передачу через сетевые устройства и повысить совместимость с существующей сетевой инфраструктурой. В то время как FOUs (Foo-over-UDP) позволяют организовывать множество портов в одном пространстве имен, реализация GUE имеет ограничения: создание нескольких туннелей с одинаковыми параметрами IP может быть невозможно, даже если планируется использовать разные порты. Это связано с тем, что в ядре Linux механизмы GUE обрабатывают туннели с учетом IP, без учета портового уровня.

Пример
Ваш опыт: при попытке создания второго GUE туннеля с теми же IP, но другими портами, система возвращает сообщение об ошибке:

sudo ip link add name guetun1 type ipip remote REMOTE_IP local 10.0.0.252 encap fou encap-sport 1037 encap-dport 1037 mode ipip dev eth0
RTNETLINK answers: File exists

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

Применение
Как обойти текущее ограничение и создать второй туннель без задействования разных пространств имен? Рассмотрим несколько путей:

  1. Обновление ядра: В более новых версиях ядра Linux могут быть устранены проблемы с сетевой настройкой, связанные с реализацией GUE. Убедитесь, что ваша система использует самую последнюю стабильную версию ядра.

  2. Кастомизация ядра: Если обновление не помогает, рассмотрите возможность настройки и компиляции кастомной версии ядра, которая позволит управлять GUE интерфейсами более гибко.

  3. Изменение конфигурации: Убедитесь, что все параметры FOU правильно отработаны и не конфликтуют с существующими настройками других интерфейсов.

  4. Использование других протоколов: При невозможности обхода через прямые методы, можно рассмотреть возможность использования альтернативных протоколов туннелирования, таких как GRE (Generic Routing Encapsulation), который может предложить требуемую гибкость.

  5. Pull Requests и Kernel Patches: Внести предложение/запрос о функциональности, позволяющей специфически учитывать порты в GUE, в рамках развития ядра Linux. В зависимости от сложности задачи, может потребоваться взаимодействие с сообществом разработчиков ядра.

Если ни один из способов не удовлетворяет вашим требованиям, может потребоваться сотрудничество с разработчиками сетевых подсистем ядра Linux для поиска или разработки патча, обеспечивающего нужную функциональность. Обсуждение проблемы на форумах и платформах, таких как LKML (Linux Kernel Mailing List), может помочь выявить, заинтересовано ли сообщество в данной функциональности, и способно ли предложить уже работающее решение или готово принять увеличение функционала в грядущих релизах.

Также, важно отметить, что использование сетевых пространств имен — это стандартный подход для разграничения конфигураций и систем Linux. Как правило, это не должно рассматриваться как «костыль», а скорее как встроенный механизм сегментации для повышения безопасности и управления ресурсов. Тем не менее, стремление упростить архитектуру также является важной задачей, и поиск решений для одновременной работы нескольких туннелей в одном пространстве имен заслуживает внимания.

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

Капча загружается...