使用perl确定IPv4数据包的源端口

时间:2015-10-10 10:15:09

标签: linux perl ip tun

我有一个perl脚本,可以从TunTap接口读取和处理IPv4数据包。剥了一下,看起来像这样:

sum(sys.getsizeof(i) for line in board for i in line)

出于路由原因,我需要知道数据的源端口。我还没有找到一种方法#!/usr/bin/perl use warnings; use strict; use Common; use Linux::TunTap; use NetPacket::IP; use IO::Socket; $|++; ###### Predecs ##### my $tun; my %config = Loadconfig(); $tun = Linux::TunTap->new(NAME => $config{'localtun_name'}) or die "Couldn't connect to Interface $config{localtun_name}\n"; print "Interface up: " . $tun->{interface} . "\n"; while (my $rawdata = $tun->get_raw()) { $rawdata =~ s/^....//; # Strip the TunTap header my $packet = NetPacket::IP->decode($rawdata); print "$packet->{id} $packet->{src_ip} -> $packet->{dest_ip} $packet->{proto} $packet->{len}\n"; # Do some processing here } ,所以有不同的方法来确定这个吗?我目前只使用NetPacket::IP作为调试原因,所以我并没有特别设置该模块,如果不同的模块允许我提取源端口以及序列号,大小,源IP和目标IP

1 个答案:

答案 0 :(得分:2)

NetPacket::IP仅处理没有端口概念的IP数据包。端口仅在TCP / UDP(或任何您在IP之上分层)层上发挥作用,因此您需要例如NetPacket::TCP获取此信息。您可能需要查看$ packet-> {proto}以确定要用于layer4解析的模块(TCP或UDP)。

如果您确定不需要更高级NetPacket模块有意义的额外标头字段,您可以利用源端口位于标头的前16位的事实对于TCP和UDP都是如此,所以你可以说

# Untested, so I'm not sure about the case returned in
# $packet->{proto}
if($packet->{proto} eq 'tcp' or $packet->{proto} eq 'udp') {
    $port = unpack('n', $packet->{data});
    ...
}

编辑:BTW,如果这是一个问题,使用substr()而不是regexp替换会更快。