返回

如何在网络上获取所有已连接设备信息?

Linux

了解你的邻居:获取网络上所有已连接设备

引言

在现代互联世界中,我们的家庭和办公室网络上连接着越来越多的设备,从智能手机到物联网小工具。了解与我们共享网络的所有设备对于网络管理、故障排除和安全至关重要。

ARP 协议

地址解析协议 (ARP) 是 IP 网络的基石。它将 IP 地址映射到物理地址(MAC 地址)。当设备想要与同一网络上的另一个设备通信时,它会广播一个 ARP 请求,包含其 IP 地址、MAC 地址和目标 IP 地址。目标设备在接收到此请求后,会回复自己的 MAC 地址。

网络扫描

我们可以利用 ARP 协议扫描网络并获取所有连接的设备。以下是如何使用 C 语言实现这一操作:

  • 创建原始套接字以监听网络流量。
  • 构建一个 ARP 请求报文,将广播地址作为目标 IP 地址。
  • 发送 ARP 请求报文到网络。
  • 接收 ARP 响应报文,并从响应中提取设备的 IP 地址和 MAC 地址。

代码示例

以下 C 代码演示了如何执行网络扫描:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <net/if.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main() {
  // 创建原始套接字
  int sockfd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
  if (sockfd == -1) {
    perror("socket");
    return EXIT_FAILURE;
  }

  // 构建 ARP 请求报文
  struct ether_arp arp_req;
  memset(&arp_req, 0, sizeof(arp_req));
  arp_req.ea_hdr.ar_hrd = htons(ARPHRD_ETHER);
  arp_req.ea_hdr.ar_pro = htons(ETH_P_IP);
  arp_req.ea_hdr.ar_hln = ETH_ALEN;
  arp_req.ea_hdr.ar_pln = 4;
  arp_req.ea_hdr.ar_op = htons(ARPOP_REQUEST);
  // 将广播地址作为目标 IP 地址
  memset(arp_req.arp_spa, 0, 4);
  memset(arp_req.arp_tpa, 0, 4);

  // 发送 ARP 请求报文
  if (send(sockfd, &arp_req, sizeof(arp_req), 0) == -1) {
    perror("send");
    close(sockfd);
    return EXIT_FAILURE;
  }

  // 接收 ARP 响应报文
  struct ether_arp arp_resp;
  while (recv(sockfd, &arp_resp, sizeof(arp_resp), 0) > 0) {
    // 检查是否是 ARP 响应报文
    if (arp_resp.ea_hdr.ar_op != htons(ARPOP_REPLY)) {
      continue;
    }

    // 获取设备 IP 地址和 MAC 地址
    char ip_addr[INET_ADDRSTRLEN];
    char mac_addr[ETH_ALEN * 3];
    inet_ntop(AF_INET, arp_resp.arp_spa, ip_addr, sizeof(ip_addr));
    sprintf(mac_addr, "%02x:%02x:%02x:%02x:%02x:%02x",
      arp_resp.arp_tha[0], arp_resp.arp_tha[1], arp_resp.arp_tha[2],
      arp_resp.arp_tha[3], arp_resp.arp_tha[4], arp_resp.arp_tha[5]);

    // 输出设备信息
    printf("%s %s\n", ip_addr, mac_addr);
  }

  close(sockfd);
  return EXIT_SUCCESS;
}

其他方法

除了 ARP 协议,还有其他方法可以获取网络中连接的设备:

  • NetworkManager API: 允许访问网络接口和已连接设备信息。
  • 第三方库: 如 scapy 和 nmap,提供广泛的网络扫描功能。
  • 命令行工具: 如 nmap 和 arp,可以通过命令行扫描网络。

结论

了解与我们连接到同一网络的所有设备对于网络管理和故障排除至关重要。通过利用 ARP 协议或其他方法,我们可以轻松识别和监视网络中的所有设备,从而确保网络的顺畅运行。

常见问题解答

1. 如何确定设备是否已连接到我的网络?

  • 使用 ARP 扫描或其他方法获取网络中所有已连接设备的列表,然后检查列表中是否有您感兴趣的设备的 IP 地址或 MAC 地址。

2. 如何阻止陌生设备连接到我的网络?

  • 使用路由器或防火墙功能,通过 MAC 地址过滤或其他安全措施来限制网络访问。

3. 为什么我的网络速度如此之慢?

  • 可能是因为连接到您网络的设备过多,正在消耗带宽。使用网络扫描工具来识别占用带宽的设备并采取措施。

4. 如何检测网络上的恶意设备?

  • 使用网络监控工具或防病毒软件来检测可疑活动或恶意软件感染。

5. 是否可以从远处扫描网络?

  • 借助端口扫描和渗透测试工具,可以在不直接连接网络的情况下远程扫描网络,但这需要更高级别的技术技能。