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.100
y 172.16.1.100
respectivamente.
$ 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 enp1s0f0
y enp1s0f1
a 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 22
el comando). Sin embargo, solo puedo ver que estos paquetes pasan por la lo
interfaz (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 lo
interfaz
$ 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é ping
acceder 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 enp1s0f1
la 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_filter
estableciendo rp_filter
el 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.