Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 30/12/2012, à 20:09

lemonstrike

Lire/écrire dans une interface TUN

Bonjour à tous,

J'ai écrit un programme en C qui crée une interface TUN (en mode non persistant) en suivant les exemples de codes qu'on peut trouver à droite à gauche sur le net.
J'arrive a créer et configurer l'interface (elle apparaît sous le doux nom de tun0 dans un ifconfig) mais je ne sais pas comment l'exploiter à partir d'un autre programme, c'est à dire écrire ou lire dedans.

edit: les seules opérations que j'arrive à faire c'est ping et sniffer tun0.

Est-ce que vous sauriez comment je dois m'y prendre ?
Cordialement.

Dernière modification par lemonstrike (Le 30/12/2012, à 20:11)

Hors ligne

#2 Le 30/12/2012, à 21:19

Maisondouf

Re : Lire/écrire dans une interface TUN

Déjà, tu peux écrire dans le device avec toutes les commandes standard, sous linux tout est fichier.

(sudo) echo "bonjour le nouvel interface" >/dev/tun0

pour recevoir:

(sudo) cat /dev/tun0 >fichier-de-reception

On break la réception avec <ctrl>-C

Ces commandes de bases permettent des test entrée/sortie mais ne sont pas fiables pour une utilisation finale.


ASUS M5A88-v EVO avec AMD FX(tm)-8120 Eight-Core Processor,  OS principal Precise 12.04.1 LTS 63bits½
Bricoleur, menteur, inculte, inadapté social et mythomane, enfin d'après certains....
"the secret of my form is summed up in two words, no sport" (Winston Churchill)

Hors ligne

#3 Le 30/12/2012, à 21:25

lemonstrike

Re : Lire/écrire dans une interface TUN

Bonsoir, merci pour ta réponse !

Je ne vois pas tun0 dans le /dev/ malgré qu'il est dans le ifconfig.
Je galère un peu je sais pas ce que j'ai manqué ...

Hors ligne

#4 Le 30/12/2012, à 22:27

Hibou57

Re : Lire/écrire dans une interface TUN

Tu le trouvera peut‑être dans /dev/net/, dans lequel je trouve un /dev/net/tun (mais il n’est pas listé par ifconfig).

ifconfig me liste eth0 et lo.

eth0 n’est nul‑part sous /dev/, mais /var/lib/dhcp/ contient des fichiers dont le nom contient eth0, et dont le contenu texte fait référence à eth0. Je n’ai pas de lo sous /dev/ mais j’ai plusieurs loopN, de /dev/loop0 à /dev/loop7 et un /dev/loop-control, qui ne sont pas sous /dev/net/, comme l’est /dev/net/tun. Je rapporte ces cas pour souligner que la correspondance n’est pas si directe qu’elle l’a été dans le passé, avec les anciennes arborescences.

Dernière modification par Hibou57 (Le 30/12/2012, à 22:29)


Hajimemashteeeee… \(^o^)/ Tachikoma desu (^_^;)
Le saviez‑vous : le j’m’en foutisme est la cause de la plupart des fléaux du monde contemporain.
Mangez des standards : un grand bol de Standard tous les matins, et vous débutez la journée en pleine forme !
bulleforum.net — Forum de discussions, La Bulle (papotage de la vie courante ou choses trop sérieuses)

Hors ligne

#5 Le 30/12/2012, à 22:32

lemonstrike

Re : Lire/écrire dans une interface TUN

Bonsoir,

j'ai un "tun" dans /dev/net mais si j'essaie de faire un echo "test" > tun il me dit :

bash: echo: erreur d'écriture : Le descripteur du fichier est dans un mauvais état

C'est pour ça que je me suis mis à la recherche de tun0 (qui elle est listée dans un ifconfig) tongue

Hors ligne

#6 Le 30/12/2012, à 22:37

Hibou57

Re : Lire/écrire dans une interface TUN

D’après les cas que je t’ai donné, on peut supposer qu’il n’apparait pas sous ce nom.

tun0 est peut‑être un alias qui n’apparait qu’au niveau utilisateur. Je vais essayer de trouver quelque chose, mais ça risque de me prendre du temps, alors je ne promet rien (à plus tard, ou un des jours prochains).


Hajimemashteeeee… \(^o^)/ Tachikoma desu (^_^;)
Le saviez‑vous : le j’m’en foutisme est la cause de la plupart des fléaux du monde contemporain.
Mangez des standards : un grand bol de Standard tous les matins, et vous débutez la journée en pleine forme !
bulleforum.net — Forum de discussions, La Bulle (papotage de la vie courante ou choses trop sérieuses)

Hors ligne

#7 Le 31/12/2012, à 12:34

lemonstrike

Re : Lire/écrire dans une interface TUN

Ok merci à toi.

Personne d'autre n'a la solution ultimequimarcheviteetquivabien ?

Hors ligne

#8 Le 31/12/2012, à 12:45

grim7reaper

Re : Lire/écrire dans une interface TUN

Salut,
Et il y aurait moyen que tu postes ton code ici ? Ça pourrait sûrement aider.
Si c’est vraiment trop long, poste au moins un exemple minimal et complet (comprendre compilable et exécutable) de la partie création.

Hors ligne

#9 Le 31/12/2012, à 14:13

lemonstrike

Re : Lire/écrire dans une interface TUN

Salut, ci dessous le code de l'allocation de l'interface TUN :

int tun_alloc(char *dev, int flags)
{
	struct ifreq ifr;
	int fd, err;
	
	if( (fd = open("/dev/net/tun", O_RDWR)) < 0 )
		ERR("open");

	memset(&ifr, 0, sizeof(ifr));
	ifr.ifr_flags = flags; 
	
	if(*dev)
		strncpy(ifr.ifr_name, dev, IFNAMSIZ);
	
	if((err = ioctl(fd, TUNSETIFF, (void *) &ifr)) < 0)
	{
		close(fd);
		return err;
	}
	
	strcpy(dev, ifr.ifr_name);
	return fd;
} 

et le ifconfig me donne :

[...]

tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
          inet adr:192.168.1.5  P-t-P:192.168.1.5  Masque:255.255.255.0
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          Packets reçus:0 erreurs:0 :0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 lg file transmission:500 
          Octets reçus:0 (0.0 B) Octets transmis:0 (0.0 B)

[...]

Au niveau de l'uilisation, je lis (read) et écris (write)  sur l'interface avec le descripteur retourné bien que je ne comprenne pas vraiment ce que fait mon tun_alloc. C'est un code récupéré sur internet et la doc sur l'utilisation des interfaces tun est très faible.

Dernière modification par lemonstrike (Le 31/12/2012, à 14:14)

Hors ligne

#10 Le 31/12/2012, à 14:23

grim7reaper

Re : Lire/écrire dans une interface TUN

Le code vient de , non ?
Bon, je vais essayer de jeter un œil.

Hors ligne

#11 Le 31/12/2012, à 14:25

lemonstrike

Re : Lire/écrire dans une interface TUN

Oui, entre autre smile
En fait la plupart des sites qui présentent l'allocation d'une interface TUN utilisent ce code.

edit: j'ai oublié de préciser que pour la configurer j'utilise la commande

ifconfig tun0 192.168.1.5 netmask 255.255.255.0

Dernière modification par lemonstrike (Le 31/12/2012, à 14:28)

Hors ligne

#12 Le 31/12/2012, à 14:46

grim7reaper

Re : Lire/écrire dans une interface TUN

lemonstrike a écrit :

J'ai écrit un programme en C qui crée une interface TUN (en mode non persistant)

Le problème ne viendrai pas de là ?

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

The interface can be transient, meaning that it's created, used and destroyed by the same program; when the program terminates, even if it doesn't explicitly destroy the interface, the interfaces ceases to exist.

Faudrait pas la créer en mode persistant des fois ?
Du genre un coup de :

ioctl(tun_fd, TUNSETPERSIST, 1)

Hors ligne

#13 Le 31/12/2012, à 15:29

grim7reaper

Re : Lire/écrire dans une interface TUN

C’est bien ça.
Si pas de persistance, ton device virtuel disparaît automatiquement à la fin de ton programme.
Si tu le rend persistant, un dossier va être créé dans /sys/devices/virtual/net.

Cela dit, pour utiliser ton interface dans un autre programme, une fois que tu l’as créé en mode persistant, il suffit de repasser par tun_alloc pour récupérer le descripteur.
Du moins si j’en crois le bout de code tunclient.c du lien précédent.
Avec son exemple d’utilisation :

# openvpn --mktun --dev tun77 --user waldner
Fri Mar 26 10:48:12 2010 TUN/TAP device tun77 opened
Fri Mar 26 10:48:12 2010 Persist state set to: ON
# ip link set tun77 up
# ip addr add 10.0.0.1/24 dev tun77
# ping 10.0.0.2
...

# on another console
$ ./tunclient
Read 84 bytes from device tun77
Read 84 bytes from device tun77

Donc on voit bien que le programme qui lit est différent de celui qui fait la création.

Dernière modification par grim7reaper (Le 31/12/2012, à 15:37)

Hors ligne

#14 Le 31/12/2012, à 15:46

Hibou57

Re : Lire/écrire dans une interface TUN

grim7reaper a écrit :

un dossier va être créé dans /sys/devices/virtual/net.

Eh bien, c’est là qu’il est ce coquin de lo.

Dernière modification par Hibou57 (Le 31/12/2012, à 15:47)


Hajimemashteeeee… \(^o^)/ Tachikoma desu (^_^;)
Le saviez‑vous : le j’m’en foutisme est la cause de la plupart des fléaux du monde contemporain.
Mangez des standards : un grand bol de Standard tous les matins, et vous débutez la journée en pleine forme !
bulleforum.net — Forum de discussions, La Bulle (papotage de la vie courante ou choses trop sérieuses)

Hors ligne

#15 Le 31/12/2012, à 23:01

grim7reaper

Re : Lire/écrire dans une interface TUN

Et pour info’, toutes les interfaces (eth0, wlan0, lo, tun, …) sont dans /sys/class/net

Hors ligne

#16 Le 01/01/2013, à 21:54

lemonstrike

Re : Lire/écrire dans une interface TUN

Merci pour vos réponses !

Malheureusement je n'arrive toujours pas à y accéder. Ci dessous, le code de l'allocation (en mode persistant) :

int tun_alloc(char *dev, int flags)
{
	struct ifreq ifr;
	int fd, err;
	
	if( (fd = open("/dev/net/tun", O_RDWR)) < 0 )
		ERR("open");

	memset(&ifr, 0, sizeof(ifr));

	ifr.ifr_flags = flags; 
	
	if(*dev)
		strncpy(ifr.ifr_name, dev, IFNAMSIZ);
	
	if((err = ioctl(fd, TUNSETIFF, (void *) &ifr)) < 0)
	{
		close(fd);
		return err;
	}
	
	if(ioctl(fd, TUNSETPERSIST, 1) < 0)
		ERR("ioctl");
	
	strcpy(dev, ifr.ifr_name);
	
	return fd;
} 

Pas de problème au moment de la création, mais quand j'essaie d'y accéder (en utilisant le programme ci-dessous) j'ai un "write: Bad file descriptor" :

int main (int argc, char *argv[])
{
	int fd;
	char buff[100];
	(void)argc;
	
	fd = tun_alloc(argv[1], IFF_TUN | IFF_NO_PI);
		
	while(1)
	{
		scanf("%s", buff);
		
		if(write(fd, buff, strlen(buff)) < 0)
		{
			perror("write");
			exit(EXIT_FAILURE);
		}
	}
	
	return 0;
}
$ sudo ./clientTUN tun0
Message test
write: Bad file descriptor

Je ne vois pas ce qui va pas ...

Hors ligne

#17 Le 01/01/2013, à 23:01

grim7reaper

Re : Lire/écrire dans une interface TUN

Chez moi ça fonctionne (du moins ça semble : il n’y a pas d’erreur, j’ai pas poussé plus loin), si je vire IFF_NO_PI.
Tu es sûr que c’est correct d’utiliser IFF_NO_PI, et d’envoyer des messages genre « Message test ».
À priori, je dirait non :

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

Additionally, another flag IFF_NO_PI can be ORed with the base value. IFF_NO_PI tells the kernel to not provide packet information. The purpose of IFF_NO_PI is to tell the kernel that packets will be "pure" IP packets, with no added bytes. Otherwise (if IFF_NO_PI is unset), 4 extra bytes are added to the beginning of the packet (2 flag bytes and 2 protocol bytes).

Cela dit, moi j’avais une erreur EINVAL, pas EBADF.

Hors ligne