2017-10-08 4 views
2

J'essaie donc de créer un protocole de tunneling en python. J'ai la configuration de l'interface tun, routé tout le trafic à travers elle. Mais maintenant, comment puis-je obtenir les paquets qui sont redirigés vers l'interface tun dans mon programme pour les crypter et les envoyer au serveur? De ce que j'ai vu c'est soit la fonction socket.bind() ou socket.setsockopt(). Ceci est ma configuration d'interfaceLecture et traitement des paquets à partir de l'interface réseau avec python

Et ce code que je l'utilise pour l'instant:

import os, sys 
from select import select 


f = os.open("/dev/tun0", os.O_RDWR) 
os.system("ifconfig tun0 add 10.6.0.1 10.6.0.2") 
os.system("ip route add 0/1 dev tun0") 
try: 
    while 1: 
     r = select([f],[],[])[0][0] 
     if r == f: 
      packet = os.read(f, 4000) 
      print(str(len(packet)) + " : " + str(packet)) 


except KeyboardInterrupt: 
    print ("Stopped by user.") 
    os.system("ip route delete 0/1 dev tun0") 

ce lit directement depuis l'appareil. Y at-il un moyen d'utiliser la bibliothèque socket pour lire le paquet individuellement?

Merci.

OS: macOS Sierra

Répondre

0

je mettrais l'interface tun en mode promiscuous pour que je puisse écouter pour chaque paquet qui passe à travers.

Bon départ sur la façon de le faire est présenté dans ce qui suit SO message:

Python Sockets: Enabling Promiscuous Mode in Linux

Autre option serait un accès de bas niveau à une interface réseau ou votre pilote de carte réseau virtuel écrit en Python.

+0

Le mode de promiscuité n'est peut-être pas le chemin à parcourir, mon interface tun0 est mis en place un point à point, prends un autre regard à ma question j'ai ajouté des détails –

+0

Pourquoi pas? Avec une socket en mode promiscuous et s.readfrom() vous obtenez un paquet et de qui il est venu. Vous devriez avoir deux renifleurs, un attrapant TCP et un attrapant UDP, mais qu'importe. Vous pouvez même utiliser asyncore pour vous aider avec efficacité. Mais OK, vous avez choisi de bas niveau. Je suppose que vous devrez savoir lire les en-têtes de paquets manuellement, c'est-à-dire que vous aurez besoin des spécifications TCP et UDP et du protocole de périphérique supplémentaire. Utilisez ensuite le module struct pour extraire les métadonnées et le contenu. Mais d'abord je vous conseille d'aller voir comment OpenVPN fait l'affaire. – Dalen

+0

pour la structure d'utilisation thenewboston a un très bon guide dessus. Si la version de struct ne fonctionne pas, j'utiliserai le mode promisc. merci :-) –