Несколько IP-адресов для сетевого интерфейса и подключения

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

Я хотел присвоить несколько IP-адресов одному и тому же сетевому адаптеру для тестирования.

Адрес сетевого адаптера удаленного сервера: 50.50.50.192
IP-адрес eth0: 50.50.50.242

Я добавил другой IP-адрес с помощью команды: ip addr add 50.50.50.241/24 dev eth0

Идея заключается в имитации множественных потоков IP. Чтобы сделать это с вышеуказанной настройкой, я попробовал использовать iPerf: https://stackoverflow.com/questions/79204094/iperf-and-ip-aliasing

Я также попытался использовать код из https://stackoverflow.com/questions/64060492/simulate-multiple-clients-with-different-ips-to-server-socket

В обоих случаях на сервере (50.50.50.192) я вижу, что соединение устанавливается с 50.50.50.242, IP-адрес eth0, а не дополнительный IP-адрес, который я добавил (50.50.50.241).

Мне нужно сделать что-то еще, чтобы соединение устанавливалось с использованием дополнительного IP-адреса eth0 (50.50.50.241), а не оригинального IP-адреса (50.50.50.242).

Примечание: как локальный, так и удаленный являются виртуальными машинами OpenStack.

Спасибо заранее!

Обычно это то, что просто работает по умолчанию. То есть, единственное, что нужно для использования другого IP-адреса, это bind() создать сокет клиента, что уже делает iPerf.

Так что, если программа связывается с одним локальным адресом, но tcpdump показывает пакеты, выходящие с другим исходным адресом, это, скорее всего, правило NAT iptables или nftables на той же системе – например, слишком широкое правило masquerade.

Один из способов это подтвердить – проверить таблицу conntrack, используемую файрволом, с помощью conntrack -L или файла /proc/self/net/nf_conntrack. В ней будут два набора полей src/dst для каждого соединения – первая пара – это оригинальные (исходные) адреса, затем вторая пара src/dst имеет адреса “ожидаемого ответа” (входные).

Если они не совпадают (в частности, в этом случае, если orig_src не совпадает с reply_dst), тогда адрес был переписан правилами NAT iptables. Используйте iptables-save или nft list ruleset, чтобы найти правило, и уточните его или удалите, если необходимо.

Например, если у вас есть:

oifname eth0 masquerade

тогда оно безусловно применит SNAT ко всем исходящим пакетам, переписывая их, чтобы они имели первый IP-адрес интерфейса – даже если они уже приходят с другого адреса того же интерфейса. Поэтому уточните его, добавив исключение “IP-адрес источника”:

ip saddr != 50.50.50.0/24 oifname eth0 masquerade

также -s ! 50.50.50.0/24 для iptables.


Примечание относительно предыдущего поста на Stack Overflow:

Не существует такого понятия, как алиасирование IP. Адреса не союзны друг с другом; то, что у вас было раньше с eth0:1, на самом деле просто несколько независимых адресов на одном и том же интерфейсе eth0 (как у вас сейчас с “ip addr add”).

Это интерфейсы, которые имеют алиасы в Linux – или точнее имели давно. “Алиасные интерфейсы” были древним обходным путем для недостаточного API Linux, который (в то время) использовался для настройки сетевых интерфейсов и который имел только функцию “установить адрес”, но не “добавить/удалить адрес”, поэтому системе приходилось изобретать поддельные интерфейсы для каждого нового адреса.

Но алиасы интерфейсов больше не были необходимы с ядра 2.4.x (~20 лет назад), которое ввело более современный API, который позволяет просто добавлять несколько адресов к одному и тому же интерфейсу – что вы можете делать, используя ‘ip addr add’ в наше время – и они сохраняются в ‘ifconfig’, потому что он все еще использует тот старый API.

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

Вопрос, который вы подняли, касается назначения нескольких IP-адресов на один сетевой интерфейс (NIC) и использования их в тестах, например, с помощью инструмента iPerf. Давайте рассмотрим данную проблему более подробно и обсудим возможные причины, по которым вы не можете использовать добавленный IP-адрес (50.50.50.241) для установления соединения.

Шаг 1: Понимание назначения нескольких IP-адресов

Ваша задача заключается в том, чтобы назначить несколько IP-адресов на одному сетевом интерфейсе (eth0) для симуляции множества потоков трафика. Вы уже сделали это, добавляя IP-адрес 50.50.50.241 с помощью команды ip addr add. Так как Linux позволяет добавлять несколько IP-адресов на один интерфейс, этот шаг был выполнен правильно.

Шаг 2: Проверка ограничений NAT

Вы упомянули, что соединения устанавливаются с использованием IP-адреса 50.50.50.242, а не 50.50.50.241. Это может быть связано с тем, что на вашей системе действуют правила NAT, настроенные через iptables или nftables. Чтобы проверить, есть ли такие правила, выполните следующие команды:

  1. Проверьте таблицу conntrack:

    conntrack -L

    Или откройте файл /proc/self/net/nf_conntrack. Найдите соединение, которое вас интересует, и посмотрите поля src/dst.

  2. Просмотрите правила iptables или nftables:
    Для iptables:

    iptables-save

    Для nftables:

    nft list ruleset

Если в вашем выводе присутствует правило типа:

oifname eth0 masquerade

Это может означать, что все исходящие пакеты преобразуются (SNAT) к первому IP-адресу интерфейса, что и является причиной поведения, которое вы наблюдаете.

Шаг 3: Настройка правил NAT

Чтобы корректно использовать несколько IP-адресов на одном интерфейсе без нежелательного изменения адресов, вы можете Narrow down свои правила NAT. Например, добавьте исключение для IP-адресов, которые вы назначили:

Для iptables:

iptables -t nat -A POSTROUTING -s 50.50.50.0/24 ! -o eth0 -j MASQUERADE

Для nftables:

nft add rule ip nat POSTROUTING ip saddr 50.50.50.0/24 oifname eth0 masquerade

Эти команды помогут избежать ненужного переписывания адресов, сохраняя оригинальные IP-адреса для исходящих пакетов.

Заключение

Решение вашей проблемы заключается прежде всего в правильной настройке NAT. Важно также помнить, что в Linux больше нет необходимости в так называемых «алиасах» интерфейсов, как это было в прошлом; вы можете просто добавлять несколько IP-адресов к одному интерфейсу, как вы и сделали.

Если после изменения правил NAT поведение не изменится, проверьте ваше приложение или тестовый скрипт для выполнения привязки к правильному IP-адресу. iPerf и другие инструменты должны поддерживать эту функциональность, если они корректно настраивают сокеты для прослушивания и установления соединений по указанным IP-адресам.

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

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

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