Saltar al contenido

Cómo interactuar con el controlador tun de Linux

Hola usuario de nuestra página web, descubrimos la respuesta a tu interrogante, has scroll y la encontrarás un poco más abajo.

Solución:

No existen /dev/tunX archivos del dispositivo. En su lugar, abre el /dev/net/tun y configurarlo a través de ioctl() apuntar a tun0. Para mostrar el procedimiento básico, crearé la interfaz TUN usando la herramienta de línea de comandos ip tun tap y luego mostrar el código C para leer desde ese dispositivo TUN. Entonces, para crear la interfaz tun a través de la línea de comandos:

sudo ip tuntap add mode tun dev tun0
ip addr add 10.0.0.0/24 dev tun0  # give it an ip
ip link set dev tun0 up  # bring the if up
ip route get 10.0.0.2  # check that packets to 10.0.0.x are going through tun0
ping 10.0.0.2  # leave this running in another shell to be able to see the effect of the next example

Ahora tenemos tun0 creado. Para leer/escribir paquetes en esta interfaz desde un programa de espacio de usuario, debe interactuar con el /dev/net/tun archivo de dispositivo usando ioctl(). Aquí hay un ejemplo que leerá los paquetes que llegan al tun0 interfaz e imprimir el tamaño:

#include   /* O_RDWR */
#include  /* memset(), memcpy() */
#include  /* perror(), printf(), fprintf() */
#include  /* exit(), malloc(), free() */
#include  /* ioctl() */

/* includes for struct ifreq, etc */
#include 
#include 
#include 
#include 

int tun_open(char *devname)

  struct ifreq ifr;
  int fd, err;

  if ( (fd = open("/dev/net/tun", O_RDWR)) == -1 ) 
       perror("open /dev/net/tun");exit(1);
  
  memset(&ifr, 0, sizeof(ifr));
  ifr.ifr_flags = IFF_TUN;
  strncpy(ifr.ifr_name, devname, IFNAMSIZ); // devname = "tun0" or "tun1", etc 

  /* ioctl will use ifr.if_name as the name of TUN 
   * interface to open: "tun0", etc. */
  if ( (err = ioctl(fd, TUNSETIFF, (void *) &ifr)) == -1 ) 
    perror("ioctl TUNSETIFF");close(fd);exit(1);
  

  /* After the ioctl call the fd is "connected" to tun device specified
   * by devname ("tun0", "tun1", etc)*/

  return fd;



int main(int argc, char *argv[])

  int fd, nbytes;
  char buf[1600];

  fd = tun_open("tun0"); /* devname = ifr.if_name = "tun0" */
  printf("Device tun0 openedn");
  while(1) 
    nbytes = read(fd, buf, sizeof(buf));
    printf("Read %d bytes from tun0n", nbytes);
  
  return 0;

Leer /usr/src/linux/Documentation/networking/tuntap.rst.

Se supone que tu tienes que open la /dev/net/tun dispositivo. una posterior ioctl en el fd abierto creará el tun0 (o como quieras llamarlo) interfaz de red. Las interfaces de red de Linux no corresponden a ninguna /dev/* dispositivo.

Encontré un buen tutorial de introducción sobre esto.

http://backreference.org/2010/03/26/tuntap-interface-tutorial/

Viene con un tarball fuente.

Estaba en el mismo conjunto de resultados de Google que esta pregunta. 🙂

Aquí tienes las reseñas y calificaciones

Nos puedes añadir valor a nuestra información añadiendo tu experiencia en las observaciones.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *