No Linux, como enviar pacotes com destino local NÃO através da interface de loopback

No Linux, como enviar pacotes com destino local NÃO através da interface de loopback

Eu tenho um servidor Linux com duas interfaces Ethernet conectadas ao mesmo switch e na mesma sub-rede. A topologia é a seguinte

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

O endereço IP dessas duas interfaces é 172.16.0.100e 172.16.1.100respectivamente.

$ 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
...

Agora quero enviar pacotes de enp1s0f0para enp1s0f1através do switch externo (para fins de teste, do ponto de vista do switch, há dois computadores individuais se comunicando). Portanto, vinculo o endereço local do soquete a 172.16.0.100 e o conecto a 172.16.1.100 (por exemplo, use telnet -b 172.16.0.100 172.16.1.100 22o comando). No entanto, só consigo ver esses pacotes passando pela lointerface (inspecionando os pacotes capturados), em vez dessas duas interfaces Ethernet e do switch.

Então minha primeira pergunta écomo posso forçar o Linux a enviar esses pacotes com destino local através de interface externa?

Acho que defini os endereços e a tabela de roteamento corretamente. A tabela de roteamento contém as seguintes entradas

$ 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

E a tabela ARP também parece estar configurada corretamente

$ 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

No entanto, o Linux ainda roteia esses pacotes através da lointerface

$ 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>

Eu também tentei pingusar essas interfaces, por exemplo ping -I enp1s0f0 172.16.1.100. Os pacotes capturados mostram que os pacotes ICMP enviados podem chegar ao destino através do switch conforme esperado, porém não há pacotes de resposta vistos na enp1s0f1interface. Procurei uma solução para esse problema e encontreiesseresposta, e diz que isso pode estar relacionado afiltragem de caminho reverso. Então tentei desabilitar rp_filterdefinindo rp_filtero valor padrão e das interfaces como 0 e 2, mas isso não resolveu o problema. Minha pergunta adicional éminha configuração está correta e como devo fazer o Linux responder aos pacotes de ping ICMP nesta situação?

Meu sistema operacional é Ubuntu 20.04 e as respostas ICMP funcionam bem em outras interfaces e não há entradas iptable configuradas.

informação relacionada