В Linux, как отправлять пакеты с локальным назначением НЕ через интерфейс loopback

В Linux, как отправлять пакеты с локальным назначением НЕ через интерфейс loopback

У меня есть сервер Linux с двумя интерфейсами ethernet, которые подключены к одному коммутатору и находятся в одной подсети. Топология следующая

+--------------------+
|                    |
|         +----------+        +----------+
|         | enp1s0f0 |<======>|          |
|         +----------+        | ethernet |
|  Server            |        |          |
|         +----------+        |  switch  |
|         | enp1s0f1 |<======>|          |
|         +----------+        +----------+
|                    |
+--------------------+

IP-адреса этих двух интерфейсов — 172.16.0.100и 172.16.1.100соответственно.

$ ip addr
...
4: enp1s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 10:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
    inet 172.16.0.100/16 brd 172.16.255.255 scope global noprefixroute enp1s0f0
       valid_lft forever preferred_lft forever
5: enp1s0f1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 10:00:00:00:01:00 brd ff:ff:ff:ff:ff:ff
    inet 172.16.1.100/16 brd 172.16.255.255 scope global noprefixroute enp1s0f1
       valid_lft forever preferred_lft forever
...

Теперь я хочу отправить пакеты с enp1s0f0на enp1s0f1через внешний коммутатор (в целях тестирования, с точки зрения коммутатора, есть два отдельных компьютера, которые общаются друг с другом). Поэтому я привязываю локальный адрес сокета к 172.16.0.100 и подключаю его к 172.16.1.100 (например, с помощью telnet -b 172.16.0.100 172.16.1.100 22команды). Однако я могу видеть, что эти пакеты проходят только через loинтерфейс (проверяя захваченные пакеты), а не через эти два интерфейса Ethernet и коммутатор.

Итак, мой первый вопрос:как заставить Linux отправлять эти пакеты с локальным назначением через внешний интерфейс?

Я думаю, что я правильно установил адреса и таблицу маршрутизации. Таблица маршрутизации содержит следующие записи

$ ip route
...
172.16.0.0/16 dev enp1s0f0 proto kernel scope link src 172.16.0.100 metric 100
172.16.0.0/16 dev enp1s0f1 proto kernel scope link src 172.16.1.100 metric 101

И таблица ARP тоже, похоже, настроена правильно.

$ arp -n
Address                  HWtype  HWaddress           Flags Mask            Iface
172.16.1.100             ether   10:00:00:00:01:00   CM                    enp1s0f0
172.16.0.100             ether   10:00:00:00:00:00   CM                    enp1s0f1

Однако Linux по-прежнему направляет эти пакеты через loинтерфейс

$ ip route get from 172.16.0.100  172.16.1.100
local 172.16.1.100 from 172.16.0.100 dev lo uid 1000
    cache <local>
$ ip route get from 172.16.1.100  172.16.0.100
local 172.16.0.100 from 172.16.1.100 dev lo uid 1000
    cache <local>

Я также пробовал pinging с этих интерфейсов, например ping -I enp1s0f0 172.16.1.100. Захваченные пакеты показывают, что отправленные пакеты ICMP могут прибыть к месту назначения через коммутатор, как и ожидалось, однако на интерфейсе нет ответных пакетов enp1s0f1. Я искал решение этой проблемы и нашелэтотответ, и там говорится, что это может относиться кфильтрация обратного пути. Поэтому я попытался отключить, rp_filterустановив rp_filterзначение по умолчанию и интерфейсов на 0 и 2, но это не решило проблему. Мой дополнительный вопрос:Правильна ли моя конфигурация и как мне заставить Linux отвечать на пакеты ICMP ping в этой ситуации?

Моя ОС — Ubuntu 20.04, и ответы ICMP работают нормально на других интерфейсах, а записи iptable не настроены.

Связанный контент