关闭/点击界面
备注
此模块仅适用于BSD、Linux和MacOS。
Tun/TAP允许您从用户空间创建虚拟网络接口。有两种类型的设备:
- Tun设备
- 在第3层运行 ( - IP),并且通常限于一种协议。
- 分接设备
- 在第2层运行 ( - Ether),并允许您使用任何第3层协议 (- IP,- IPv6、IPX等)
要求
- FreeBSD
- 需要 - if_tap和- if_tun内核模块。
- Linux系统
- 加载 - tun内核模块:- # modprobe tun - udev通常处理设备节点的创建。- 看见 `networking/tuntap.txt`_ 有关详细信息,请参阅Linux内核文档中的_。 
- MacOS
- 在MacOS 10.14及更早版本上,您需要安装 `tuntaposx`_ _。MacOS 10.14.5和更高版本将警告 - tuntaposxkexts不是 `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 交换 source 和 destination 任何字段的 Ether 和 IP 上的标头。 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上,这必须以任一开头- tun或- tap,并具有相应的- /dev/节点(例如:- /dev/tun0)。在Linux上,这将被截断为16字节。
- mode_tun (bool) -- 如果为True,则创建为Tun接口(第3层)。如果为False,则创建分路接口(第2层)。如果未提供,则尝试从 - iface参数。
- strip_packet_info (bool) -- 如果为True(默认值),则为任何 - TunPacketInfo将从包中剥离(因此您将获得- Ether或- IP)。只有Linux Tun接口具有- TunPacketInfo有空的。这对没有- TunPacketInfo有空的。
- default_read_size (int) -- 设置读取的默认大小 - SuperSocket.raw_recv()和- SuperSocket.recv()。此默认值为- scapy.data.MTU。- TunTapInterface始终为以下项目增加开销- 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)
- 内部“数据包”用于 - TUNSETIFFLinux上的请求。- 这是 - struct ifreq,在- linux/if.h。