對於您可以nmap的使用,只要你能以某種方式限制範圍,如您的評論本已應該給你的主機,你要第一部分:基於ARP
sudo nmap -PR -sn 192.168.0-255.0-255 -e <interface-to-test>
這確實發現和如果成功的話可以通過一次額外的ICMP查找活力。這一次在一個沒有活躍的本地主機和5個有4個活動主機的系列上花了我大約一秒鐘的時間。因此,您甚至可以將其擴展到更大的範圍,但是除非您有一兩天的時間,否則不會包含完整的IPv4地址空間。在這種情況下,我只需連接wireshark或tcpdump並等待無償ARP。
編輯:爲此,您必須在要測試的子網中使用IP配置「源計算機」。我認爲在離開子網時或者沒有配置IP時,它會使用ARP的DAD模式,但它不會做任何事情。我爲下面的算法寫了一個更通用的版本,但是比簡單地使用nmap獲得這個結果要慢一些。
檢測配置的網絡掩碼有點棘手。但我認爲這個過程是可行的,主要思想是主機將發送一個ARP請求給其子網中的主機,並且不發送任何ARP請求或者其默認gw的ARP請求給不在其子網中的主機。
- 從第二個到最小的子網
N=29
開始。
- 從該主機的IP和子網掩碼
N
組成的子網中選取IP X
。確保選取的IP不是主機的IP而不是網絡/廣播。還要確保這個IP不是由主機的IP和掩碼N+1
組成的子網的一部分。
- 平安其他主機與源
X
(你不介意它回答,只是發出一個請求)
- 如果你看到
X
一個ARP請求,一個減少N
。請返回2
- 如果您沒有看到
X
的ARP請求,N+1
是搜索到的子網。
一個缺陷可能是過度的網絡堆棧實現可能會從傳入的ICMP請求中學習MAC,但我個人不知道任何以這種方式工作的終端設備堆棧。
我不知道是否有工具可以爲你做這件事,但應該很容易用ping,tcpdump和子網計算器手動執行;)。或者如果你覺得受到一些黑客攻擊,可能沒有太多的工作來實現這scapy
我一起寫了一個完整的python scapy腳本我應該工作,我測試它在我的家庭網絡上的linksys homegw ,另一個linux機器和一個android設備:
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
DHCP是否可用?這是處理IP設置的動態分配的正確方法。既然你願意編譯和安裝一個自定義的解決方案,我會考慮安裝DHCP。 –
設備是否響應ICMP網絡掩碼請求? – Keith
另一端的設備配置爲使用靜態IP地址,即使我們提供此服務也不會使用DHCP – h22