使用ICMP协议来判断UDP端口的存活状态

news/2024/5/18 14:41:37 标签: udp, 网络协议, 网络

        我们使用了原始套接字(socket.SOCK_RAW)来发送和接收ICMP消息,也就是通过模拟ICMP协议来进行UDP端口的探测。我们构造了一个简单的ICMP数据包,并将其发送到目标主机的特定端口。然后,我们等待接收目标主机返回的ICMP消息,并判断其类型和代码是否为端口不可达消息。如果是,则推断目标端口关闭;如果不是,则认为目标端口开放。

import socket
import os
import struct
import time

def udp_port_scan(target_ip, port):
    icmp = socket.getprotobyname("icmp")
    sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, icmp)
    sock.settimeout(1)  # 设置超时时间为1秒
    
    # 构造ICMP消息
    data = b'abcdefghijklmnopqrstuvwabcdefghi'
    icmp_packet = struct.pack("!BBHHH32s", 8, 0, 0, 0, 0, data)
    
    try:
        sock.sendto(icmp_packet, (target_ip, port))
        start_time = time.time()
        while True:
            try:
                recv_packet, addr = sock.recvfrom(1024)
                end_time = time.time()
                elapsed_time = (end_time - start_time) * 1000  # 计算往返时间
                icmp_header = recv_packet[20:28]
                icmp_type, code, checksum, packet_id, sequence = struct.unpack("!BBHHH", icmp_header)
                
                # 判断是否为ICMP端口不可达消息
                if type == 3 and code == 3 and packet_id == os.getpid() & 0xFFFF:
                    print(f"Port {port} is closed")
                    break
                
                # 此时可以认为端口开放
                print(f"Port {port} is open")
                break
            except socket.timeout:
                print(f"Port {port} is closed")
                break
    finally:
        sock.close()

target_ip = '192.168.0.1'
ports_to_scan = [80, 443, 22, 53]  # 要探测的端口列表

for port in ports_to_scan:
    udp_port_scan(target_ip, port)

请注意,在使用原始套接字和ICMP协议进行UDP端口探测时,可能需要使用管理员权限运行脚本。同时,由于涉及到底层协议和操作系统的原因,代码在不同的平台和环境中可能会有所调整。


http://www.niftyadmin.cn/n/4999787.html

相关文章

Python小知识 - 【Python】如何使用Pytorch构建机器学习模型

【Python】如何使用Pytorch构建机器学习模型 机器学习是人工智能的一个分支,它的任务是在已有的数据集上学习,最终得到一个能够解决新问题的模型。Pytorch是一个开源的机器学习框架,它可以让我们用更少的代码构建模型,并且可以让模…

Git使用经验总结2-配置用户名邮箱

可以使用git config指令来配置一些设置,比如配置用户名邮箱。在开发团队要求成员配置用户名和邮箱是很有用的,可以配合工具区分成员的代码,以及将代码中的问题发送给成员的邮箱中。 查看当前Git的用户名及邮箱的指令: git confi…

SpringMVC入门指南

目录 前言 一、什么是SpringMVC 二、MVC架构模式 三、SpringMVC的工作流程 四、SpringMVC核心组件 五、SpringMVC的优势 六、SpringMVC的配置与常用注解 七、SpringMvc请求处理流程、 控制器的编写 、视图的渲染 1.请求处理流程: 2.控制器的编写&#xff1…

【力扣】304. 二维区域和检索 - 矩阵不可变 <二维前缀和>

目录 【力扣】304. 二维区域和检索 - 矩阵不可变二维前缀和理论初始化计算面积 题解 【力扣】304. 二维区域和检索 - 矩阵不可变 给定一个二维矩阵 matrix,以下类型的多个请求: 计算其子矩形范围内元素的总和,该子矩阵的 左上角 为 (row1, …

【相机标定】opencv python 标定相机内参时不计算 k3 畸变参数

文章目录 1. 背景2. 完整的 opencv python 标定相机内参过程3. 选择是否计算畸变参数 k3 1. 背景 畸变参数 k3 通常用于描述径向畸变的更高阶效应,即在需要高精度的应用中可以用到,一般的应用中 k1, k2 足矣。 常见的应用中, orbslam3 中是否…

CSS3 知识点

一、【圆角效果】 border-radius: 5px 4px 3px 2px; border-top-right-radius:10px 右上解圆滑 二、【阴影效果】 box-shadow: X轴偏移量 Y轴偏移量 [阴影模糊半径] [阴影扩展半径] [阴影颜色] [投影方式]; box-shadow: 0 0 15px blue inset; 内阴影 三、【颜色之RGBA】 colo…

机器学习-波士顿房价预测

目录 一.数据处理 读入数据 数据形状变换 数据集划分 数据归一化处理 将上面封装成load data函数 二. 模型设计 完整封装运行代码: 根据loss值进行梯度计算 控制部分变量的变化图像: 一.数据处理 读入数据 # 导入需要用到的package import numpy as np…

C# 使用ListBox及Picturebox显示所选的任意路径文件夹下的图像

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System