web-dev-qa-db-ja.com

FreeBSD 11はRX、TXパケットとカウントを表示しません

ifconfigコマンドに対して次の出力を取得するFreeBSD11システムを使用しています。

# 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

ここに2つの疑問があります:

  1. 古いFreeBSD/ubuntuシステムのようにRX、​​TXバイト、パケット数を取得できないのはなぜですか?この応答を解析してネットワークの使用状況を取得するユーティリティを使用していますが、失敗しています(変更できません。サードパーティのバイナリです)。
  2. 古いバージョンで正常に動作したため、FreeBSD 11に変更はありますか?監視方法を変更する(たとえば、iftopまたは他のコマンドからの応答を解析する)よりも、これを修正するか、構成を変更する(これが.confファイルによって制御されている場合)ことに関心があります。 )

前もって感謝します !

編集具体的には、Cライブラリがそのバイナリで使用されており、ゼロになる統計を取得しています。その情報が利用できないため、rx/txバイトにもゼロ値を返すサンプルコードを添付しています。 sys/socketsライブラリのgetifaddrs関数を使用します

#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;
}
4
Gagan93

あなたの質問に答えるために、私が覚えている限り、FreeBSD(そしてmacOS)はifconfigコマンドの出力としてRX/TXパケットを表示したことがありません。しかし、7.xと8.xで利用可能だったと言えば、少なくとも10と11では利用できなかったと言えます。おそらく、7.x8.xのその時期に気づかなかったでしょう。実際、RHEL派生物(RHEL、Fedora、CentOS、Scientificなど)、Debianベースのオペレーティングシステム(Ubuntu、Debian Jessieなど)および他のほとんどのディストリビューションを含むLinuxディストリビューションは、ifconfigを介してRX/TXパケットを表示します。 、しかし、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
5
FarazX