У меня есть сервер 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>
Я также пробовал ping
ing с этих интерфейсов, например ping -I enp1s0f0 172.16.1.100
. Захваченные пакеты показывают, что отправленные пакеты ICMP могут прибыть к месту назначения через коммутатор, как и ожидалось, однако на интерфейсе нет ответных пакетов enp1s0f1
. Я искал решение этой проблемы и нашелэтотответ, и там говорится, что это может относиться кфильтрация обратного пути. Поэтому я попытался отключить, rp_filter
установив rp_filter
значение по умолчанию и интерфейсов на 0 и 2, но это не решило проблему. Мой дополнительный вопрос:Правильна ли моя конфигурация и как мне заставить Linux отвечать на пакеты ICMP ping в этой ситуации?
Моя ОС — Ubuntu 20.04, и ответы ICMP работают нормально на других интерфейсах, а записи iptable не настроены.