Рейтинг:2

Маршрутизация трафика через физический интерфейс

флаг cn

У меня есть два интерфейса Ethernet на Linux-машине. Оба имеют следующие IP-адреса: Интерфейс А: 10.0.1.5/24 Интерфейс Б: 10.0.2.5/24

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

Теперь я хочу начать измерение iperf3, где я привязываю сервер к интерфейсу A, а клиент к интерфейсу B.

Проблема в том, что трафик не покидает физический интерфейс, а проходит только через ядро, что приводит к скорости, которая даже невозможна для канала.

Что я могу сделать, чтобы форсировать трафик через физический интерфейс? ip_forward отключен.

Спасибо.

Рейтинг:1
флаг cl
A.B

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

Но в Linux очень легко создавать дополнительные сетевые стеки для имитации нескольких систем в одной системе: с помощью сетевые пространства имен.

Здесь можно передать одну из двух сетевых карт новому сетевому пространству имен, которое будет одноранговым с исходным (хостовым) сетевым пространством имен. Они не будут общаться напрямую, а только через внешний маршрутизатор. Предположим, что интерфейсы действительно названы А и Б и что роутер использует адреса 10.0.1.1/24 + 10.0.2.1/24.

  • создать новое сетевое пространство имен с дополнительным упрощенным управлением при использовании iproute2 инструменты (под капотом монтируются псевдофайлы пространства имен, чтобы ресурс оставался без процесса и т. д.).

    ip netns добавить сторону B
    
  • переместить интерфейс Б в новое сетевое пространство имен:

    ip link set dev B netns sideB
    

    примечание: беспроводные интерфейсы требуют использования я вместо этого команда.

  • настроить новое сетевое пространство имен:

    Все его сетевые настройки теряются, когда интерфейс меняет пространство имен (как на хосте, где интерфейс исчезает, вызывая исчезновение адресов, вызывая исчезновение маршрутов, так и в новом сетевом пространстве имен):

    ip -n sideB link set dev B up
    ip -n sideB адрес добавить 10.0.2.5/24 dev B
    

    Не требуется, но на случай, если iperf3 запутается, создайте функциональный петлевой интерфейс:

    ip -n sideB link set lo up
    
  • настроить маршруты между двумя сторонами (исходное пространство имен/узла может уже иметь его через маршрут по умолчанию, но давайте будем явными)

    IP-маршрут добавить 10.0.2.0/24 через 10.0.1.1 dev A
    
    ip -n sideB маршрут добавить 10.0.1.0/24 через 10.0.2.1 dev B
    

Теперь можно запустить (в двух терминалах):

iperf3 -s

ip netns exec sideB iperf3 -c 10.0.1.5

с клиентом, работающим в новом сетевом пространстве имен.

После завершения измерения удаление сетевого пространства имен вернет сетевую карту в пространство имен хоста. Но если какой-либо процесс будет по ошибке оставлен с использованием этого сетевого пространства имен (что-то вроде ip netns exec сторона B setsid sleep 9999) ip netns удалить сторону B ниже только удалит пространство имен из представления iproute2 инструменты, но фактически не удаляет пространство имен, пока процесс не завершится, что затрудняет восстановление сетевой карты. Так что лучше сначала переместите его обратно:

ip -n набор ссылок sideB dev B netns 1
ip netns удалить сторону B

куда 1 означает сетевое пространство имен PID 1: пространство имен initial/host. Кроме того, это позволяет проводить эксперимент внутри контейнера с физическими сетевыми адаптерами (поскольку 1network namespace — это пространство имен контейнера, а не реальное пространство имен хоста), иначе физический сетевой адаптер снова появится на хосте и навсегда будет потерян для контейнера, если к хосту нет доступа.

Если нет инструмента (например, udev + ifupdownх разрешить горячее подключение или NetworkManager), обнаружив появление NIC, его снова придется настраивать по возвращении.

флаг cn
Спасибо! К сожалению, я пока не могу проголосовать.

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

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