Это было бы очень трудно (но не возможно), чтобы система 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. Кроме того, это позволяет проводить эксперимент внутри контейнера с физическими сетевыми адаптерами (поскольку 1
network namespace — это пространство имен контейнера, а не реальное пространство имен хоста), иначе физический сетевой адаптер снова появится на хосте и навсегда будет потерян для контейнера, если к хосту нет доступа.
Если нет инструмента (например, udev + ifupdownх разрешить горячее подключение
или NetworkManager), обнаружив появление NIC, его снова придется настраивать по возвращении.