¿Cómo utilizar el túnel TUN / TAP desde el programa de usuario?

9

Recientemente descubrí la existencia de interfaces Linux TUN / TAP y todavía estoy tratando de entenderlas. Creo que entiendo el concepto básico: se crean pseudodispositivos que emulan una interfaz de red y, en lugar de pasar datos al hardware, se pasan a un programa de espacio de usuario.

¿Cómo dirigirías un programa no relacionado para utilizar este túnel?

Por ejemplo, antes de que se cree el túnel, mi sistema solo contiene eth0 y lo, la interfaz ethernet normal (conectada a mi red local) y la interfaz loopback. Después de que un programa crea y configura un túnel, tengo una nueva interfaz gr0 a la que le di una dirección IP que está en mi red local, pero no está en uso (por lo que todos estamos en la misma subred). ¿Cómo haría que un programa no relacionado utilizara este 'túnel'? Digamos que tengo un mensaje simple de Python que pasa la aplicación cliente / servidor que utiliza una conexión TCP, ¿cómo podría configurarlo para usar el túnel?

Pido disculpas si me falta algo básico, pero como siempre he logrado confundirme en el esquema de las cosas. Nuevamente, todo lo que quiero es que un simple programa TCP utilice este túnel.

¡Gracias!

Sr. Shickadance
fuente

Respuestas:

7

No siempre es "túnel". TUN / TAP es solo controladores NIC específicos. Desde el punto de vista de la pila de red, actúan como cualquier otra interfaz de red: pueden tener direcciones IP, pueden ser interfaces punto a punto o de difusión. Las reglas de enrutamiento también se aplican a ellos. Pero todo el tráfico que se escribe en una de esas interfaces de red va a algún programa de espacio de usuario para su procesamiento, y todos los datos escritos por el programa de espacio de usuario directamente /dev/tunXparecen paquetes entrantes para la pila de red.

En la configuración de túnel habitual, el servidor y el cliente tienen dispositivos TUN con direcciones asignadas. Las tablas de enrutamiento configuradas en ambos dirigen el tráfico necesario a estos dispositivos TUN. Cuando el paquete se enruta a tun0, el núcleo lo envía al programa de espacio de usuario (cliente) que envía este paquete a otro programa en la máquina remota (servidor) a través de, por ejemplo, una conexión TCP. En la máquina remota, otro programa (servidor) recibe el paquete del cliente y lo escribe en su propio /dev/tunXdispositivo, "inyectando" ese paquete en la pila de la red. Y el paquete tunelizado se procesa como cualquier otro.

gelraen
fuente
1
Entonces, la respuesta (para mis propósitos) es configurar la tabla de enrutamiento para dirigir el tráfico a estas interfaces. Ese era el punto que me faltaba, pero ahora debería poder encontrar una solución. Además, agradezco la explicación, ya que aclara las cosas. ¡Gracias!
Sr. Shickadance
2
Terminé usando "route add <TUN IP ADDR> dev gr0". Esto me permitió redirigir el tráfico a través de la nueva interfaz. ¡Gracias de nuevo!
Sr. Shickadance el