TAP/TUN 捕获 ICMP 数据包

TAP/TUN 捕获 ICMP 数据包


我正在尝试将原始以太网数据包捕获到用户空间程序中。在阅读了内核的 TAP/TUN 功能后,我继续创建了以下设置:
直接连接的两个系统(交叉电缆)。我给了他们静态 IP 10.0.0.1/24 和 10.0.0.2/24。我的代码在第二个单元上被破坏,
它成功打开设备(设置了 IFF_TAP),我可以看到 tap0 已创建,然后我开始从我得到的文件描述符中读取。此时,我正在从 10.0.0.1 向 10.0.0.2 发送 ping,虽然我认为我的代码会获取这些 ICMP 字节,但它什么也没得到。

以下是一些代码片段,基于我找到的示例:

/* Connect to the device */
  strcpy(tun_name, "tap0");
  tun_fd = tun_alloc(tun_name, IFF_TAP | IFF_NO_PI);  /* tapinterface */
  if(tun_fd < 0){
    exit(1);
  }

  /* Now read data coming from the kernel */
  while(1) {
    nread = read(tun_fd,buffer,sizeof(buffer));
    if(nread < 0) {
      close(tun_fd);
      exit(1);
    }

    /* Do whatever with the data */

  }

对 read() 的调用将永远被阻塞并且没有数据。
然而.. 如果使用 IP 地址(例如:10.0.0.3)设置 tap0,我确实会收到来自内核的大量数据包,但不会收到来自另一台机器的 ICMP 数据包,此外,这样做会导致 ping 单元接收不到响应,直到我收到响应。删除tap0,桥接真实的(eth0)和tap0也没有达到目的,我做错了什么?

谢谢,艾坦。

答案1

你的 Tap/tun 接口就像新的物理网络接口,另一端连接到特定程序。

所以没有连接到现存的物理网络接口,例如交叉电缆一端的接口。

特别是,您不能使用 tap/tun 接口以某种方式从该接口捕获数据包(尽管名称为“tap”)。

您可以将数据包路由到这个新接口,或桥接它,但它仍然不会捕获数据包;它只会获取在级别 2 或级别 3 上转发给它的数据包。

要从现有接口捕获原始数据包,请查看原始套接字数据包套接字

相关内容