Я нашел следующий пример программы 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.
Драйвер 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.