Вопрос или проблема
Предисловие: Я хочу превратить n + 1 соединения в одно соединение, где задержка переключения на резервное соединение равна 0, дублируя трафик по множеству соединений и отбрасывая пакеты при получении.
Исследование: Я изучил mlvpn, который, как я обнаружил, просто этого не делает, кроме того, я не хочу использовать нестандартные компоненты Linux, если могу этого избежать.
bonding
кажется подходящим решением, особенно с режимом = broadcast, который просто дублирует трафик по всем каналам.
Я объединил это с туннелями openvpn tap, которые связаны друг с другом по обоим концам следующим образом:
----- tap 0 -----
/ \
(home-router) bond0 bond0 (vps server)
\----- tap 1 ------/
Здесь много препятствий, и это не идеально, но мне удалось заставить эту настройку работать:
- Я могу использовать tcpdump на tap0, tap1 и bond0 и видеть именно то, что ожидаю: трафик дублируется по tap0 и tap1.
- Я могу остановить процесс openvpn на сервере и наблюдать отсутствие активности на одном из двух taps, при этом наблюдая нулевую задержку переключения пинга на bond0.
Что я не могу сделать, так это удалить дубликаты трафика.
Я изучал nftables, ebtables и iptables (в порядке убывания предпочтений). Я также исследовал eBPF.
Наверняка то, что я пытаюсь достичь, уже было сделано раньше, я не могу быть первым, кто изобретает этот велосипед. Есть идеи?
Ответ или решение
Устранение дублирования целенаправленно дублированного трафика уровня 2
Введение
Современные коммуникационные системы требуют высокой надежности и низкой задержки при передаче данных, что делает важным создание устойчивых соединений. Ваша задачей является объединение нескольких соединений в одну виртуальную цепочку с нулевой задержкой переключения при сбоях через дублирование трафика. Данный подход не только повышает производительность, но и обеспечивает надежность и отказоустойчивость.
Задачи и подготовка
Ваш метод с использованием bonding
с режимом broadcast
и OpenVPN
действительно интересен. Он дает возможность дублировать трафик и обеспечивать быстрый отказ при потере одного из соединений. Тем не менее, значительная проблема заключается в необходимости устранения дублирующего трафика на стороне приемника. Это требует наличия механизмов для фильтрации или удаления повторяющихся пакетов.
Изучение доступных инструментов
-
nftables и ebtables: Эти инструменты позволяют управлять сетевыми пакетами на низком уровне, однако их использование требует знания о структуре пакетов и механизмах фильтрации. Например, использование nftables можно настроить на фильтрацию повторяющихся MAC-адресов, однако это не всегда эффективно для сложных пакетов.
-
iptables: Этот инструмент более распространен, что делает его доступным для большинства систем. Можно использовать параметры для фильтрации пакетов и дублирующего трафика, но их настройка потребует значительно больше времени и усилий.
-
eBPF: Быстрый и мощный механизм для обработки пакетов. Его можно использовать для реализации более сложных логик на уровне ядра. Написанием программ для eBPF можно управлять дублирующимися пакетами с высокой степенью гибкости.
Подход к решению проблемы
На основании вашего описания, два возможных пути могут быть предложены:
1. Использование eBPF для фильтрации
Создание eBPF программы для мониторинга и фильтрации входящих пакетов на стороне получателя. Основная идея заключается в том, чтобы отслеживать и удалять дублирующиеся пакеты на уровне ядра:
- Напишите программу на C и управляйте id и timestamp пакетов для определения их уникальности.
- Загрузите eBPF программу через
bpftool
илиclang
. - Настройте хук на уровне сети, который будет обрабатывать входящие пакеты.
2. Модификация iptables
Если использование eBPF нецелесообразно, вы можете настроить iptables для фильтрации повторяющихся пакетов. Это возможно, если ваши данные имеют одинаковые заголовки:
- Создайте правило с использованием
conntrack
для отслеживания соединений. - Установите и добавьте правила, которые обеспечат удаление дублируемых пакетов в потоке.
Выводы
Ваше решение по объединению соединений через дублирование трафика предоставляет уникальную возможность повысить производительность и улучшить отказоустойчивость сетевых систем. Однако, устранение дублированного трафика требует тщательной настройки и выбора оптимальных инструментов. Использование eBPF может обеспечить мощное решение, в то время как iptables даст базовую фильтрацию. Не забывайте также учитывать производительность и ресурсы системы при реализации ваших решений.
Таким образом, создание эффективного механизма для устранения дублирования трафика требует комплексного подхода и понимания как сетевых технологий, так и инструментов, доступных в экосистеме Linux.