Scrapy IP()类 编程指南(基础)

Scrapy IP()类 编程指南(基础)

IP简介

工欲善其事,必先利其器,在聊Scapy IP类时,我们先要了解IP是什么。

R-C

IP指的是Internet Protocol(互联网协议)的数据包。Internet Protocol是互联网上用于在网络中传输数据的一种协议。在TCP/IP协议族中,IP层负责数据包的路由和寻址,确保数据能够在网络中正确传递。

IP协议定义了一种在网络中唯一标识设备(主机或路由器)的方式,并提供了一种将数据分割成小的数据包进行传输的机制。每个数据包都包含源和目标设备的IP地址,以便路由器能够正确地将数据包从源传输到目标。

IP协议又分为IPv4IPv6,两个版本,IPv6可以理解为IPv4的升级版,但它们又有所不同,它的出现,是为了解决IPv4地址即将耗尽的问题,日后也会详细说明IPv6,今天我们主要的对象就是IPv4

在IPv4协议中,IP地址主要被分为五个类别,通常称为IP地址的分类。这些分类是基于地址的网络部分的位数,以及主机部分的位数。这五个主要的IP地址分类是:A类、B类、C类、D类和E类。

  1. 类A地址
    • 范围:1.0.0.0 到 126.255.255.255
    • 特点:第一个字节(8位)用于网络部分,剩余的三个字节(24位)用于主机部分。
    • 可用网络:2^7 - 2 = 126,因为0和127保留作为特殊用途。
  2. 类B地址
    • 范围:128.0.0.0 到 191.255.255.255
    • 特点:前两个字节(16位)用于网络部分,后两个字节(16位)用于主机部分。
    • 可用网络:2^14 - 2 = 16,382
  3. 类C地址
    • 范围:192.0.0.0 到 223.255.255.255
    • 特点:前三个字节(24位)用于网络部分,最后一个字节(8位)用于主机部分。
    • 可用网络:2^21 - 2 = 2,097,150
  4. 类D地址
    • 范围:224.0.0.0 到 239.255.255.255
    • 特点:用于多播(Multicast)通信,不分配给单个主机或网络。
  5. 类E地址
    • 范围:240.0.0.0 到 255.255.255.255
    • 特点:保留作为将来使用的实验和开发。

IP报文头

在Scapy中,IP报文头与IP()类直接相关。IP()类用于创建和处理IPv4报文头,它是Scapy中用于构建IPv4数据包的类。使用IP()类,我们可以轻松地定义IPv4数据包的各种属性,如源地址、目标地址、协议类型等。

在这里插入图片描述

版本(Version)

  • 占4位。
  • 指定IP协议的版本,IPv4的版本号为4。

头部长度(IHL - Internet Header Length)

  • 占4位。
  • 指定IPv4头部的长度,以32位字(4字节)为单位。由于IPv4头部中最少有20字节,因此该字段的值至少为5(表示20字节)。

服务类型(Type of Service - TOS)

  • 占8位。
  • 用于指定服务质量,包括优先级、延迟、吞吐量和可靠性。

总长度(Total Length)

  • 占16位。
  • 指定整个IPv4数据包的长度,包括头部和数据。最大长度为65,535字节。

标识(Identification)

  • 占16位。
  • 用于将相关的数据包片段组合成完整的数据包。

标志位(Flags)

  • 占3位。
  • 包含“不分片(Don’t Fragment)”和“更多片段(More Fragments)”标志。

片偏移(Fragment Offset)

  • 占13位。
  • 指定数据包片段在原始数据包中的偏移量。

生存时间(Time to Live - TTL)

  • 占8位。
  • 限制数据包在网络中的生存时间,每经过一个路由器,该字段值减一。当TTL为0时,数据包被丢弃。

协议(Protocol)

  • 占8位。
  • 指定上层协议,例如TCP(6)、UDP(17)、ICMP(1)等。

头部校验和(Header Checksum)

占16位。

用于检测IPv4头部的错误,主要是检测在传输过程中头部信息是否损坏。

源地址(Source Address)

占32位。

指定数据包的源IP地址。

目标地址(Destination Address)

占32位。

指定数据包的目标IP地址。

选项(Options)

可选字段,用于提供一些额外的信息。通常很少被使用,因为IPv4头部本身已经包含了足够的信息。

Scapy IP()使用

而在Scapy中,IP报文头与IP()类直接相关。IP()类用于创建和处理IPv4报文头,它是Scapy中用于构建IPv4数据包的类。

以下是IP()类的一些常用属性:

  1. src:指定源IP地址。
#两种方式指定
IP(src="x.x.x.x")#构造函数指定

ip_packet = IP() #构造空参数
ip_packet.src = "x.x.x.x" #成员属性指定
  1. dst:指定目标IP地址
#两种方式指定
IP(dst="x.x.x.x")#构造函数指定

ip_packet = IP() #构造空参数
ip_packet.dst = "x.x.x.x" #成员属性指定
  1. proto:指定上层协议,例如TCP、UDP等。
#两种方式指定
IP(proto="TCP")#构造函数指定

ip_packet = IP() #构造空参数
ip_packet.proto = "TCP" #成员属性指定
  1. ttl:设置Time-to-Live值。
#两种方式指定
IP(ttl="5")#构造函数指定

ip_packet = IP() #构造空参数
ip_packet.ttl = 5 #成员属性指定
  1. tos:设置Type of Service值。
#两种方式指定
IP(tos=0b10101010)#构造函数指定

ip_packet = IP() #构造空参数
ip_packet.tos = 0b10101010 #成员属性指定
  1. ihl:设置IP报文头长度(通常不需要手动设置)。
#两种方式指定
IP(ihl=5)#构造函数指定

ip_packet = IP() #构造空参数
ip_packet.ihl = 20 #成员属性指定
  1. flags:设置IP标志位。
#两种方式指定
IP(flags="MF")#构造函数指定

ip_packet = IP() #构造空参数
ip_packet.src ="MF"#成员属性指定
  1. options:设置IP报文头的选项字段。
#两种方式指定
IP(options=[(1, 1, b'\x01')])#构造函数指定

ip_packet = IP() #构造空参数
ip_packet.src = [(1, 1, b'\x01')] #成员属性指定

Scapy IP() 实战使用

IP有这么多头部字节,我们用的最多也就是src源地址和dst目的地址,它们决定着,我们的数据包,由谁发起,又要发送到哪里。现在我们使用Scapy来构造一个IP头。

from scapy.layers.inet import IP, ICMP
from scapy.sendrecv import sr1

# 创建一个包含IP和ICMP协议的数据包,也就是ping包
ip_packet = IP(dst="192.168.30.55") / ICMP()

# 发送数据包并等待响应
response = sr1(ip_packet)

# 打印响应信息
response.show()

image-20240126220522919

如果我将src源IP地址,修改在发送,再来查看结果

from scapy.layers.inet import IP, ICMP
from scapy.sendrecv import sr1


ip_packet.src = '123.123.222.111'

send_ip = sr1(ip_packet)

image-20240126223609023

这里可能有人就有疑问了,源IP我明明已经修改为123.123.222.111,为什么还会有响应包?这里就牵扯到交换机的原理以及ARP的知识了。

交换机是一个二层设备,为什么说它是二层设备呢,因为交换机的基础功能就是处理OSI网络模型中的第二层(数据链路层),在数据链路层来说,它更关心是MAC物理地址的交换,它在工作过程中维护一张关键的表格。

MAC地址表:

  • 它是一个用于存储设备MAC地址与物理端口对应关系的表格。当交换机收到一个帧(数据包)时,它会查看帧中的目标MAC地址,并将这个MAC地址与接收到帧的端口进行关联,更新MAC地址表。这样,交换机就知道将数据帧发送到哪个端口,以便正确地转发数据。

MAC地址就是设备的独特标签,IP地址是用于在网络中找该设备的逻辑地址,而怎么通过设备的逻辑地址去找到这台设备呢,这就要通过ARP协议来解决了。ARP协议可以帮助你根据一个逻辑地址找到具体设备的物理设备,以便进行直接通信。在主机系统一般都会存在一个ARP表作用如下:

ARP表:

  • 它用于存储IP地址与对应的MAC地址之间的映射关系。当设备需要与网络中的其他设备通信时,它首先会查看自己的ARP表。如果在ARP表中找不到目标设备的IP地址对应的MAC地址,设备就会发起ARP请求,请求网络中其他设备告知它目标设备的MAC地址。

因为我们没有构造二层Ether包,所以这个数据包的mac地址会以默认接口的MAC地址认作缺省值(默认属性)进行发送,当这个包经过交换机时,交换机会读取该数据包的目的MAC信息,发现目的MAC信息全为F就为广播包,他就会向所有端口发送ARP广播报文,询问谁是192.168.30.55,,找到相应的接口进行二层转发,当数据包到达目的后,目标主机会先检查数据包的源MAC地址,并在本机的ARP表中查找对应的MAC与IP绑定关系,完成接收后,目标主机会根据请求包中的源IP、源MAC构造一个响应包发给源主机

这就解释了,为什么我随便设置的Ip还能得到响应报文的问题。

image-20240126234635509

最后给出一个由ScapyIP()类编写的超级Ping工具:

# coding=utf-8
"""
@Author: 迪奥布斯
@create time : 2024/1/27
@超级ping
"""
import re
import time

from scapy.config import conf
from scapy.layers.inet import IP, ICMP
from scapy.sendrecv import sr, sr1

ips = []


def order_ip(ip):
    ip_source, ip_num = ip.rsplit('.', 1)
    start, end = ip_num.split('-')
    if start > end:
        tmp = start
        start = end
        end = tmp
    ip_list = [ip_source + '.' + str(num) for num in range(int(start), int(end))]
    return ip_list


def num_ip(ip):
    b = ip.split(',')
    a = set(b)
    return list(a)


def ip_run(ip):
    return [ip]


def check_ip_format(ip):
    patterns = {
        "ipv4": (re.compile(r'^(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}$'), ip_run),
        "ip_range": (re.compile(
            r'^(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}-(25[1-5]|2[0-4]\d|1\d\d|[1-9]?\d)$'),
                     order_ip),
        "multiple_ips": (re.compile(
            r'(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}-(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)|(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})(?:,(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}-(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)|(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))*$'
        ), num_ip),
    }
    matched = False

    for pattern_type, (pattern, fun) in patterns.items():
        if pattern.match(ip):
            ips.append(fun(ip))
            matched = True
            break
    if not matched:
        print("输入的IP无效,请重新输入!")
        exit()


def send_icmp(ip, interface):
    # 构建 ICMP 请求包
    ping_pkt = IP(dst=ip) / ICMP(id=1000)

    try:
        # 发送 ICMP 请求并等待响应 n
        time.sleep(0.5)
        start_time = time.time()
        ip_response = sr1(ping_pkt, timeout=1, verbose=False, iface=interface)
        end_time = time.time()
        if ip_response is not None:
            ttl_sys = {255: 'Ulinx系统(交换机、路由器)',
                       128: 'Windos系统',
                       64: 'MacOS/Linux'}
            for ttl_num, sys_name in ttl_sys.items():
                if ip_response[IP].ttl == ttl_num:
                    sys = sys_name
            print(
                f'{ip_response[IP].src} ---> 可达,{ip_response[IP].ttl} ---> 跳数,它是{sys},花费 {(end_time - start_time) * 1000:0.1f} 毫秒')
        else:
            print(f'{ip} ---> 无响应')

    except Exception as e:
        print(f'发生错误: {e}')
        exit()


def start_main(ip, num, interface):
    check_ip_format(ip)
    if len(ips[0]) < 2:
        a = num * len(ips[0])
        b = a - num
        while not a == b:
            send_icmp(ips[0][0], interface)
            a -= 1
    elif len(ips[0]) >= 2:
        a = num * len(ips[0])
        for ip_num in ips[0]:
            b = a - num
            while not a == b:
                send_icmp(ip_num, interface)
                a -= 1


def tiShi():
    print("*" * 80)
    print("目前可以实现功能,多IP范围ping主机判断主机系统")
    print("IP输入格式为:")
    print("单个IP:192.168.0.1")
    print("范围IP:192.168.0.1-255")
    print("多个IP:192.168.0.1,192.168.0.2")
    print("ping的次数,默认为4次")
    print("指定网卡接口:不指定为默认网卡")
    print("指定接口为网卡名称,例如:windows的网卡名称“以太网”或“以太网1,linux的网卡名”eth0“或”ens0“")
    print("*" * 80)


def user_input():
    tiShi()
    while True:
        target_ip = input('请输入你要ping的ip:')
        target_num = input('请输入要ping的次数:').strip()
        if not target_num or not target_num.isdigit():
            ai = 4
            print(f"输入为空,设置默认值为: {ai}", end='')
        else:
            try:
                ai = int(target_num)
                print(f"转换后的整数值为: {ai}", end='')
            except ValueError:
                print("输入无效,无法转换为整数。", end='')
        print(target_num)
        target_interface = input("请输入网卡名称:")
        if target_interface == '':
            target_interface = conf.iface
            print('输入为空为默认网卡:', conf.iface.name)
        start_main(target_ip, ai, target_interface)


if __name__ == '__main__':
    user_input()


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/353055.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

取消Vscode在输入符号时自动补全

取消Vscode在输入符号时自动补全 取消Vscode在输入符号时自动补全问题演示解决方法 取消Vscode在输入符号时自动补全 问题演示 在此状态下输入/会直接自动补全, 如下图 笔者想要达到的效果为可以正常输入/而不进行补全, 如下图 解决方法 在设置->文本编辑器->建议, 取消…

经典目标检测YOLO系列(三)YOLOV3的复现(1)总体网络架构及前向处理过程

经典目标检测YOLO系列(三)YOLOV3的复现(1)总体网络架构及前向处理过程 和之前实现的YOLOv2一样&#xff0c;根据《YOLO目标检测》(ISBN:9787115627094)一书&#xff0c;在不脱离YOLOv3的大部分核心理念的前提下&#xff0c;重构一款较新的YOLOv3检测器&#xff0c;来对YOLOv3有…

<蓝桥杯软件赛>零基础备赛20周--第19周--最短路

报名明年4月蓝桥杯软件赛的同学们&#xff0c;如果你是大一零基础&#xff0c;目前懵懂中&#xff0c;不知该怎么办&#xff0c;可以看看本博客系列&#xff1a;备赛20周合集 20周的完整安排请点击&#xff1a;20周计划 每周发1个博客&#xff0c;共20周。 在QQ群上交流答疑&am…

OpenCV-28 全局二值化

一、形态学概念 什么是形态学&#xff1f; 1&#xff09;指一系列处理图像型状特征的图像处理技术 2&#xff09;形态学的基本思想是利用一直特殊的结构元&#xff08;本质上是卷积核&#xff0c;且这个卷积核的值只有1和0&#xff09;来测量或提取输入图像中相应的型状或特…

17. Spring Boot Actuator

17. Spring Boot Actuator Spring Boot执行器(Actuator)提供安全端点&#xff0c;用于监视和管理Spring Boot应用程序。 默认情况下&#xff0c;所有执行器端点都是安全的。 在本章中&#xff0c;将详细了解如何为应用程序启用Spring Boot执行器。 启用Spring Boot Actuator …

CAD-autolisp(三)——文件、对话框

目录 一、文件操作1.1 写文件1.2 读文件 二、对话框DCL2.1 初识对话框2.2 常用对话框界面2.2.1 复选框、列表框2.2.2 下拉框2.2.3 文字输入框、单选点框 2.3 Lisp对dcl的驱动2.4 对话框按钮实现拾取2.5 对话框加载图片2.5.1 幻灯片图片制作2.5.1 代码部分 一、文件操作 1.1 写…

架构篇28:业务高可用的保障-异地多活架构

文章目录 应用场景架构模式小结无论是高可用计算架构,还是高可用存储架构,其本质的设计目的都是为了解决部分服务器故障的场景下,如何保证系统能够继续提供服务。但在一些极端场景下,有可能所有服务器都出现故障。例如,典型的有机房断电、机房火灾、地震、水灾……这些极端…

【阿里云服务器数据迁移】 同一个账号 不同区域服务器

前言 假如说一台云服务器要过期了,现在新买了一台,有的人会烦恼又要将重新在新的服务器上装环境,部署上线旧服务器上的网站项目, 但是不必烦恼,本文将介绍如何快速将就旧的服务器上的数据迁移到新的服务器上. 包括所有的环境和网站项目噢 ! 步骤 (1) 创建旧服务器自定义镜像…

AI作画工具 stable-diffusion-webui 一键安装工具(A1111-Web-UI-Installer)

安装 下载最新版本确保你的 NVIDIA 显卡驱动程序是最新的&#xff08;起码不能太老&#xff09;启动安装程序在欢迎屏幕上单击下一步在屏幕上&#xff0c;选择要安装的内容如果你已经安装了 Python 3.10 和 Git&#xff0c;那么可以取消选中如果你不知道这些是什么&#xff0c…

Spring boot + Azure OpenAI 服务 1.使用 GPT-35-Turbo

Azure OpenAI 服务使用 GPT-35-Turbo 先决条件 maven 注意 beta.6 版本 <dependency><groupId>com.azure</groupId><artifactId>azure-ai-openai</artifactId><version>1.0.0-beta.6</version></dependency>问答工具类 pack…

Django介绍

一、介绍 Django是Python语言中的一个Web框架,Python语言中主流的web框架有Django、Tornado、Flask 等多种 优势:大而全,框架本身集成了ORM、模型绑定、模板引擎、缓存、Session等功能,是一个全能型框架,拥有自己的Admin数据管理后台,第三方工具齐全,性能折中 缺点:…

【深度学习:t-SNE 】T 分布随机邻域嵌入

【深度学习&#xff1a;t-SNE 】T 分布随机邻域嵌入 降低数据维度的目标什么是PCA和t-SNE&#xff0c;两者有什么区别或相似之处&#xff1f;主成分分析&#xff08;PCA&#xff09;t-分布式随机邻域嵌入&#xff08;t-SNE&#xff09; 在 MNIST 数据集上实现 PCA 和 t-SNE结论…

Sentinel:微服务守护神的崛起

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 Sentinel&#xff1a;微服务守护神的崛起 前言Sentinel简介&#xff1a;微服务流控的新宠Sentinel工作原理 前言 想象一下你正在主持一场盛大的马拉松比赛&#xff0c;参赛者如潮水般汇聚&#xff0c…

换个思维方式快速上手UML和 plantUML——类图

和大多数朋友一样&#xff0c;Jeffrey 在一开始的时候也十分的厌烦软件工程的一系列东西&#xff0c;对工程化工具十分厌恶&#xff0c;觉得它繁琐&#xff0c;需要记忆很多没有意思的东西。 但是之所以&#xff0c;肯定有是因为。对工程化工具的不理解和不认可主要是基于两个逻…

JVM篇----第九篇

系列文章目录 文章目录 系列文章目录前言一、分代收集算法二、新生代与复制算法三、老年代与标记复制算法前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 一、分代…

数据结构(1)--> 顺序表

定义&#xff1a; 顺序表存储定义&#xff1a; 把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构&#xff0c;顺序表功能的实现借助于数组&#xff0c;通过对数组进行封装&#xff0c;从而实现增删查改的功能&#xff0c;严格意义上来说&#xff08;数组无法实现…

centos8源码安装python

前置条件&#xff0c;删除原来系统自带的python&#xff0c;如果系统自带的版本符合你的预期&#xff0c;就不用重新安装了。 yum remove python yum autoremove一、下载python 官网下载 这里是3.12.1版本 我的网盘下载 提取码&#xff1a;d8g1 文件名为Python-3.12.1.tgz 二…

Nginx进阶篇【五】

Nginx进阶篇【五】 八、Nginx实现服务器端集群搭建8.1.Nginx与Tomcat部署8.1.1.环境准备(Tomcat)8.1.1.1.浏览器访问:8.1.1.2.获取动态资源的链接地址:8.1.1.3.在Centos上准备一个Tomcat作为后台web服务器8.1.1.4.准备一个web项目&#xff0c;将其打包为war8.1.1.5.启动tomcat进…

MySQL:数据库索引详解

1、什么是索引&#xff1a; 索引是一种用于快速查询和检索数据的数据结构。常见的索引结构有: B 树&#xff0c; B树和 Hash。 索引的作用就相当于目录的作用。打个比方: 我们在查字典的时候&#xff0c;如果没有目录&#xff0c;那我们就只能一页一页的去找我们需要查的那个字…

深入理解TCP网络协议,三次握手

目录 1.TCP协议的段格式 2.TCP原理 2.1确认应答 2.2超时重传 3.三次握手(重点) 1.TCP协议的段格式 我们先来观察一下TCP协议的段格式图解: 源/目的端口号:标识数据从哪个进程来,到哪个进程去 32位序号/32位确认号:TCP会话的每一端都包含一个32位&#xff08;bit&#xf…