使用Python与MAC OSX(Lion)的TUN\TAP接口

使用Python与MAC OSX(Lion)的TUN\TAP接口,python,networking,driver,tap,tun,Python,Networking,Driver,Tap,Tun,我发现以下tun\tap示例程序无法运行: 我修改了以下行: 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 ./

我发现以下tun\tap示例程序无法运行:

我修改了以下行:

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
sudo./tuntap.py-s 9000
密码:
回溯(最近一次呼叫最后一次):
文件“/tuntap.py”,第65行,在
ifs=ioctl(f,TUNSETIFF,结构包(“16sH”,“toto%d”,TUNMODE))
IOError:[Errno 25]设备的ioctl不正确

我正在使用从安装的最新tun\tap驱动程序OSX tun/tap驱动程序的工作方式似乎有点不同。Linux示例动态分配一个tun接口,该接口在OSX中不起作用,至少以不同的方式不起作用

我剥离了代码,创建了一个基本示例,说明如何使用自选的tun设备在OSX上使用tun,并将每个数据包打印到控制台。我添加了pretty printing的依赖项,但如果需要,可以用原始数据包转储替换它:

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用户身份运行此程序,或者使用您的用户名/dev/tun12执行
sudo命令才能打开设备

要将其配置为点对点接口,请键入:

$ sudo ifconfig tun12 10.12.0.2 10.12.0.1
请注意,
tun12
界面仅在
/dev/tun12
打开时可用,即程序正在运行时。如果中断程序,tun接口将消失,下次运行程序时需要重新配置

如果您现在ping端点,您的数据包将打印到控制台:

$ ping 10.12.0.1

Ping本身将打印请求超时,因为没有隧道端点响应您的Ping请求。

因此在执行以下操作时出现“无此类文件或目录”错误:

f=os.open(“/dev/tun12”,os.O\u RDWR)

这对我很有用:


brew install Caskroom/cask/tuntap

避免头皮过度抓伤:如果您遇到
SError:[Errno 2]没有这样的文件或目录:'/dev/tun12'
在运行脚本时,您可能还没有安装TUN/TAP驱动程序。如何为TAP而不是TUN安装此驱动程序?