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

use*_*896 7 python networking tap driver tun

我找到了以下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")
Run Code Online (Sandbox Code Playgroud)

修改了第一行以反映驱动程序的实际位置.它原来是

f = os.open("/dev/net/tun", os.O_RDWR)
Run Code Online (Sandbox Code Playgroud)

运行后,我收到以下错误:

 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
Run Code Online (Sandbox Code Playgroud)

我正在使用从http://tuntaposx.sourceforge.net/download.xhtml安装的最新tun\tap驱动程序

kon*_*rad 7

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."
Run Code Online (Sandbox Code Playgroud)

您将要么以root用户身份运行,要么sudo chown your_username /dev/tun12允许打开设备.

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

$ sudo ifconfig tun12 10.12.0.2 10.12.0.1
Run Code Online (Sandbox Code Playgroud)

请注意,该tun12接口仅在/dev/tun12打开时可用,即在程序运行时.如果中断程序,tun接口将消失,下次运行程序时需要再次配置它.

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

$ ping 10.12.0.1
Run Code Online (Sandbox Code Playgroud)

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

  • 要避免头皮刮伤,请执行以下操作:如果在运行脚本时遇到`SError:[Errno 2]没有此类文件或目录:'/ dev / tun12'`,则可能尚未安装TUN / TAP驱动程序。 (2认同)