当前位置: 首页 > news >正文

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

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

import socket
import os
import struct
import timedef 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)#print(addr)#print(recv_packet)#print('elaspsed_time:',elapsed_time)#print(icmp_header)#print(icmp_type)#print(code)#print(checksum)#print(packet_id)#print(sequence)# 判断是否为ICMP端口不可达消息if icmp_type == 3 and code == 3 and packet_id == os.getpid() & 0xFFFF:print(f"Port {port} is closed")break# 此时可以认为端口开放print(f"Port {port} is open")breakexcept socket.timeout:print(f"Port {port} is closed.Timeout!")breakfinally:sock.close()target_ip = '10.233.76.44'
target_ip = '115.236.153.177'
target_ip = '8.8.8.8'
ports_to_scan = [80, 443, 22, 53]  # 要探测的端口列表for port in ports_to_scan:udp_port_scan(target_ip, port)

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

http://www.lryc.cn/news/159977.html

相关文章:

  • VUE for循环 默认选中第一条数据
  • 小程序代码管理
  • RK3568-GPIO控制
  • 2023开学礼《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书南京师范大学图书馆
  • 【MySQL】什么是索引?如何选择索引类型?
  • 第16章 服务安全控制
  • 面试问题总结(1)
  • QUdpSocket Class
  • 如何实现MongoDB数据的快速迁移?
  • react中使用Modal.confirm数据不更新的问题解决
  • 【vue】下拉、上拉刷新
  • el-tree组件的锚点链接
  • 汽车电气架构
  • Spring中添加打印请求头的拦截器
  • LeetCode(力扣)216. 组合总和 IIIPython
  • 无涯教程-JavaScript - IMLOG10函数
  • C++ 学习之深拷贝 和 浅拷贝
  • Qt QtWidgets相关问题汇总
  • 【ubuntu22.04 文件管理器nautilus配置默认终端为alacritty】
  • 信息化发展30
  • css溢出隐藏的五种方法
  • RK3568-UART通信
  • 武警三维数字沙盘电子沙盘虚拟现实模拟推演大数据人工智能开发教程第15课
  • 【Linux从入门到精通】通信 | 共享内存(System V)
  • ubuntu 扩展内存挂载
  • 聚观早报|小米14渲染图曝光;蚂蚁金融大模型正式发布
  • musl libc 动态加载:默认链接脚本
  • 快速排序(递归和非递归两种方法实现)
  • ApiPost7使用介绍 | HTTP Websocket
  • Linux常用命令——convertquota命令