Question

J'ai du mal à comprendre ce problème. J'essaie d'écrire un programme qui interagira avec le pilote de tunnel Linux. À un niveau très élémentaire, je souhaite simplement créer une application capable de transférer des données via un tunnel réseau. Cependant, je ne sais absolument pas comment configurer correctement le pilote de tunnel pour y parvenir.

Je développe sous Ubuntu 9.04 et le module du noyau du pilote de tunnel est chargé.

Il existe un périphérique / dev / net / tun , mais aucun périphérique / dev / tunX . Je ne parviens pas à créer ces périphériques avec ifconfig - chaque fois que j'exécute / sbin / ifconfig tun0 up , par exemple, le message d'erreur suivant s'affiche:

  

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

Si j'essaie de regarder le périphérique / dev / net / tun , l'erreur suivante s'affiche:

  

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

Tenter d'ouvrir / dev / tunX via un petit programme, en gros, un simple

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

renvoie -1: l'application s'exécute en tant qu'utilisateur root et ne peut toujours pas ouvrir ce périphérique tunnel. Il est possible d’ouvrir / dev / net / tun , mais cela ne semble pas générer un nouveau périphérique / dev / tunX à utiliser à la place.

En résumé, comment écrire une application qui souhaite utiliser le pilote de tunnel Linux? Toute idée serait grandement appréciée.

Merci ~ Robert

Était-ce utile?

La solution

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

Vous êtes censé ouvrir le périphérique / dev / net / tun . Un ioctl ultérieur sur le disque ouvert créera l'interface réseau tun0 (ou le nom de votre choix). Les interfaces réseau de Linux ne correspondent à aucun périphérique / dev / * .

Autres conseils

Il n'y a pas de fichier de périphérique / dev / tunX . Au lieu de cela, vous ouvrez le / dev / net / tun et le configurez via ioctl () pour "pointer". vers tun0 . Pour afficher la procédure de base, je vais créer l'interface TUN à l'aide de l'outil de ligne de commande ip tun tap , puis afficher le code C à lire à partir de ce périphérique TUN. Donc, pour créer l'interface tun via la ligne de commande:

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

Nous avons maintenant tun0 créé. Pour lire / écrire des paquets sur cette interface à partir d'un programme utilisateur, vous devez interagir avec le fichier de périphérique / dev / net / tun à l'aide de ioctl () . Voici un exemple qui lira les paquets arrivant à l’interface tun0 et imprimera 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;
}

Je suis tombé sur un bon tutoriel d'introduction à ce sujet

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

Il est livré avec une archive source.

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top