如何发现网络中机器的 MAC 地址?
我需要发现仅安装了 BIOS(没有操作系统)的可用机器。
我需要找到已启动的机器的 MAC 地址。
答案1
您必须访问托管交换机上可用的信息。如果您拥有非托管网络,我认为没有办法做到这一点。
这是假设目标计算机能够网络唤醒(WoL)。在这种情况下,与服务器的链接已建立(查看闪烁的链接 LED),网卡正在监听 WoL 广播。据我所知,该卡在此状态下不会对任何内容做出响应。如果没有 WoL,则该卡很可能已关闭(没有链接 LED),并且根本无法工作。
答案2
如果机器没有通电,这是不可能的。
如果它们通电了,我猜这也是不可能的,因为你需要一个最小的网络堆栈来至少回答诸如 ARP 查询等问题,而如果没有安装操作系统,这根本无法工作。
可能有效的方法是(我不知道,现在无法测试)当 NIC 插入或通电时,NIC 和交换机进行通信,交换机通过这种方式学习 MAC 地址。如果是这种情况,您需要一个可管理的交换机并查询连接的 MAC 地址。
答案3
您可以使用网络地图使用以下语法进行非常快速的 ARP 扫描。
nmap -sn -PR -oX nmap.xml 192.168.1.0/24
这使用 ARP ping(仅 ARP 请求,没有 ICMP、UDP 或 TCP,没有端口扫描)来扫描指定的 IP 地址范围并将 IP 地址/MAC 地址/主机名响应记录在 XML 文件(nmap.xml)中。
我写了一个电源外壳脚本会处理 XML 文件并输出CSV文件。这还会过滤掉已关闭的主机。我发现在 Excel 中使用它比在 XML 文件中更容易。如果有人感兴趣的话,这里是脚本。
# Define nmap input file
$NmapXMLFile = ".\nmap.xml"
# Initialize object array
$HostItems = @()
# Initialize index
$x = 0
# Load XML
[xml]$NmapXML = Get-Content $NmapXMLFile
# Loop through XML
ForEach ($HostNode in $NmapXML.nmaprun.host) {
# Check host status
If ($HostNode.status.state -eq "up") {
# Create host object
$HostObj = "" | Select-Object ID, Hostname, 'IP Address', 'MAC Address', Vendor
# Store ID and increment index
$HostObj.ID = $x += 1
# Store hostname
$HostObj.Hostname = $HostNode.hostnames.hostname.name
# Loop through addresses
foreach ($HostAddress in $HostNode.address) {
# Check IP address
If ($HostAddress.addrtype -eq "ipv4") {
# Store IP address
$HostObj.'IP Address' = $HostAddress.addr
}
# Check MAC address
If ($HostAddress.addrtype -eq "mac") {
# Store MAC address
$HostObj.'MAC Address' = $HostAddress.addr
# Store vendor
$HostObj.Vendor = $HostAddress.vendor
}
}
# Append host object to array
$HostItems += $HostObj
}
}
# Print host items
$HostItems
# Export host items to CSV
$HostItems | Export-CSV -NoType .\nmap.csv
答案4
- 如果交换机足够先进,请查看交换机/路由器上的信息。
(在思科交换机中命令是show mac-address-table
)。 - 如果机器具有启用 PXE 的 BIOS/网卡,请从 DHCP 日志中读取信息,因为它们将尝试获取 DHCP 租约。如果您没有 DHCP,只需使用 Wireshark 转储所有广播流量并过滤 DHCP 流量。所有新启动的没有操作系统的机器都会显示在流量中。