Дублирование и маршрутизация пакетов с помощью iptables

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

Простите меня. У меня нет опыта в использовании инструментов сетевого взаимодействия CLI.

У меня есть 3 машины с Linux (клиент (C), сервер (S) и узел посередине (M)). C и M имеют прямое соединение в подсети 192.168.100.0/24. Для простоты я назову интерфейсы и IP-адреса, через которые они подключены, C_M (интерфейс C к M) и M_C (интерфейс M к C). C и M подключены к S через отдельные интерфейсы (M_S, C_S) в подсети 10.45.0.0/24. S использует один и тот же интерфейс (S_CM) для подключения к обоим. S находится в нескольких прыжках от C и M.

Моя цель – передавать пакеты между C и S, используя оба пути одновременно (клиент-сервер, клиент-узел-сервер). Одни и те же пакеты (дубликаты) должны отправляться по каждому пути. C одновременно отправляет дублирующиеся пакеты, предназначенные для S, через свое соединение с S и свое соединение с M. S делает то же самое в обратном направлении. M просто пересылает полученные пакеты. Я пытаюсь сделать это с помощью iptables и статических IP-маршрутов.

Однако пути через M не работают. Для проверки того, работает ли эта конфигурация, я отправил две команды ping с сервера на клиент и с клиента на сервер. Я использовал правила сопоставления iptables, чтобы подсчитать входящие и исходящие пакеты для каждого узла. Исходя из результатов, я пришел к следующим выводам:

M видит трафик от C, но не пересылает его.
M ничего не получает от S.
C получает дубликаты пакетов от S, но только через C_S.
S не получает дубликаты пакетов от C.
C правильно отправляет дубликаты пакетов через оба интерфейса.
Мои настройки следующие. Настройка по умолчанию для всех iptables на каждом узле – ACCEPT. Каждый узел уже знает, что следует отправлять трафик 10.45.0.0/24 и 192.168.100.0/24 на свой интерфейс в этой же подсети.

  • Клиент: iptables -t mangle -A OUTPUT -d S_CM -j TEE --gateway M_C
  • Посредник: ip r add C_S via I_C
  • Сервер: sudo iptables -t mangle -A OUTPUT -d C_S -j TEE --gateway M_S

Я никогда не изменяю адрес источника или назначения любого пакета.

Моя теория заключается в том, что я неправильно понимаю TEE. Возможно, M нужно сделать что-то особенное, чтобы иметь возможность пересылать пакеты от C? Я теперь очень уверен, что шлюз TEE не может находиться более чем в одном прыжке (что объясняет, почему M ничего не получает от S).

Тем не менее, я не уверен, как это исправить. Буду признателен за любые советы.

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

Дублирование и маршрутизация пакетов с использованием iptables: пошаговое руководство

Введение

Ваша задача по дублированию и маршрутизации пакетов между тремя Linux-узлами (клиентом C, сервером S и промежуточным узлом M) представляет собой интересный вызов в области сетевых технологий. Использование iptables для достижения многопутевой маршрутизации может быть сложности, особенно когда речь идет о дублировании пакетов. Давайте рассмотрим вашу ситуацию и предложим решение, которое поможет добиться нужного результата.

Структура сети

У вас есть три компьютерные системы:

  • Клиент (C) — подключен к M через интерфейс на подсети 192.168.100.0/24.
  • Промежуточный узел (M) — функционирует как маршрутизатор между C и S.
  • Сервер (S) — подключается к M и C через разные интерфейсы на подсети 10.45.0.0/24.

Проблемы с текущими настройками

Согласно вашему описанию, наблюдаются следующие проблемы:

  1. M видит трафик от C, но не пересылает его.
  2. M не получает ничего от S.
  3. C получает дублирующие пакеты от S только через своё соединение C_S.
  4. S не получает дублирующие пакеты от C.

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

Анализ и решение проблем

Ваша гипотеза о том, что TEE требует более близкого конечного узла, оказалась верной. Давайте рассмотрим более детально, как можно настроить маршрутизацию:

  1. Настройка iptables на узле M:
    Убедитесь, что M позволяет IP_FORWARD. Это можно сделать, выполнив команду:

    echo 1 > /proc/sys/net/ipv4/ip_forward
  2. Правила iptables для промежуточного узла M:
    Добавьте правило в таблице mangle для пересылки пакетов от C к S:

    iptables -t mangle -A FORWARD -i M_C -o S_CM -j ACCEPT
    iptables -t mangle -A FORWARD -i S_CM -o M_C -j ACCEPT
  3. Правила iptables для клиента C:
    Убедитесь, что правило TEE настроено правильно. Ваша команда выглядит корректно, но давайте добавим правило для пересылки:

    iptables -t mangle -A OUTPUT -d S_CM -j TEE --gateway M_C
  4. Правила iptables для сервера S:
    Также убедитесь, что ваше правило для TEE правильно настроено:

    iptables -t mangle -A OUTPUT -d C_S -j TEE --gateway M_S
  5. Статическая маршрутизация:
    Убедитесь, что все машины правильно знают маршрутизацию к субсетям. В частности, для узла M может понадобиться следующее:

    ip route add 192.168.100.0/24 via C_M
    ip route add 10.45.0.0/24 via S_CM

Проверка конфигурации

После внесения изменений убедитесь, что вы применили следующие команды для проверки состояния и работы iptables:

iptables -t mangle -L -v

Также используйте утилиты, такие как tcpdump, для мониторинга трафика:

tcpdump -i M_C

Заключение

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

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

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

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