我有一个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
答案 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替换会更快。