关闭/点击界面
备注
此模块仅适用于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和更高版本将警告
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
交换 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)
内部“数据包”用于
TUNSETIFF
Linux上的请求。这是
struct ifreq
,在linux/if.h
。