Me está costando resolver este problema, estoy intentando escribir un programa que interactúe con el controlador de túnel de Linux. En un nivel muy básico, simplemente quiero crear una aplicación que pueda transferir datos a través de un túnel de red. Sin embargo, estoy completamente perdido en cómo configurar correctamente el controlador del túnel para lograr esto.Cómo hacer interfaz con el controlador tun de Linux
Estoy desarrollando en Ubuntu 9.04, y tengo el módulo del kernel del controlador del túnel cargado.
Existe el dispositivo /dev/net/tun
, sin embargo, no hay dispositivos /dev/tunX
. Soy incapaz de crear estos dispositivos usando ifconfig
- cada vez que corro /sbin/ifconfig tun0 up
, por ejemplo, me sale el siguiente error:
tun0: ERROR while getting interface flags: No such device.
Si intento mirar el dispositivo /dev/net/tun
, se presenta el siguiente error:
cat: /dev/net/tun: File descriptor in bad state.
al intentar abrir /dev/tunX
a través de un pequeño programa, básicamente, un simple
tun_fd = open("/dev/tun0", O_RDWR)
retu rns -1: la aplicación se está ejecutando como raíz y todavía no puede abrir este dispositivo de túnel. Es posible abrir /dev/net/tun
, sin embargo, esto no parece generar un nuevo dispositivo /dev/tunX
para usar en su lugar.
Así que, en resumen, ¿cómo se hace para escribir una aplicación que desea utilizar el controlador de túnel de Linux? Cualquier idea sería muy apreciada.
Gracias; ~ Robert
@rmrobins; ¿Qué hiciste para que realmente funcionara? Creo que tengo un problema muy similar a tu pregunta original. Tengo el dispositivo/dev/net/tun visible, pero al abrir esto no aparece una interfaz de red. He estado tratando de usar los ejemplos br_select.c y br_sigio.c. – simon
Como se mencionó anteriormente, abra/dev/net/tun. Luego, se usará un ioctl para crear la interfaz real. El ioctl se llama TUNSETIFF, y el argumento es de tipo struct ifreq. Los indicadores de la estructura ifreq deben establecerse en IFF_TUN. Una vez que el ioctl ha regresado, el campo ifr_name de la estructura ifreq se establecerá con el nombre de la interfaz abierta. ¡Espero que esto ayude! – rmrobins