Tengo una máquina con varias interfaces que puedo configurar como quiera, por ejemplo:
- eth1: 192.168.1.1
- eth2: 192.168.2.2
Me gustaría reenviar todo el tráfico enviado a una de estas direcciones locales a través de la otra interfaz. Por ejemplo, todas las solicitudes a un servidor http iperf, ftp, en 192.168.1.1 no solo deben enrutarse internamente, sino que deben enviarse a través de eth2 (y la red externa se encargará de redirigir el paquete a eth1).
Intenté y miré varios comandos, como iptables, ip route, etc ... pero nada funcionó.
El comportamiento más cercano que pude conseguir se hizo con:
ip route change to 192.168.1.1/24 dev eth2
que envían todos los 192.168.1.x en eth2, excepto 192.168.1.1 que todavía se enruta internamente. ¿Podría entonces hacer el reenvío NAT de todo el tráfico dirigido a 192.168.1.2 falso en eth1, redirigido a 192.168.1.1 internamente? En realidad estoy luchando con iptables, pero es demasiado difícil para mí.
El objetivo de esta configuración es hacer una prueba de controlador de interfaz sin usar dos PC.
Estoy usando Linux, pero si sabes cómo hacerlo con Windows, ¡lo compraré!
Editar:
La red externa es solo un cable cruzado entre eth1 y eth2. Digamos que tengo un servidor http en mi máquina. Ahora quiero acceder a este servidor desde la misma máquina, pero quiero forzar al tráfico TCP / IP a pasar por este cable eth1 / eth2. ¿Cómo debo configurar mis interfaces para esto?
fuente
Respuestas:
Extendí la respuesta de Caladona ya que no podía ver los paquetes de respuesta. Para este ejemplo:
Las rutas iptable de la PC local están configuradas para el tráfico saliente SNAT y DNAT a la IP 'falsa'.
Las reglas hacen lo siguiente:
Para resumir, el sistema local ahora puede comunicarse con una máquina 'virtual' con las direcciones 192.168.1.100 y 192.168.2.100.
Luego, debe forzar a su PC local a usar el enrutador externo para alcanzar su IP falsa. Para ello, crea una ruta directa a las IP a través del enrutador. Desea asegurarse de forzar los paquetes en el lado opuesto de la subred de destino.
Finalmente, para que todo funcione, el enrutador externo necesita saber cómo llegar a las IP falsificadas en su PC local. Puede hacer cosas delgadas activando los ARP proxy para su sistema.
Con esta configuración, ahora puede tratar las IP falsas como un sistema real en su PC local. El envío de datos a la subred .1 forzará a los paquetes a salir de la interfaz .2. El envío de datos a la subred .2 forzará a los paquetes a salir de la interfaz .1.
fuente
Utilicé con éxito lo siguiente en Linux para probar el rendimiento en una nueva tarjeta de 10 Gbps de doble puerto en modo "loopback", es decir, un puerto conectado directamente al otro. Todo esto es solo un poco de vudú solo para forzar los paquetes a salir del cable, pero si no lo hace, Linux solo cortocircuitará el tráfico a través del núcleo (de ahí la pregunta del OP). En la respuesta de Casey anterior, no estoy seguro de si era realmente necesario tener un enrutador externo o no, pero lo siguiente es completamente autónomo. Las dos interfaces son eth2 y eth3.
Proporcione IP a las interfaces y colóquelas en redes separadas:
A continuación, configuraremos un escenario NAT doble: dos redes falsas nuevas utilizadas para llegar a la otra. Al salir, obtenga NAT de su red falsa. En el camino, arregle el destino. Y viceversa para la otra red:
Ahora dígale al sistema cómo llegar a cada red falsa y rellene previamente las entradas arp (asegúrese de sustituir sus direcciones MAC, no use las mías):
Esto engaña a Linux lo suficiente como para poner paquetes en el cable. Por ejemplo:
sale eth2, la IP de origen 10.50.0.1 obtiene NATted a 10.60.0.1, y cuando entra eth3, el destino 10.60.1.1 obtiene NATted a 10.50.1.1. Y la respuesta toma un viaje similar.
Ahora use iperf para probar el rendimiento. Vincula las IP correctas y asegúrate de qué IP estás contactando (la dirección falsa del otro extremo):
Asegúrese de que el tráfico realmente esté saliendo al cable:
También puede mirar / proc / interrupciones solo para estar absolutamente seguro de que la tarjeta se está utilizando:
De todos modos, encontré esta publicación buscando cómo hacer esto, gracias por los chicos de preguntas y respuestas, y espero que esto ayude a cualquier persona a encontrar esta publicación en el futuro.
fuente
Como siempre, llego un poco tarde, pero hoy en día uno podría usar espacios de nombres de red para aislar las interfaces y evitar cualquier reenvío local (y jugar con iptables :)).
Cree espacios de nombres (todo hecho con los permisos requeridos, por ejemplo, como root):
Tenga en cuenta que ahora se debe acceder al estado / configuración de las interfaces dentro del contexto del espacio de nombres asignado, por lo que no aparecerán si ejecuta un enlace ip desnudo, ya que se ejecuta en el contexto del espacio de nombres predeterminado. La ejecución de un comando dentro de un espacio de nombres se puede hacer usando
como prefijo
Ahora asigne espacios de nombres a las interfaces, aplique la configuración y configure las interfaces:
Ahora puede ejecutar las aplicaciones dentro del espacio de nombres; para ejecutar el servidor iperf
y el cliente:
El tráfico ahora se enviará a través de las interfaces físicas, ya que todo el stack de red, la interfaz, el enrutamiento ... está aislado por los espacios de nombres, por lo que el núcleo no puede hacer coincidir las direcciones utilizadas dentro del tráfico con las interfaces locales (disponibles).
Si ha terminado con sus experimentos, simplemente elimine los espacios de nombres:
Las interfaces se reasignarán al espacio de nombres predeterminado y toda la configuración realizada dentro del espacio de nombres desaparecerá (por ejemplo, no es necesario eliminar las direcciones IP asignadas).
fuente
Ok, finalmente logré configurar mi configuración.
La idea es usar otra dirección falsa, forzar la ruta de esta dirección falsa a la interfaz 2, luego traducir la dirección falsa con la dirección real 2 con NAT / iptables.
Mi configuración en realidad está hecha de un enrutador que puedo hacer telnet entre IF1 (interfaz 1) e IF2
En mi configuración, FAKE_ADDR e IF1_ADDR están en la misma subred.
Y en el enrutador:
Si envío algo a FAKE_ADDR, pkt se reenvía a través de IF1 al enrutador, se reenvía nuevamente a IF2, luego FAKE_IP se reemplaza por IF2_ADDR. El servidor procesa el paquete, el resultado se devuelve a IF1_ADDR, desde IF2_ADDR, que se reemplaza por FAKE_ADDR.
Puede ser posible utilizar una configuración más simple con un solo cable cruzado, pero como no lo intenté, prefiero dar mi solución de trabajo.
fuente
¡La respuesta dada por Thomas Tannhäuser fue acertada!
Tuve una situación similar: una sola máquina con dos interfaces enet. Mi plan era usar una interfaz como servidor (receptor) y la otra como cliente (remitente). Cada interfaz se conectaría al enrutador e iperf conduciría el tráfico a través del enrutador para medir el rendimiento, el PPS, el retraso, etc.
Desafortunadamente, el enfoque de iptables no era intuitivo y estaba lleno de problemas. Después de unas horas frustrantes, abandoné este plan de ataque. Inspirado por la sugerencia de Thomas, hice un poco de tarea en los espacios de nombres IP de Linux y comencé a apreciar la simplicidad y elegancia de esta solución.
A continuación hay una lista de los comandos exactos que utilicé para configurar mi Fedora FC26 para servir en esta capacidad. Las dos interfaces son enp1s0 y enp3s0. El enrutador tiene dos interfaces con las direcciones 192.168.2.112 y 172.16.16.2. Cada conector FC26 ENET está conectado directamente a la interfaz del enrutador correspondiente.
fuente
Parece que desea convertir su caja de Linux en una caja de tipo enrutador / puente / puerta de enlace / firewall. Los siguientes recursos pueden ser lo que está buscando:
El proyecto de enrutador Linux
Lista de distribuciones de enrutadores o cortafuegos
Linux LiveCD Router
Linux Journal - El enrutador Linux
Actualización basada en más información:
No creo que puedas hacer lo que quieras. El sistema operativo siempre va a mirar su tabla de enrutamiento interno y 'ver' ambas direcciones IP localmente. Luego enrutará el tráfico dentro del sistema operativo y nunca lo pondrá en el cable. Necesitará una segunda máquina o dos máquinas virtuales (consulte Xen ).
fuente
Hay muchas cosas por las que pasar por aquí, así que no puedo garantizar totalmente mi precisión, pero la pregunta original parece estar buscando lo que se conoce como técnica de "envío a sí mismo" . La búsqueda vinculada muestra lo que creo que es el parche de kernel mejor mantenido como enlace principal + discusiones y parches con otros enfoques en varias listas de correo, especialmente. LKML
Creo que uno también debería mirar los espacios de nombres de red , hecho con "ip netns" de iproute2 . Esto también requiere un poco de interfaz adicional y magia de enrutamiento, por lo que podría no ser menos complejo que el enorme alboroto de iptables en las otras respuestas.
Los comentarios definitivamente son bienvenidos si alguien encuentra algo útil con estos: el cómo, el qué, el dónde acerca de su implementación.
fuente
Mira este artículo. Aquí se mencionan los pasos detallados para habilitar el acceso a Internet a un virtualbox vm usando el reenvío NAT.
http://jackal777.wordpress.com/2012/02/13/virtualbox-host-only-networking-nat-for-internet-access/
fuente
así es como lo hice funcionar para IPV6
ips estáticos asignados
configurar rutas de host solo a direcciones "FALSAS"
poblado la tabla de vecinos ... como el arp
agregó las entradas de ip6tables
fuente