TAP / TUNはICMPパケットをキャプチャします。

TAP / TUNはICMPパケットをキャプチャします。


生のイーサネットパケットをユーザー空間プログラムとしてキャプチャしようとしています。カーネルのTAP/TUN機能について読んだ後、次の設定を作成しました。
両方のシステムが直接接続されています(クロスオーバーケーブル)。私は彼らに固定IP 10.0.0.1/24と10.0.0.2/24を提供しました。 2番目のデバイスでは、私のコードが破損し、デバイスが正常
に開き(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」という名前にもかかわらず、tap / tunインターフェイスを使用してそのインターフェイスからパケットをキャプチャすることはできません。

この新しいインターフェイスにパケットをルーティングまたはブリッジできますが、まだパケットをキャプチャせず、レベル2またはレベル3で転送されるパケットのみを取得します。

既存のインターフェイスから生のパケットをキャプチャするには、次の点を確認してください。生ソケットそしてパケットソケット

おすすめ記事