使用Linux :: TunTap读取数据包
发布时间:2020-12-14 02:02:22 所属栏目:Linux 来源:网络整理
导读:我已经整理了一个perl脚本,通过 Linux :: TunTap将数据包读入用户空间,这一切似乎都运行良好: #!/usr/bin/perluse warnings;use strict;use Linux::TunTap;$tun = new Linux::TunTap(NAME = 'localtun')or die "Couldn't connect to IFn";while (my $packe
我已经整理了一个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); } 现在的问题是:如何将表示从tntap设备读取的原始IP数据包的字符串转换为适当的数据结构进行处理?特别是我在源,目的地和序列号之后. 显然,原始IP数据包的原始格式不是很易读.这是通过tuntap接口发送ping后的输出: {{{} / 8V | !“#$%&'()*,– ./0123456ET @@ 4 如何从此处继续以编程方式处理此数据? 解决方法
基于
SteffenUlrich的评论,我看了一下
NetPacket::IP,它通过decode()方法为我做了诀窍.将它烘焙到我的代码后,它几乎开箱即用,唯一需要注意的是前四个字节必须来自原始数据(参见下面的延迟正则表达式),因为这些字节构成了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,协议号和数据包长度. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |