生のイーサネットパケットをユーザー空間プログラムとしてキャプチャしようとしています。カーネルの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で転送されるパケットのみを取得します。
既存のインターフェイスから生のパケットをキャプチャするには、次の点を確認してください。生ソケットそしてパケットソケット。