2012-10-23 16 views
7

ho trovato il seguente programma tun \ rubinetto esempio e non può farlo funzionare:interfacciamento con TUN TAP per Mac OSX (Lion) utilizzando Python

http://www.secdev.org/projects/tuntap_udp/files/tunproxy.py

ho modificato le seguenti linee:

f = os.open("/dev/tun0", os.O_RDWR) 
ifs = ioctl(f, TUNSETIFF, struct.pack("16sH", "toto%d", TUNMODE)) 
ifname = ifs[:16].strip("\x00") 

La prima riga è stata modificata per riflettere la posizione reale del conducente. In origine era

f = os.open("/dev/net/tun", os.O_RDWR) 

Su esecuzione ottengo il seguente errore:

sudo ./tuntap.py -s 9000 
Password: 
Traceback (most recent call last): 
    File "./tuntap.py", line 65, in <module> 
    ifs = ioctl(f, TUNSETIFF, struct.pack("16sH", "toto%d", TUNMODE)) 
IOError: [Errno 25] Inappropriate ioctl for device 

Sto usando gli ultimi driver tap tun \ installati da http://tuntaposx.sourceforge.net/download.xhtml

risposta

6

Il driver OSX tun/tap sembra funzionare un po 'diverso. L'esempio di Linux assegna dinamicamente un'interfaccia tun, che non funziona in OSX, almeno non nello stesso modo.

Ho rimosso il codice per creare un esempio di base di come tun può essere utilizzato su OSX utilizzando un dispositivo tun selezionato automaticamente, stampando ciascun pacchetto sulla console. Ho aggiunto Scapy come una dipendenza per praticamente la stampa, ma è possibile sostituirlo con un dump di pacchetti cruda se si vuole:

import os, sys 
from select import select 
from scapy.all import IP 

f = os.open("/dev/tun12", os.O_RDWR) 
try: 
    while 1: 
     r = select([f],[],[])[0][0] 
     if r == f: 
      packet = os.read(f, 4000) 
      # print len(packet), packet 
      ip = IP(packet) 
      ip.show() 
except KeyboardInterrupt: 
    print "Stopped by user." 

si sia necessario per eseguire questo come root, o fare un sudo chown your_username /dev/tun12 di poter aprire il dispositivo.

configurarlo come interfaccia point-to-point, tipo:

$ sudo ifconfig tun12 10.12.0.2 10.12.0.1 

noti che l'interfaccia tun12 sarà disponibile solo mentre /dev/tun12 è aperto, cioè mentre il programma è in esecuzione. Se interrompi il programma, l'interfaccia tun scomparirà e sarà necessario configurarla di nuovo al prossimo avvio del programma.

Se ora ping il tuo punto finale, i pacchetti saranno stampati alla console:

$ ping 10.12.0.1 

Ping si stamperà richiesta timeout, perché non c'è nessun tunnel rispondere alle vostre richieste di ping.

+0

Per salvare il cuoio capelluto dalla eccessiva graffiare la testa: se si verifica 'SError: [Errno 2] Nessun file o directory di questo tipo: '/ dev/tun12'' quando si esegue lo script, probabilmente non è stato ancora installato il driver TUN/TAP. –

+0

Come si fa a fare tap invece di tun? –

0

quindi circa il 'Nessun file o directory' errore quando si fa:

f = os.open("/dev/tun12", os.O_RDWR)

questo ha funzionato per me:

brew install Caskroom/cask/tuntap

Problemi correlati