Я пытаюсь запустить Perl-скрипт, который я написал для выгрузки пакетов из моей сети, я использую модули Net:Pcap и netpacket.

Они отлично работают на ноутбуке моего и моего друга. но когда я портирую их на виртуальную машину на моем сервере, они вообще не запускаются ..

Может кто-нибудь помочь мне с этим, пожалуйста .. и вот мой сценарий

#!/usr/bin/perl -w
# #########################
#
use Net::PcapUtils;
use NetPacket::Ethernet qw(:strip);
use NetPacket::IP;
use NetPacket::TCP;
use NetPacket::IP qw(:strip);
use strict;
use Data::Dumper;
#use warnings;

my $interface= 'eth1';
my $snaplen= 65536;
my $filter='tcp';
my $promisc = 1;
my $timeout = 10000 ;
my $err;
my @array;
my $decval;
my $roomnum;
sub process_pkt
{
    my ($user_data,$header,$packet) = @_;

my $ip= NetPacket::IP->decode(eth_strip($packet));
    my $tcp= NetPacket::TCP->decode($ip->{data});
    my $payload = $tcp->{data}; 
    if(length($payload)==32)
    {
    for(my $decode=0;$decode<32;$decode++)
    {   
    $array[$decode] = unpack('H2',substr($payload,$decode,1));
    #$decval[$decode] = hex($array[$decode]);   
    }
    my $cardnum=$array[28].$array[27].$array[26].$array[25];
    $decval=hex($cardnum);
    my $length= scalar(@array);
    if($array[19] eq '0e'){
     $roomnum='221';
    }
    elsif($array[19] eq '0d'){
     $roomnum='220';
    }
    elsif($array[19] eq '0b'){
     $roomnum='219';
    }
    elsif($array[19] eq '0c'){
     $roomnum='218';
    }
    elsif($array[19] eq '09'){
     $roomnum='204';
    }
    else
    {
     $roomnum='unknown';
    }







    #open (MYFILE, '>>perlarray.txt');
    if($array[22] eq '0c')
        {
            print ( " Decision: Granted:".$array[22]."card number: ".$decval." room num:".$roomnum."\n");
        }
    elsif($array[22] eq '04')
    {
    print ("Decision: Denied:".$array[22]." card number: ".$decval." room num:".$roomnum."\n");
    }
    elsif($array[22] eq '0d')
    {
    print ("Decision: Locked:".$array[22]."card number: ".$decval." room num:".$roomnum."\n");
    }
    else
    {
    print ("Decision: unknown :".$array[22]."  card number: ".$decval." room num:".$roomnum."\n");
    }

#   print MYFILE ( " Data: \n".Dumper(\@array)." \n");
#   print MYFILE ( " Data: \n".Dumper(\@decval)." \n");
#   close (MYFILE);
    }
}

Net::PcapUtils::loop(\&process_pkt,
            SNAPLEN => 65536,
            PROMISC => 1,
            FILTER => 'tcp',
            FILTER => 'ip src 129.7.236.40',
            DEV => $interface, );

3 ответа3

1

Некоторые гипервизоры по умолчанию запрещают включать неразборчивый режим на сетевых картах виртуальных машин, что (в зависимости от того, что вы делаете) может помешать вашему захвату. Проверьте настройки своей виртуальной машины, чтобы убедиться, что у нее есть необходимые разрешения.

0

Попробуйте использовать strace для просмотра взаимодействия ваших программ с системой. Вы можете найти подсказки о том, что библиотека не загружается, или просто о том, что она делала непосредственно перед тем, как произошла ошибка.

Я предполагаю, что libpcap установлен?

tcpdump работает нормально?

0

Проблема заключалась в том, что интерфейсу, на котором я снимал, не был назначен IP-адрес. это была виртуальная машина в кластере, и я запрограммировал ее таким образом, что виртуальный ник настроен на захват пакетов, поступающих через порт. Админ не дал ему IP-адрес.

когда я установил случайный IP-адрес для этого интерфейса, используя

sudo ifconfig <interface> <x.x.x.x>

все работало нормально ...

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .