Взаимодействие с 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