Comment se connecter avec le pilote Linux tun

j'ai du mal à résoudre ce problème - j'essaie d'écrire un programme qui interagira avec le pilote du tunnel Linux. À un niveau très basique, je veux simplement créer une application capable de transférer des données sur un tunnel réseau. Toutefois, Je ne sais absolument pas comment installer correctement le conducteur du tunnel pour y parvenir.

je me développe sur Ubuntu 9.04, et j'ai chargé le module du pilote tunnel du noyau.

Il n' existe le dispositif /dev/net/tun, cependant il n'y a pas /dev/tunX appareils. Je ne peux pas créer ces périphériques en utilisant ifconfig - à chaque fois que je run /sbin/ifconfig tun0 up par exemple, j'obtiens l'erreur suivante:

tun0: erreur lors de l'obtention des indicateurs d'interface: Pas de périphérique de ce type.

Si j'essaye de regarder les /dev/net/tun périphérique, le message d'erreur suivant est présenté:

cat: / dev / net/ tun: descripteur de fichier en mauvais état.

tentative D'ouverture /dev/tunX via un petit programme, fondamentalement, un simple

tun_fd = open( "/dev/tun0", O_RDWR )

renvoie -1: l'application tourne comme root et ne peut toujours pas ouvrir ce périphérique tunnel. Il est possible d'ouvrir /dev/net/tun, cependant cela ne semble pas générer un nouveau /dev/tunX périphérique à utiliser à la place.

donc, en résumé-comment rédiger une application qui souhaite utiliser le pilote du tunnel Linux? Toute perspicacité serait grandement apprécier.

Merci; ~Robert

14
demandé sur reflective_mind 2009-06-17 00:07:50

3 réponses

Lire /usr/src/linux/Documentation/networking/tuntap.txt.

Vous êtes censés open/dev/net/tun périphérique. Un ultérieur ioctl sur le FD ouvert va créer le tun0 (ou peu importe le nom que vous voulez lui donner) interface réseau. Les interfaces réseau de Linux ne correspondent à aucun /dev/* périphérique.

14
répondu ephemient 2009-06-16 20:30:34

Il n'y a pas /dev/tunX les fichiers de périphériques. Au lieu de cela, vous ouvrez le /dev/net/tun et le configurer via ioctl() le "point"tun0. Pour afficher la procédure de base, je vais créer l'interface TUN en utilisant l'outil ligne de commande ip tun tap et ensuite montrer le code C à lire à partir de ce périphérique TUN. Ainsi, pour créer l'interface tun via la ligne de commandes:

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

Maintenant, nous avons tun0 créé. Pour lire / écrire des paquets à cette interface à partir d'un programme d'espace utilisateur, vous devez interagir avec le /dev/net/tun fichier de périphérique utilisant ioctl(). Voici un exemple qui lira les paquets arrivant au tun0 interface et imprimer la taille:

#include <fcntl.h>  /* O_RDWR */
#include <string.h> /* memset(), memcpy() */
#include <stdio.h> /* perror(), printf(), fprintf() */
#include <stdlib.h> /* exit(), malloc(), free() */
#include <sys/ioctl.h> /* ioctl() */

/* includes for struct ifreq, etc */
#include <sys/types.h>
#include <sys/socket.h>
#include <linux/if.h>
#include <linux/if_tun.h>

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 opened\n");
  while(1) {
    nbytes = read(fd, buf, sizeof(buf));
    printf("Read %d bytes from tun0\n", nbytes);
  }
  return 0;
}
10
répondu ecerulm 2018-01-29 01:16:17

je suis tombé sur une belle intro didacticiel sur ce sujet

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

Il est livré avec une archive source.

il était dans le même ensemble de résultats Google que cette question. : -)

2
répondu Duke Robillard 2012-05-30 04:42:19