栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

基于ICMP发现活跃主机

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

基于ICMP发现活跃主机

一,ICMP协议简介

        ICMP位于TCP/IP协议簇中的网络层,它的目的是用在ip主机,路由器之间传递控制消息的。简单的来说就是检查网络通路。

        ICMP中提供了多种报文,这些报文可以分成两个大类:查询报文和差错报文。其中查询报文是有一个请求和一个应答构成的。只需向目标主机发送一个请求数据包,根据目标主机是否产生回应即可判断目标主机是否存活。

        其中ARP的查询报文有四种,分别是响应请求与应答,时间戳请求与应答,地址掩码请求与应答,路由器询问与应答,后三种在实际应用中成功率较低,所以主要来考虑使用第一种来实现程序功能。也是计算机中自带ping命令所实现的功能。

        ICMP请求数据包格式:

                ip层内容

                        源IP地址:192.168.1.2

                        目的IP地址:192.168.1.3

                ICMP层内容

                        Type:8 (表示请求)

        ICMP响应数据包格式:

                ip层内容

                        源IP地址:192.168.1.3

                        目的IP地址:192.168.1.2

                ICMP层内容

                        Type:0 (表示应答)

二,程序执行流程

       第一步:给目标主机发送一个ICMP请求

        第二步:是否收到目标主机应答

三,程序编写

        使用scapy库来完成ICMP请求,首先先看看ICMP的数据包内容

        

        其中的参数都会默认进行填写,而type = 8 代表请求数据包。由于ICMP包中没有ip地址参数,而我们扫描中则需要指定目标ip地址,所以还要用到IP数据包。

        IP数据包内容:

        

        其中dst是目标ip地址,src是源ip地址,src和其他参数一样会由程序自行填补,这里只需要知名目标ip地址即可。

         代码部分:

        

from scapy.all import sr,IP,ICMP

target = "192.168.5.2"

ans,unans = sr((IP(dst=target)/ICMP()),timeout = 2)

for snd,rcv in ans:
    print(rcv.sprintf("%IP.src%is alive"))

        执行结果如下:

        

        也可以使用nmap模块来完成程序

        nmap命令格式如下:

                nmap -PE -sn [目标IP],-PE表示使用ICMP协议,-sn表示只测试改主机的状态

        代码如下:

import nmap

target = "192.168.5.2"

nm = nmap.PortScanner()

nm.scan(target,arguments='-PE -sn')

for host in nm.all_hosts():
    print('-'*15)
    print('Host:%s(%s)' % (host,nm[host].hostname()))
    print('State: %s' % nm[host].state())

        执行结果如下: 

        

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/320216.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号