Scapy网络协议栈解析:独立于操作系统的网络工具

Scapy网络协议栈解析:独立于操作系统的网络工具

scapy Scapy: the Python-based interactive packet manipulation program & library. Supports Python 2 & Python 3. scapy 项目地址: https://gitcode.com/gh_mirrors/sc/scapy

Scapy网络协议栈概述

Scapy作为一款强大的网络数据包处理工具,其最显著的特点就是维护了一套完全独立于操作系统本身的网络协议栈。这套协议栈包含了:

  • 网络接口列表
  • 路由表
  • ARP缓存
  • IPv6邻居缓存
  • DNS服务器配置等

这种设计使得Scapy能够在不干扰系统网络配置的情况下,灵活地进行各种网络操作。例如:

  1. 使用sr()send()发送数据包时,Scapy会查询自己的路由表(conf.route)决定使用哪个网络接口,必要时还会发送ARP请求
  2. 使用dns_resolve()进行域名解析时,Scapy会使用自己配置的DNS服务器列表(conf.nameservers)

重要提示:Scapy在初始化时会从操作系统中获取这些网络配置信息,但它会将这些信息保存在自己的数据结构中。Scapy已经为Linux/Windows/BSD等主流操作系统实现了获取这些信息的接口。

网络接口管理

Scapy将所有网络接口信息存储在conf.ifaces对象中,提供了多种便捷的访问方式:

>>> conf.ifaces
Source  Index  Name  MAC                IPv4          IPv6
sys     1      lo    00:00:00:00:00:00  127.0.0.1     ::1
sys     2      eth0  Microsof:12:cb:ef  10.0.0.5  fe80::10a:2bef:dc12:afae

常用接口操作函数

  1. 通过索引获取接口
>>> conf.ifaces.dev_from_index(2)
<NetworkInterface eth0 [UP+BROADCAST+RUNNING+SLAVE]>
  1. 获取所有接口名称(传统方式):
>>> get_if_list()
['lo', 'eth0']

Extcap接口支持

Scapy还支持Wireshark的extcap接口,可以通过load_extcap()函数加载:

>>> load_extcap()
>>> conf.ifaces

加载后,你可以像使用普通接口一样使用这些特殊接口进行数据包捕获。例如使用sshdump接口:

>>> sniff(
...     iface="sshdump",
...     prn=lambda x: x.summary(),
...     remote_host="192.168.0.1",
...     remote_username="root",
...     remote_password="SCAPY",
... )

要查看某个extcap接口的可用选项,可以使用:

>>> conf.ifaces.dev_from_networkname("sshdump").get_extcap_config()

IPv4路由管理

Scapy的路由表存储在conf.route中,可以方便地查看和查询:

>>> conf.route

Network          Netmask          Gateway   Iface  Output IP  Metric
0.0.0.0          0.0.0.0          10.0.0.1  eth0   10.0.0.5   100
10.0.0.0         255.255.255.0    0.0.0.0   eth0   10.0.0.5   0

查询特定IP的路由

使用conf.route.route()可以查询到特定IP的路由信息,返回格式为(接口, 出站IP, 网关)

>>> conf.route.route("127.0.0.1")
('lo', '127.0.0.1', '0.0.0.0')

IPv6路由管理

IPv6路由的管理方式与IPv4类似,只是使用conf.route6对象:

>>> conf.route6

实用网络信息获取

获取默认网关IP

>>> gw = conf.route.route("0.0.0.0")[2]
>>> gw
'10.0.0.1'

获取接口IP地址

>>> ip = get_if_addr(conf.iface)  # 默认接口
>>> ip = get_if_addr("eth0")  # 指定接口
>>> ip
'10.0.0.5'

获取接口MAC地址

>>> mac = get_if_hwaddr(conf.iface)  # 默认接口
>>> mac = get_if_hwaddr("eth0")  # 指定接口
>>> mac
'54:3f:19:c9:38:6d'

获取下一跳MAC地址

这个功能会自动处理本地ARP查询或网关MAC获取等场景:

>>> mac = getmacbyip("10.0.0.1")
>>> mac
'f3:ae:5e:76:31:9b'

Scapy的这些网络管理功能为网络测试和开发提供了极大的便利,使得开发者可以专注于网络协议的实现和测试,而不必过多关注底层网络配置的细节。

scapy Scapy: the Python-based interactive packet manipulation program & library. Supports Python 2 & Python 3. scapy 项目地址: https://gitcode.com/gh_mirrors/sc/scapy

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

巫清焘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值