Взаимодействие с TUN\TAP для MAC OSX (Lion) с использованием Python

Я нашел следующий пример программы tun\tap и не могу заставить его работать:

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

Я изменил следующие строки:

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

Первая строка была изменена, чтобы отразить реальное местоположение водителя. Было изначально

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

При запуске я получаю следующую ошибку:

 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

Я использую последние драйверы tun\tap, установленные с http://tuntaposx.sourceforge.net/download.xhtml

2 ответа

Драйвер OSX Tun / Tap работает немного по-другому. Пример Linux динамически распределяет интерфейс tun, который не работает в OSX, по крайней мере, не так.

Я удалил код, чтобы создать базовый пример того, как tun можно использовать в OSX, используя самостоятельно выбранное устройство tun, печатая каждый пакет на консоль. Я добавил Scapy в качестве зависимости для красивой печати, но вы можете заменить его необработанным дампом пакетов, если хотите:

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."

Вам придется либо запустить это как root, либо сделать sudo chown your_username /dev/tun12 быть разрешено открыть устройство.

Чтобы настроить его как интерфейс точка-точка, введите:

$ sudo ifconfig tun12 10.12.0.2 10.12.0.1

Обратите внимание, что tun12 интерфейс будет доступен только пока /dev/tun12 открыт, т. е. во время работы программы. Если вы прервете программу, ваш интерфейс Tun исчезнет, ​​и вам нужно будет настроить его снова при следующем запуске программы.

Если вы сейчас пропингуете свою конечную точку, ваши пакеты будут напечатаны на консоли:

$ ping 10.12.0.1

Сам Ping напечатает тайм-ауты запроса, потому что нет конечной точки туннеля, отвечающей на ваши запросы ping.

Так что об ошибке "Нет такого файла или каталога" при выполнении:

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

это сработало для меня:

brew install Caskroom/cask/tuntap

Другие вопросы по тегам