网络自动化运维 Help

11-1 Scapy基础

介绍

Scapy:用于构造网络各层协议报文,如以太网报文、icmp报文、IP报文,偏底层,非常灵活。Scapy不像requests库那种偏应用层的包,而是比较偏低层、精确、灵活,例如构造TCP报文中的ACK握手报文。
Scapy官网
Scapy官方文档

先决条件与注意事项

  • Linux环境 :Windows对很多linux生态出身的生产力方面的库并不能很好的兼容。经过我的测试,即使安装依赖库、依赖程序、添加环境变量,仍出现调用问题。
    因此将在Ubuntu24中的Pycharm中(python3.12虚拟环境)进行。专门用于渗透测试的Kali系统自带scapy。

  • Root权限问题 :发包、监控网卡等操作需要root权限,linux中的Pycharm为普通用户权限,在Pycharm中直接点击▶️运行脚本将会报错,虽然可以在终端sudo python3 xxx.py方式运行,但为了方便还是建议一开始就以root用户登录。Pycharm以root用户运行后,为了安全将会禁止一些文件的预览,影响不大可以找到文件所在位置用系统自带软件打开。

  • Scapy版本问题:这个包历史早,python2时代就已经流行,网上一些教程的语法已经不正确。

  • Scapy安装问题:Scapy包本身比较小,但它各种功能要调用其它程序,例如npcap/winpcap、PyX、GraphViz、TexLive(Latex)、matplotlib等,这些程序有些是系统应用,要通过各自操作系统包管理器安装,并且加入环境变量,因此代码运行中可能报各种缺少依赖的错误。

  • 回顾网络基础OSI模型:

    11 1osi

实验1 初步尝试和基础

  1. 打开ubuntu虚拟机,以root用户登录桌面(不是普通用户登录、命令行中再sudo),这样启动的Pycharm也具备root权限,运行后面代码时不会报权限错误。
    (这里不建议用sudo命令因为初学者分不清python虚拟机环境、权限、脚本路径问题)。确认虚拟机网络连接正常。

  1. 安装scapy

# Ubuntu中的Pycharm中的终端(Pycharm的终端就是系统终端,但已经激活了虚拟环境和添加必要的环境变量路径) pip install scapy==2.6.1
  1. 构造报文

from scapy.all import * # IP()在Pycharm中报红线是正常情况,因为Pycharm是静态检查,有些包结构检测不出来,只要运行不报错就行。 ip_packet = IP() ip_packet.show() icmp_packet = ICMP() # scapy的源码通过重载 p = ip_packet / icmp_packet p.show()
11 1 1

实验2 发送ICMP报文

即ping命令

from scapy.all import * # 创建IP报文 ip_layer = IP(dst="127.0.0.1") # 可以把IP换成旁边同学的电脑IP # 创建一个传输层协议,例如 TCP icmp_layer = ICMP() # 将 IP 报文和 TCP 段组合在一起 packet = ip_layer / icmp_layer # 显示构造的报文 packet.show() # sr()方法,发送报文并等待响应。需要管理员权限。 print(f"正在向 发送 Ping 请求...") ans, unans = sr(packet, timeout=5, verbose=True) print(ans, unans) for sent_packet, received_packet in ans: print(f"发送报文概况: {sent_packet.summary()}") print(f"接收报文概况: {received_packet.summary()}") print(f"响应来自: {received_packet.src}")
11 1 2

实验3 sniff嗅探

sniff函数可以像Wireshark一样抓包。

实验设计:需要开启两个终端,一个负责嗅探,一个负责发包。

前置条件:
1)确定处于root权限。发包和控制网卡需要root权限。
2)开启两个终端,终端1进入交互式解释器(Pycharm自带的Python Interactive Console是普通权限,不能使用),终端2ping命令发icmp报文。

终端1进入Python交互式解释器

# 已经是root权限 python3 # 如果普通用户权限 # sudo python3
  1. 终端1开始嗅探

# python交互式解释器环境下 >>> from scapy.all import * # 如果报no module scapy但前面的例子能运行,说明终端环境没有更新,不识别刚才安装的scapy,关闭再打开终端。 >>> a = sniff(filter="icmp", count=2) # 输完这句会阻塞卡住,光标不会到下一行。此时开启另一个终端。

进入阻塞状态后,进行下一步

  1. 终端2发icmp包
    ping任意网址

# 系统终端环境下 ping www.baidu.com
  1. 终端1嗅探到icmp包。
    阻塞状态结束,说明已经抓到包。回到">>>"开头的交互式解释器状态,打印变量a查看嗅探到的icmp包信息。

# 回显信息 >>> a <Sniffed: TCP:0 UDP:0 ICMP:2 Other:0> >>> a.nsummary() 0000 Ether / IP / ICMP 192.168.0.102 > 47.112.110.79 echo-request 0 / Raw 0001 Ether / IP / ICMP 47.112.110.79 > 192.168.0.102 echo-reply 0 / Raw
11 1 3

进行上述几个实验时,可以打开Wireshark观察。

18 二月 2026