Enviar tráfico a uno mismo a través de la red física en Ubuntu

Enviar tráfico a uno mismo a través de la red física en Ubuntu

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.1desde 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 neighpara 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 iptableswith SNATy DNATpara 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.

información relacionada