
Tengo una NIC Ethernet de doble puerto y digamos que conecté ambos puertos en un bucle y asigné las siguientes IP a las 2 interfaces Ethernet:
- eth2 -> 192.168.2.1
- eth3 -> 192.168.3.1
Quiero enviar tráfico desde uno de los puertos al otro a través de la red física, por ejemplo, ping 192.168.3.1
desde 192.168.2.1
. Sin embargo, la pila TCP/IP en el kernel de Linux reconoce que estas dos direcciones son locales y en su lugar envía el tráfico al adaptador de bucle invertido, por lo que el tráfico nunca llega a la red física.
Lo más cerca que tengo de una solución es la de Anastasov.parche de envío a uno mismo, que desafortunadamente ha sido descontinuado desde el kernel 3.6, por lo que no funcionará en Ubuntu 13.10 (kernel 3.11) para mí. Intenté reescribir el parche para 3.11, pero parece que no puedo ubicarlos en la distribución de Ubuntu:
- incluir/linux/inetdevice.h
- net/ipv4/devinet.c
- net/ipv4/fib_frontend.c
- net/ipv4/ruta.c
- Documentación/redes/ip-sysctl.txt
¿Hay alguna manera de hacer que funcione el parche de envío automático o una solución alternativa?
Respuesta1
Cree un espacio de nombres de red y mueva una de las interfaces a él:
ip netns add test
ip link set eth1 netns test
Inicie un shell en el nuevo espacio de nombres:
ip netns exec test bash
Luego proceda como si tuviera dos máquinas. Cuando termine, salga del shell y elimine el espacio de nombres:
ip netns del test
Respuesta2
No lo he probado todavía, pero supongo que hay varias posibilidades de solución:
maquinas virtuales
Resuelva el problema de la pila de IP separando al menos una de las NIC de la pila de IP del host: asígnela a una máquina virtual. Sin embargo, para las pruebas de rendimiento esto puede no ser deseable. Pero si hay suficiente potencia de CPU, tal vez la capa de software adicional no se convierta en un cuello de botella (pero ¿cómo saberlo?).
diferentes direcciones de destino
Supongo que desea que el paquete se transfiera a la capa 2 solo para una prueba de rendimiento de la NIC. Por lo tanto, puede utilizar paquetes IP con una dirección IP diferente (una no local para que los paquetes se envíen por cable en cualquier caso). Y luego haces trampa: utilizas ip neigh
para crear una entrada ARP permanente que asigna esta dirección IP falsa a la dirección MAC de otras NIC.
Incluso podrías establecer conexiones IP de esa manera. Pero tendrías que usar iptables
with SNAT
y DNAT
para que ambas NIC crean que están hablando con una de las dos IP falsas necesarias.
acceso sin procesar
Si está dispuesto a realizar alguna programación no trivial, puede abrir sockets sin formato y crear las tramas Ethernet usted mismo. Esta sería probablemente la solución más rápida.