Linux 我是否可以使用静态IP检测已配置连接设备的网络和网络掩码

Linux 我是否可以使用静态IP检测已配置连接设备的网络和网络掩码,linux,networking,tcp,ping,ifconfig,Linux,Networking,Tcp,Ping,Ifconfig,我正在运行带有有线网络接口的Linux设备。此接口的另一端插入另一个网络感知设备,该设备配置为使用一些静态IP地址和一些网络掩码。所以我们有一个非常简单的网络,只由两个设备和一根电缆组成,甚至它们之间的交换机都并没有,什么都并没有 我们的任务是开始与另一台设备通话,我们需要 使用ifconfig或类似工具建立网络 获取IP地址并启动我的程序,该程序使用此IP地址与 装置 我知道我可以进行广播ping并在电缆的另一端获取设备的IP地址。这对我有用。但要激活网络并进行广播ping,我需要知道网络地址

我正在运行带有有线网络接口的Linux设备。此接口的另一端插入另一个网络感知设备,该设备配置为使用一些静态IP地址和一些网络掩码。所以我们有一个非常简单的网络,只由两个设备和一根电缆组成,甚至它们之间的交换机都并没有,什么都并没有

我们的任务是开始与另一台设备通话,我们需要

  • 使用ifconfig或类似工具建立网络
  • 获取IP地址并启动我的程序,该程序使用此IP地址与 装置
  • 我知道我可以进行广播ping并在电缆的另一端获取设备的IP地址。这对我有用。但要激活网络并进行广播ping,我需要知道网络地址和网络掩码。我当前的bash脚本看起来像

    ifconfig 192.168.100.1 netmask 255.255.255.0 up
    ping -b 192.168.100.255
    

    设备会做出响应。不幸的是,其中一些设备可能被错误配置为不可预知的网络和网络掩码。有人能提出一个如何自动检索网络设置(netbase、netmask)的想法吗?即使是部分解决方案也会心存感激。如果这有帮助的话,我可以编译并安装一个定制的C工具。

    对于第一部分,您可以使用nmap,只要您能以某种方式限制范围,根据您的评论,这应该已经为您提供了所需的主机:

    sudo nmap -PR -sn 192.168.0-255.0-255 -e <interface-to-test>
    

    你所要求的是不可能的

    最初,您有一个没有IP地址的接口。因此,您发送的任何数据包都不知道将应答发送到哪里(因此ICMP或ARP请求将不起作用)

    由于发送方不知道如何到达该接口,您可以在该接口上监听任何广播ARP请求(使用tcpdump、wireshark等),这将显示网络中正在解析的IP地址,但它不会提供网络掩码(因此也不会提供网络地址)。此外,它不仅为您提供直接连接的邻居的IP地址,还将为您提供在该广播域中发出的所有ARP请求(因此您可能会看到许多IP地址)

    现在,对于确定设备正在使用的网络掩码,在使用CIDR时是不可能的(前缀可以是/16和/32之间的任何位置,并且无法确切知道相邻设备正在使用哪一个。)

    也就是说,您可能需要查看链路本地IPv4地址。在Linux上,有一个名为AVAHI的程序,在Windows上称为APIPA。两者都实现RFC 3927:


    链路本地地址只能用于与同一物理或逻辑链路上的设备通信,因此如果您确实希望此设备位于同一子网,则必须手动配置接口。

    DHCP可用吗?这是处理IP设置动态分配的正确方法。既然您愿意编译和安装自定义解决方案,我会考虑安装DHCP。设备是否响应ICMP网络掩码请求?另一端的设备配置为使用静态IP地址,即使我们提供此服务,也不会使用DHCP“设备是否响应ICMP网络掩码请求?”谁知道呢,你能告诉我怎么测试吗?它也是Linux机器。啊,那么它可能不是。那么,您想将此设备直接连接到您的计算机并查找其网络配置吗?您知道它是否在某个范围内,例如192.168.0.0?当接口上还没有IP地址时,nmap将无法工作。此外,您的掩码检测算法不起作用。它将返回您可以为其分配地址的最大掩码,但这并不意味着您与相邻设备具有相同的掩码。@will c。关键是有一个已配置但未知的地址。我的算法与分配无关:S,它唯一的缺陷是目标主机可能从传入的icmp中学习Mac,而根本不进行ARP,但在这种情况下,您只需更改触发器以检测到另一个ip(即默认gw)的数据包。目标机上有一个已配置但未知的地址,但源计算机上没有IP地址。如果源计算机上没有IP地址,则无法在其上使用nmap,所有ARP回复将在目标计算机上删除。当我说分配时,我只是指从块中获取一个IP地址并将其放在源接口上。@WillC。你是对的,我以为当在你的子网外强制PR时nmap会退回给爸爸,但事实并非如此,我会用我自己的脚本更新。顺便说一下,这个算法确实有效,我在这里实现并验证了一点。不过我还是不明白你对我的算法的看法。分配只是其中的一部分(我包括在内),实际重要的是检查目标主机的ARP行为。主机将为其子网中的某个对象进行ARP,而不会为其子网以外的对象进行ARP,或者为其默认的gw进行ARP。测试机器在其控制下,他始终可以使用某些地址对其进行配置。但是ARP可以在没有配置地址的情况下完成(DAD模式),更重要的是,在您实际应用地址之前,建议您先执行此步骤。没有其他设备和可能的其他ip,问题清楚地表明这是一个点对点链接。在我的回答中,我提供了一个算法来检测工作正常的网络掩码(已测试)。我同意,我在更广泛的意义上思考这个问题(多个设备,多个子网,共享同一冲突域)。我仍然认为使用链接本地地址是解决这个问题的一个更简单的方法。
    from __future__ import print_function, absolute_import, unicode_literals
    from scapy.base_classes import Net
    from scapy.config import conf
    from scapy.layers.inet import Ether, ARP, ICMP, IP
    from scapy.sendrecv import srp, debug
    import scapy.route
    
    iface = b'eth0'
    subnet_to_test = b'192.168.1.0/24'
    #or:
    subnet_to_test = b'192.168.1.*'
    
    #IP/MAC discovery
    pkt = Ether(dst=b'ff:ff:ff:ff:ff:ff') / ARP(psrc=b'0.0.0.0', pdst=subnet_to_test, hwdst=b'ff:ff:ff:ff:ff:ff')
    responses = srp(pkt, timeout=1, retry=0, verbose=0, iface=iface)
    for r in responses[0]:
        found = r[1].getfieldval('psrc')
        foundmac = r[1].getfieldval('hwsrc')
    
    n = 29
    conf.debug_match = 1
    while n > -1:
        net = Net("{}/{}".format(found, n))
        my_src = net.choice()
        while my_src in Net("{}/{}".format(found, n + 1)):
            my_src = net.choice()
        pkt = Ether(dst=foundmac) / IP(dst=found, src=my_src) / ICMP(type=8)
        resp = srp(pkt, timeout=1, retry=0, verbose=0, iface=iface, filter=b'ether dst FF:FF:FF:FF:FF:FF and arp')
        received = [x for x in debug.recv if x.haslayer(ARP) and x.getfieldval('pdst') == my_src]
        received.extend(x[1] for x in resp[0] if x[1].haslayer(ARP) and x[1].getfieldval('pdst') == my_src)
        if len(received) == 0:
            print("Found host: {}/{} on mac {}".format(found, n + 1, foundmac))
            break
        n -= 1