FreeBSD 11 não mostrando pacotes RX, TX e contagens

4

Estou tendo um sistema FreeBSD 11 no qual recebo a seguinte saída para o comando 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

Duas dúvidas aqui:

  1. Por que eu não estou recebendo RX, TX bytes e contagem de pacotes como eu recebo para sistemas FreeBSD / Ubuntu? Eu estou usando um utilitário que analisa essa resposta para obter o uso da rede e está falhando (não pode modificar, é um binário de terceiros).
  2. Alguma mudança no FreeBSD 11 porque funcionou bem em versões mais antigas? Estou mais interessado em corrigir isso ou fazer uma alteração de configuração (se isso estiver sendo controlado por algum arquivo .conf ) em vez de alterar meu método de monitoramento (por exemplo, analisando a resposta de iftop ou algum outro comando)

Obrigado antecipadamente!

Editar Especificamente, uma biblioteca C está sendo usada nesse binário para obter estatísticas que estão saindo para zero. Eu estou anexando um código de amostra que também está retornando valores zero para bytes rx / tx porque essa informação não está disponível. Ele usa a função getifaddrs da biblioteca 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;
}
    
por Gagan93 03.03.2017 / 12:36

1 resposta

4

Para responder à sua pergunta, devo dizer que, tanto quanto me lembro, o FreeBSD - e também o macOS - nunca exibiu RX / TX Packets como uma saída do comando ifconfig . Mas se você disser que estava disponível em 7.xe 8.x, devo dizer que pelo menos em 10 e 11 não é, talvez eu não tenha percebido a hora para 7.x 8.x. De fato, Distribuições Linux incluindo derivados RHEL (RHEL, Fedora, CentOS, Scientific, etc.), sistemas operacionais baseados em Debian (Ubuntu, Debian Jessie, etc.) e a maioria das outras distribuições mostram pacotes RX / TX via ifconfig , mas FreeBSD e macOS não o fazem. Muitos dos comandos do FreeBSD não têm nada a ver com comandos no Linux, muitos deles são chamados da mesma maneira, mas na verdade, agem de forma diferente em muitos casos. Enquanto isso, o seu struct if_data não parece muito familiar - e correto - para mim, eu recomendo que você dê uma olhada em <net/if.h> . Em outras palavras, exclua seu if_data e tente incluir o cabeçalho preciso.

De qualquer forma, para exibir o número de bytes de entrada / saída no FreeBSD, você deve usar netstat . O seguinte comando funciona bem no FreeBSD e no macOS:

netstat -idb [interface]

-i : interface
-d : show the number of dropped packets
-b : show the number of packets in and out

Você também pode usar -B se precisar. Ele mostra estatísticas sobre o peer bpf (). Isso inclui informações como quantos pacotes foram correspondidos, descartados e recebidos pelo dispositivo he bpf, também informações sobre o tamanho atual do buffer e as estatísticas do dispositivo.

A propósito, para monitorar o tráfego de rede, você tem outra opção que eu recomendo. Você pode usar systat com a opção -ifstat para obter taxa de transferência de tráfego, pico e total de suas interfaces:

systat -ifstat
    
por 07.03.2017 / 13:36