En Linux, cómo enviar paquetes con destino local NO a través de la interfaz loopback

En Linux, cómo enviar paquetes con destino local NO a través de la interfaz loopback

Tengo un servidor Linux con dos interfaces Ethernet que están conectadas al mismo conmutador y en la misma subred. La topología es la siguiente.

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

La dirección IP de estas dos interfaces es 172.16.0.100y 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
...

Ahora quiero enviar paquetes desde enp1s0f0y enp1s0f1a través del conmutador externo (para fines de prueba, desde la vista del conmutador hay dos computadoras individuales que se comunican entre sí). Entonces vinculo la dirección local del socket a 172.16.0.100 y la conecto a 172.16.1.100 (por ejemplo, uso telnet -b 172.16.0.100 172.16.1.100 22el comando). Sin embargo, solo puedo ver que estos paquetes pasan por la lointerfaz (inspeccionando los paquetes capturados), en lugar de estas dos interfaces Ethernet y el conmutador.

Entonces mi primera pregunta es¿Cómo puedo obligar a Linux a enviar estos paquetes con destino local a través de una interfaz externa?

Creo que configuré correctamente las direcciones y la tabla de enrutamiento. La tabla de enrutamiento contiene las siguientes 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

Y la tabla ARP también parece estar configurada correctamente.

$ 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

Sin embargo, Linux todavía enruta estos paquetes a través de la lointerfaz

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

También intenté pingacceder desde estas interfaces, por ejemplo ping -I enp1s0f0 172.16.1.100. Los paquetes capturados muestran que los paquetes ICMP enviados pueden llegar al destino a través del conmutador como se esperaba, sin embargo, no se ven paquetes de respuesta en enp1s0f1la interfaz. Busqué una solución para este problema y encontréesterespuesta, y dice que esto podría estar relacionado confiltrado de ruta inversa. Así que intenté deshabilitarlo rp_filterestableciendo rp_filterel valor predeterminado y el de las interfaces en 0 y 2, pero no resolvió el problema. Mi pregunta adicional es¿Es correcta mi configuración y cómo debo hacer que Linux responda a los paquetes de ping ICMP en esta situación?

Mi sistema operativo es Ubuntu 20.04 y las respuestas ICMP funcionan bien en otras interfaces y no hay entradas de iptable configuradas.

información relacionada