python 指定5000端口抓包判断是否是内网地址,判断方法 1: 将ip存入字典 如果在字典中ip 唯一的话就认为是内网网段,如果不唯一,则不认为是内网网段 2:常见的内网网段判断

  1. 所需库安装
    • 需要安装scapy库用于抓包操作,如果未安装,可以使用pip install scapy命令安装。另外,还需要re库(Python 标准库,无需额外安装)用于正则表达式匹配。
  2. 代码实现思路
    • 利用scapy在指定的 5000 端口进行抓包操作。
    • 从抓到的包中提取源 IP 地址。
    • 使用提供的is_internal_ip函数根据常见内网网段判断 IP 是否为内网地址,同时将 IP 地址存入字典,根据其在字典中的唯一性再次判断是否为内网地址。
  3. 完整代码示例

python

import re
from scapy.all import srp, Ether, ARP


def is_internal_ip(ip):
    internal_ip_ranges = [
        re.compile('^10\.'),
        re.compile('^172\.(1[6 - 9]|2[0 - 9]|3[0 - 1])\.'),
        re.compile('^192\.168\.')
    ]
    for range in internal_ip_ranges:
        if range.match(ip):
            return True
    return False


def check_internal_network():
    ip_dict = {}
    packets = srp(Ether(dst='ff:ff:ff:ff:ff:ff')/ARP(pdst='0.0.0.0/0', sport = 5000, dport=5000), timeout = 3, verbose = 0)[0]
    for packet in packets:
        ip = packet[1].psrc
        if ip not in ip_dict:
            ip_dict[ip] = 1
        else:
            ip_dict[ip]+=1
        if is_internal_ip(ip):
            print(f"{ip} 是内网地址(通过常见网段判断)")
        elif ip_dict[ip] == 1:
            print(f"{ip} 是内网地址(通过IP唯一性判断)")
        else:
            print(f"{ip} 不是内网地址")


if __name__ == '__main__':
    check_internal_network()

  1. 代码解释
    • is_internal_ip函数中:
      • 定义了一个包含正则表达式对象的列表internal_ip_ranges,这些正则表达式分别用于匹配常见的内网网段。
      • 遍历这个列表,对于每个正则表达式,如果能匹配传入的 IP 地址ip,则返回True,表示该 IP 是内网地址;如果遍历完列表都没有匹配成功,则返回False
    • check_internal_network函数中:
      • 创建了一个空字典ip_dict,用于记录每个 IP 地址出现的次数。
      • 使用scapysrp函数进行抓包操作,构造了一个以太网帧(目的 MAC 地址为广播地址)和 ARP 请求(目标 IP 为0.0.0.0/0,源端口和目的端口为 5000),设置超时时间为 3 秒且不显示详细信息,然后获取抓到的包。
      • 对于每个抓到的包,获取其源 IP 地址ip。如果ip不在ip_dict中,将其添加到字典中并设置计数为 1;如果已经在字典中,则将计数加 1。
      • 接着调用is_internal_ip函数判断ip是否为内网地址,如果是则按照相应的判断方式打印结果;如果不是通过常见网段判断为内网地址,但在字典中的计数为 1(即唯一性判断),也认为是内网地址并打印结果;否则,认为不是内网地址并打印结果。
    • if __name__ == '__main__'部分调用check_internal_network函数开始整个检查过程。
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

三希

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

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

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

打赏作者

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

抵扣说明:

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

余额充值