6

Linux::TunTap 経由でパケットをユーザー空間に読み込む perl スクリプトを作成しましたが、すべて正常に動作しているようです。

#!/usr/bin/perl
use warnings;
use strict;
use Linux::TunTap;

$tun = new Linux::TunTap(NAME => 'localtun')
or die "Couldn't connect to IF\n";

while (my $packet = $tun->get_raw()) {
        print Dumper($packet);
}

問題は、tuntap デバイスから読み込まれた生の IP パケットを表す文字列を、処理のために適切なデータ構造に変換するにはどうすればよいかということです。特に、送信元、送信先、およびシーケンス番号が気になります。

明らかに、生の IP パケットは、元の形式では人間が判読できるものではありません。tuntap インターフェイスを介して ping を送信した後の出力は次のとおりです。

{{{�}/��8V�| !"#$%&'()*+,-./0123456ET��@@4

このデータをプログラムで処理できるようにするには、ここからどのように進めればよいですか?

4

1 に答える 1

5

SteffenUlrichによるコメントに基づいて、NetPacket::IPを調べました。これは、そのdecode()メソッドを通じてトリックを実行しました。私のコードに焼き付けた後、箱から出してすぐに機能しましたが、唯一の注意点は、最初の 4 バイトは生データから取得する必要があることです (以下の遅延正規表現を参照)。これらのバイトは、TunTap によって追加された追加のヘッダーを形成するためです。層。

私のコードは次のようになり、意図したとおりに動作します。

#!/usr/bin/perl
use warnings;
use strict;
use Linux::TunTap;
use NetPacket::IP;

$tun = new Linux::TunTap(NAME => 'localtun')
or die "Couldn't connect to IF\n";

while (my $rawdata = $tun->get_raw()) {
        $rawdata =~ s/^....//;  # Using regex to strip 4 bytes, because I'm lazy 
        my $packet = NetPacket::IP->decode($rawdata);
        print "$packet->{id} $packet->{src_ip} -> $packet->{dest_ip} $packet->{proto} $packet->{len}\n";
}

上記のコードは、シーケンス、送信元 IP、宛先 IP、プロトコル番号、およびパケット長を出力します。

于 2015-09-27T18:11:47.307 に答える