自己动手实现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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 组织切片技术的原理(黄瓜怎么切片)

    第一种切片机制——FileInputFormat1.切片的机制1.切片的机制简单地按照文件的内容长度进行切片切片大小,默认等于Block大小切片时不考虑数据集整体,而是逐个针对每一个文件单独切片…

    2022年4月13日
    41
  • Mint-UI

    Mint-UI一、MUI不同于Mint-UI,MUI只是开发出来的一套很好用的代码片段,里面提供了配置的样式,配置的HTML代码段,类似于Bootstrap;而Mint-UI,是真正的组件库,是使用了Vue技术

    2022年7月2日
    26
  • XLSTransformer导出多sheet页

    XLSTransformer导出多sheet页https://blog.csdn.net/z69183787/article/details/51407171?utm_source=app&app_version=4.17.0&code=app_1562916241&uLinkId=usr1mkqgl919blen

    2022年7月24日
    6
  • leetcode-19删除链表的倒数第 N 个结点

    leetcode-19删除链表的倒数第 N 个结点原题链接给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。进阶:你能尝试使用一趟扫描实现吗?示例 1:输入:head = [1,2,3,4,5], n = 2输出:[1,2,3,5]示例 2:输入:head = [1], n = 1输出:[]示例 3:输入:head = [1,2], n = 1输出:[1]提示:链表中结点的数目为 sz1 <= sz <= 300 <= Node.val <= 1001 <= n <= s

    2022年8月9日
    4
  • SpringBoot 事务注解@Transactional

    SpringBoot 事务注解@TransactionalSpringBoot提供了非常方便的事务操作,通过注解就可以实现事务的回滚,非常方便快捷,下面我们就说一下如何进行事务操作。1.事务说明在Spring中,事务有两种实现方式,分别是编程式事务管理和声明式事务管理两种方式。编程式事务管理:编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理,…

    2022年5月8日
    222
  • 黑马ssm项目_黑马程序员社区

    黑马ssm项目_黑马程序员社区上传到https://github.com/ahn6666/ssm2021.6.13

    2025年6月18日
    2

发表回复

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

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