У меня есть скрипт perl, который считывает и обрабатывает пакеты IPv4 из интерфейса TunTap. Лишенный немного вниз, это выглядит следующим образом:Определить исходный порт пакета IPv4 с perl
#!/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
, так есть ли другой способ определить это? В настоящее время я использую только NetPacket::IP
по причинам отладки, поэтому я действительно не настроен на этот модуль, в частности, если другой модуль позволит мне извлечь исходный порт в дополнение к порядковому номеру, размеру, IP-адресу источника и IP-адресу назначения.
Cheers, проверит сегодня вечером, если это сделает то, что мне нужно, и переоценить перемещение всего моего проекта слоем вниз в модели. – Jarmund
Хорошо, пошел на это. Теперь я могу извлечь src_port из других модулей («NetPacket :: TCP» и «NetPacket :: UDP»). Что касается фрагмента кода, '$ packet -> {proto}' возвращает номер протокола (6 для TCP), поэтому только небольшое изменение там, однако, получается из 'unpack ('n', $ packet -> {data }); 'отличается от того, что я получаю, выполняя' $ tcppacket -> {'src_port'} '. Есть ли вероятность, что функция распаковки используется неправильно? При тестировании на ICMP-пакете, который не должен иметь порт-источник, '' unpack() '-line yelds 2048 – Jarmund
Что именно вы получаете от' unpack() 'и' $ tcppacket -> {src_port} 'соответственно? Если вы посмотрите на 'NetPacket :: TCP :: decode()', вы обнаружите, что они делают это именно так: просто с большим количеством полей: '($ self -> {src_port}, $ self -> {dest_port} , $ self -> {seqnum}, $ self -> {acknum}, $ tmp, $ self -> {winsize}, $ self -> {cksum}, $ self -> {urg}, $ self-> {options}) = unpack ("nnNNnnnna *", $ pkt); ' То, что вы получаете фиктивное значение из ICMP-пакета, просто потому, что вы декодируете поля Type и Code, находящиеся в одном и том же месте как номер порта в TCP/UDP. – mbethke