Назад | Перейти на главную страницу

FreeBSD 11 не показывает пакеты и количество RX, TX

У меня есть система 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. Почему я не получаю байты RX, TX и количество пакетов, как в старых системах FreeBSD / ubuntu? Я использую утилиту, которая анализирует этот ответ, чтобы получить информацию об использовании сети, и она дает сбой (не может изменить, это сторонний двоичный файл).
  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;
}

Чтобы ответить на ваш вопрос, я должен сказать, что, насколько я помню, 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

Вы также можете использовать -B, если вам это нужно. Он показывает статистику о партнере bpf (). Это включает в себя такую ​​информацию, как количество пакетов, сопоставленных, отброшенных и полученных устройством bpf, а также информацию о текущем размере буфера и статистике устройства.

Кстати, для мониторинга сетевого трафика у вас есть еще один вариант, который я настоятельно рекомендую. Ты можешь использовать systat с -ifstat возможность получить пропускную способность, пиковую и общую пропускную способность ваших интерфейсов:

systat -ifstat