关闭/点击界面

备注

此模块仅适用于BSD、Linux和MacOS。

Tun/TAP允许您从用户空间创建虚拟网络接口。有两种类型的设备:

Tun设备

在第3层运行 (IP ),并且通常限于一种协议。

分接设备

在第2层运行 (Ether ),并允许您使用任何第3层协议 (IPIPv6 、IPX等)

要求

FreeBSD

需要 if_tapif_tun 内核模块。

看见 `tap(4)`_ _和 `tun(4)`_ 有关详细信息,请参阅手册页(_M)。

Linux系统

加载 tun 内核模块:

# modprobe tun

udev 通常处理设备节点的创建。

看见 `networking/tuntap.txt`_ 有关详细信息,请参阅Linux内核文档中的_

MacOS

在MacOS 10.14及更早版本上,您需要安装 `tuntaposx`_ _。MacOS 10.14.5和更高版本将警告 tuntaposx kexts不是 `notarised`_ _,但这是可行的,因为它是在2019-04-07之前建造的。

在MacOS10.15和更高版本上,您需要使用 `notarized build`_ _共 tuntaposx`Tunnelblick`_ _(OpenVPN客户端)包含经过公证的 tuntaposx `which can be extracted`_ _.

备注

在MacOS 10.13和更高版本上,您需要 `explicitly approve loading each third-party kext for the first time`_ _.

在Scapy中使用Tun/Tap

小技巧

使用Tun/TAP通常需要运行Scapy(和这些实用程序)作为 root

TunTapInterface 使您可以轻松创建新设备:

>>> t = TunTapInterface('tun0')

然后,您需要打开接口,并在另一个终端中分配IP地址。

由于TUN是第3层连接,因此它充当点对点链路。我们将指定以下参数:

  • 本地地址(适用于您的计算机):192.0.2.1

  • 远程地址(用于Scapy):192.0.2.2

在Linux上,您将使用:

sudo ip link set tun0 up
sudo ip addr add 192.0.2.1 peer 192.0.2.2 dev tun0

在BSD和MacOS上,使用:

sudo ifconfig tun0 up
sudo ifconfig tun0 192.0.2.1 192.0.2.2

现在,当您ping这些地址时不会发生任何事情--您需要让Scapy响应该流量。

TunTapInterface 其工作方式与 SuperSocket ,所以让我们设置一个 AnsweringMachine 对…作出回应 ICMP echo-request

>>> am = t.am(ICMPEcho_am)
>>> am()

现在,您可以在另一个终端上ping Scapy:

您应该看到这些数据包显示在Scapy中:

>>> am()
Replying 192.0.2.1 to 192.0.2.2
Replying 192.0.2.1 to 192.0.2.2
Replying 192.0.2.1 to 192.0.2.2

您可能已经注意到,没有使用任何IP地址配置Scapy.这其中有个诀窍: ICMPEcho_am 交换 sourcedestination 任何字段的 EtherIP 上的标头。 ICMP 它接收的数据包。因此,它实际上响应于 any IP地址。

您可以停止 ICMPEcho_am 使用以下选项回答机器问题 ^C

当您关闭Scapy时, tun0 界面将自动消失。

TunTapInterface参考

class TunTapInterface(SimpleSocket)

充当TUN/TAP接口远程端的套接字。

__init__(iface: Text[, mode_tun][, strip_packet_info = True][, default_read_size = MTU])
参数:
  • iface (Text) -- 要使用的接口的名称,例如: tun0 。在BSD和MacOS上,这必须以任一开头 tuntap ,并具有相应的 /dev/ 节点(例如: /dev/tun0 )。在Linux上,这将被截断为16字节。

  • mode_tun (bool) -- 如果为True,则创建为Tun接口(第3层)。如果为False,则创建分路接口(第2层)。如果未提供,则尝试从 iface 参数。

  • strip_packet_info (bool) -- 如果为True(默认值),则为任何 TunPacketInfo 将从包中剥离(因此您将获得 EtherIP )。只有Linux Tun接口具有 TunPacketInfo 有空的。这对没有 TunPacketInfo 有空的。

  • default_read_size (int) -- 设置读取的默认大小 SuperSocket.raw_recv()SuperSocket.recv() 。此默认值为 scapy.data.MTUTunTapInterface 始终为以下项目增加开销 TunPacketInfo 标头(如果需要)。

class TunPacketInfo(Packet)

用于在特定于平台的标头上堆叠第3层协议的抽象类。

看见 LinuxTunPacketInfo 举个例子。

guess_payload_class(payload)

默认实现需要该字段 proto 要声明的,值来自 scapy.data.ETHER_TYPES

特定于Linux的结构

class LinuxTunPacketInfo(TunPacketInfo)

用于Linux Tun数据包的数据包报头。

这是 struct tun_pi ,在 linux/if_tun.h

flags

要在数据包上设置的标志。仅限 TUN_VNET_HDR 是受支持的。

proto

第3层协议号,每 scapy.data.ETHER_TYPES

使用方 TunTapPacketInfo.guess_payload_class()

class LinuxTunIfReq(Packet)

内部“数据包”用于 TUNSETIFF Linux上的请求。

这是 struct ifreq ,在 linux/if.h