自己动手实现arping

自己动手实现arping只要接触过网络的人,相信对ping命令并不陌生。该命令可以用来检测本机到目标机的网络是否连通,是一种很常见的网络监测手段。对网络熟悉一点的人可能还知道ping命令的工作原理。让我们看看ping命令的介绍:DESCRIPTIONpingusestheICMPprotocol’smandatoryECHO_REQUESTdatagramtoelicitanICMPECHO_RESPONSEfromahostorgateway….

大家好,又见面了,我是你们的朋友全栈君。

只要接触过网络的人,相信对ping命令并不陌生 。该命令可以用来检测本机到目标机的网络是否连通,是一种很常见的网络监测手段。对网络熟悉一点的人可能还知道ping命令的工作原理。

让我们看看ping命令的介绍:

DESCRIPTION
       ping  uses  the  ICMP  protocol's mandatory ECHO_REQUEST datagram to elicit an ICMP ECHO_RESPONSE
       from a host or gateway.  ECHO_REQUEST datagrams (``pings'') have an IP and ICMP header,  followed
       by a struct timeval and then an arbitrary number of ``pad'' bytes used to fill out the packet.
​
       ping works with both IPv4 and IPv6. Using only one of them explicitly can be enforced by specify‐
       ing -4 or -6.
​
       ping can also send IPv6 Node  Information  Queries  (RFC4620).   Intermediate  hops  may  not  be
       allowed, because IPv6 source routing was deprecated (RFC5095).

以上是man打印的ping命令详情介绍。从中可知,ping使用了ICMP协议中的回送请求(echo-rquest)和回送应答(echo-reply)报文。

众所周知,IP协议没有差错报告或差错纠正机制,同时IP协议还缺少主机和管理查询所需要的机制。网际控制报文协议(ICMP)是设计来弥补上述缺憾的。

arping与ping类似,只是arping向目标主机发送arp数据包,用以检测一个IP是否在网络中已被使用。具体使用方式如下所示:

arping -I ens192 192.168.90.10

其中,I参数用来指定网口。

接下来,让我们使用Scapy实现一个简易版本的arping工具:

#!/usr/bin/python
from scapy.all import *
import sys
def arping(target_ip):
    conf.verb=0
    ans, unans=srp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst=target_ip),timeout=2)
    collection = []
    for snd, rcv in ans:
            result = rcv.sprintf(r"%ARP.psrc% %Ether.src%")
            collection.append(result)
    return collection
​
if __name__ == '__main__':
        if len(sys.argv) > 1:
            for ip in sys.argv[1:]:
                print 'ARPING %s from localhost' % (ip)
                print 'Unicast reply from %s' % arping(ip)
        else:
            print 'please input target ip\n'

以上仅仅是作为测试而用,所以没有对输入参数和输出结果进行太多的校验。把该脚本保存为arping文件,并赋予可执行权限,使用效果如下所示:

[root@node kali]# ./arping 192.168.90.22
ARPING 192.168.90.22 from localhost
Unicast reply from ['192.168.90.22 00:0c:39:39:9c:cc']

上述arping实现的具体步骤如下:

  • 构造ARP请求报文。填入发送方的物理地址、发送方的IP地址(Scapy会自动填入发送方地址信息)以及目标IP地址。目标物理地址字段全部填入0。

  • 使用数据链路层协议对ARP报文进行封装。以发送方物理地址作为源地址,以物理广播地址作为目的地址。

  • 使用srp方法发送链路帧,超时时间配置为2秒。

  • 分析srp方法返回的结果。

小结

在局域网中,如果目标主机对ICMP报文进行了屏蔽,但是此时我们又需要知道与该主机的连通性,那么可以尝试使用arping进行测试。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/134288.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Idea激活码最新教程2024.3.1.1版本,永久有效激活码,亲测可用,记得收藏

    Idea激活码最新教程2024.3.1.1版本,永久有效激活码,亲测可用,记得收藏Idea 激活码教程永久有效 2024 3 1 1 激活码教程 Windows 版永久激活 持续更新 Idea 激活码 2024 3 1 1 成功激活

    2025年5月31日
    13
  • 平面图上的欧拉公式

    平面图上的欧拉公式V-E+F=2,V、E、F表示顶点数、边数、面数。

    2022年5月26日
    39
  • android错误之android.os.NetworkOnMainThreadException

    在做一个天气预报的widget的时候,参考了一个源代码,但是一直报错,就从里面抠出来获取天气的代码试试看,结果总是报错 就是这个异常,android.os.NetworkOnMainThreadException代码是这样的:MainActivity:public class MainActivity extends Activity { MyWeather myWe

    2022年3月10日
    39
  • HashMap扩容机制解读[通俗易懂]

    HashMap扩容机制解读[通俗易懂]扩容机制什么时候需要扩容:当hashmap中的元素个数超过数组大小*loadFactor(负载因子)时,就会进行数组扩容,loadFactor的默认值(DEFAULT_LOAD_FACTOR)是0.75这是一个折中的取值,也就是说,默认情况下数组大小为16,那么当hashmap中的元素个数超过16*0.75=12(阈值或者边界值的时候)就把数组的大小扩展Wie2*16=32,然后重新计算出每个元素在数组中的位置,而这是一个非常耗性能的操作,所以我们最好能够提前预知并设置元素的个数。注

    2022年6月17日
    30
  • Unity3d的安装

    Unity3d的安装**Unity3d的安装**1.在线安装a.获取在线安装程序第一步:进入官网:https://unity.com/cn第二步:在主页的底部点击下载第三步:来到UnityStore,拖到该页面的最底部,点击资源下面的Unity旧版本第四步:来到Unity下载存档,拖动页面可以看到很多版本的Unity第五步:选择一个版本,这里我们选择Unity2017.x中的2017.1.0…

    2022年6月27日
    30
  • zabbix添加snmp监控项_SNMP协议

    zabbix添加snmp监控项_SNMP协议目录一、SNMPTrap消息处理流程二、snmptt1、SNMPTrap、snmptt安装2、配置文件修改3、SNMPTrapFile文件创建4、监控项创建三、perl脚本 1、SNMPTrap安装2、从zabbix源码包中拷贝perl脚本到/usr/bin/目录下,并增加执行权限3、修改snmptrapd.conf配置4、修改zabbix配置 …

    2022年8月20日
    8

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号