FreeBSD 11 未显示 RX、TX 数据包和计数

Gag*_*n93 4 freebsd ifconfig

我有一个 FreeBSD 11 系统,在其中我得到以下ifconfig命令输出

# ifconfig lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384 options=600003<RXCSUM,TXCSUM,RXCSUM_IPV6,TXCSUM_IPV6> inet6 ::1 prefixlen 128 inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1 inet 127.0.0.1 netmask 0xff000000 nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL> groups: lo xn0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 options=503<RXCSUM,TXCSUM,TSO4,LRO> ether 0e:c2:a2:36:c1:b4 inet 10.0.0.71 netmask 0xffffff00 broadcast 10.0.0.255 nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL> media: Ethernet manual status: active

这里有两个疑问:

  1. 为什么我没有像旧的 FreeBSD / ubuntu 系统那样获得 RX、TX 字节和数据包计数?我正在使用一个实用程序来解析此响应以获取网络使用情况,但它失败了(无法修改,它是第三方二进制文件)。
  2. FreeBSD 11 中的任何更改,因为它在旧版本中运行良好?我更感兴趣的是修复此问题或进行配置更改(如果这是由某个.conf文件控制的),而不是更改我的监控方法(例如,解析来自iftop或其他命令的响应)

提前致谢 !

编辑 具体而言,一个C库被在二进制用于获取被出来为零的统计信息。我附上了一个示例代码,它也为 rx/tx 字节返回零值,因为该信息不可用。它使用getifaddrs功能从sys/sockets

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <ifaddrs.h>

 struct if_data {
  unsigned char  ifi_type;
  unsigned char  ifi_physical;
  unsigned char  ifi_addrlen;
  unsigned char  ifi_hdrlen;
  unsigned char  ifi_recvquota;
  unsigned char  ifi_xmitquota;
  unsigned long  ifi_mtu;
  unsigned long  ifi_metric;
  unsigned long  ifi_baudrate;

  unsigned long  ifi_ipackets;
  unsigned long  ifi_ierrors;
  unsigned long  ifi_opackets;
  unsigned long  ifi_oerrors;
  unsigned long  ifi_collisions;
  unsigned long  ifi_ibytes;
  unsigned long  ifi_obytes;
  unsigned long  ifi_imcasts;
  unsigned long  ifi_omcasts;
  unsigned long  ifi_iqdrops;
  unsigned long  ifi_noproto;
  unsigned long  ifi_recvtiming;
  unsigned long  ifi_xmittiming;
  struct  timeval ifi_lastchange;
 };


 int main()
 {
  struct ifaddrs    *ifap, *ifa;
  struct if_data    *ifadata = NULL;
  char *dev_name;

  if (getifaddrs(&ifap) < 0) {
    printf ("returning  for null");
    return 1;
  }

  for (ifa = ifap; ifa; ifa = ifa->ifa_next) {

    if (ifa->ifa_flags & 0x01) {
      if ( ifa->ifa_addr->sa_family == AF_LINK) {
        if (ifa->ifa_data) {
          ifadata = (struct if_data *)ifa->ifa_data;
          dev_name = ifa->ifa_name;

          if (ifadata->ifi_ipackets == 0 && ifadata->ifi_opackets == 0)
          {
            printf("returning as zero for %s", dev_name);
            continue;
          }

          printf("name=%s ipkts=%ld opkts=%ld\n", dev_name,
            ifadata->ifi_ipackets, ifadata->ifi_opackets);

          printf("%lu", ifadata->ifi_ibytes);
          printf("%lu", ifadata->ifi_ipackets);
          printf("%lu",  ifadata->ifi_ierrors);
          printf("%lu", ifadata->ifi_iqdrops);
          printf("%lu", ifadata->ifi_imcasts);
          printf("%lu", ifadata->ifi_obytes);
          printf("%lu", ifadata->ifi_opackets);
          printf("%lu",  ifadata->ifi_oerrors);
        }
      }
    }
  }
  freeifaddrs(ifap);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

小智 5

为了回答您的问题,我应该说,据我所知,FreeBSD - 以及 macOS - 从未将RX/TX 数据包显示为ifconfig命令输出。但是如果你说它在 7.x 和 8.x 中可用,我应该说至少在 10 和 11 中它不是,也许我没有注意到 7.x 8.x 的时间。事实上,Linux 发行版包括 RHEL 衍生品(RHEL、Fedora、CentOS、Scientific 等)、基于 Debian 的操作系统(Ubuntu、Debian Jessie 等)和大多数其他发行版显示 RX/TX 数据包通过ifconfig,但 FreeBSD 和 macOS 确实如此不是这样。FreeBSD 的许多命令与 Linux 中的命令无关,其中许多命令只是以相同的方式调用,但实际上在许多情况下表现不同。与此同时,你的struct if_data对我来说看起来不太熟悉 - 而且是正确的 - 我建议你看看<net/if.h>. 换句话说,删除您的if_data并尝试包含准确的标题。

无论如何,要在 FreeBSD 中显示输入/输出的字节数,您应该使用netstat. 以下命令在 FreeBSD 和 macOS 上都可以正常工作:

netstat -idb [interface]

-i : interface
-d : show the number of dropped packets
-b : show the number of packets in and out
Run Code Online (Sandbox Code Playgroud)

如果需要,您也可以使用 -B。它显示有关 bpf() 对等方的统计信息。这包括诸如 bpf 设备匹配、丢弃和接收了多少数据包之类的信息,以及有关当前缓冲区大小和设备统计信息的信息。

顺便说一下,为了监控网络流量,您还有另一个我强烈推荐的选项。您可以使用systat-ifstat选项来获取接口的流量吞吐量、峰值和总数:

systat -ifstat
Run Code Online (Sandbox Code Playgroud)