当我将使用 Net:Pcap 的 perl 脚本移植到我服务器上的虚拟机上时,它们不起作用

当我将使用 Net:Pcap 的 perl 脚本移植到我服务器上的虚拟机上时,它们不起作用

我正在尝试运行我编写的 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, );

答案1

某些虚拟机管理程序默认禁止在虚拟机的 NIC 上启用混杂模式,这(取决于您正在执行的操作)可能会破坏您的捕获。请检查虚拟机的设置,以确保它具有您需要的权限。

答案2

尝试使用 strace 查看程序与系统的交互。您可能会发现有关库无法加载的提示,或者只是它在失败之前正在执行的操作。

我假设 libpcap 已经安装了?

tcpdump 工作正常吗?

答案3

问题是我捕获的接口没有分配 IP 地址。它是集群上的虚拟机,我对其进行了编程,设置虚拟网卡来捕获端口传入的数据包。管理员没有给它任何 IP 地址。

当我使用以下方式为该接口设置一个随机 IP 地址时

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

它工作得很好……

相关内容