使用Linux::TunTap读取数据包



我已经编写了一个perl脚本,通过Linux::TunTap将数据包读取到用户空间,并且看起来一切正常:

#!/usr/bin/perl
use warnings;
use strict;
use Linux::TunTap;
$tun = new Linux::TunTap(NAME => 'localtun')
or die "Couldn't connect to IFn";
while (my $packet = $tun->get_raw()) {
        print Dumper($packet);
}

现在的问题是:我如何将表示从tuntap设备读取的原始IP数据包的字符串转换为适当的数据结构进行处理?特别是,我在源、目的地和序列号之后。

显然,原始IP数据包在其原始格式下不是很适合人类阅读。下面是通过tuntap接口发送ping后的输出:

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

我如何从这里开始能够以编程方式处理这些数据?

根据SteffenUlrich的评论,我看了看NetPacket::IP,它通过decode()方法为我做到了这一点。在将其放入我的代码后,它几乎可以开箱即用,唯一需要注意的是,前四个字节必须来自原始数据(参见下面的lazy regex),因为这些字节形成了由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 IFn";
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、协议号和数据包长度。

最新更新