2014-04-18 61 views
0

好吧,我在看perls套接字模块,但它似乎不支持监听接口上的所有流量......说出eth1。绑定到perl中的一个接口

我基本上做了我的核心路由器上的所有流量转储到Linux的盒子,但这不是通过IP完成。我能够使用tcpdump监视所有流量,并且可以构建一个包装器,但我宁愿perl实际监听接口并解析所有流量。有任何想法吗?

回答

1

如果你想实现某种数据包捕获系统,你不想使用普通的IP层。相反,你会想要一个PF_PACKET套接字。

为此,您可能需要使用IO::Socket::Packet。例如,引用提供的示例程序capture.pl

#!/usr/bin/perl 

use strict; 
use warnings; 

use IO::Socket::Packet; 
use Socket::Packet qw(
    PACKET_OUTGOING 
); 

my $sock = IO::Socket::Packet->new(IfIndex => 0) 
    or die "Cannot create PF_PACKET socket - $!"; 

while(my ($proto, $ifindex, $hatype, $pkttype, $addr) = $sock->recv_unpack(my $packet, 8192, 0)) { 
    my ($ts, $ts_usec) = $sock->timestamp; 
    my @ts = localtime $ts; 
    printf "[%4d/%02d/%02d %02d:%02d:%02d.%06d] ", $ts[5]+1900, $ts[4]+1, @ts[3,2,1,0], $ts_usec; 

    # Reformat nicely for printing 
    $addr = join(":", map sprintf("%02x", ord $_), split //, $addr); 

    if($pkttype == PACKET_OUTGOING) { 
     print "Sent a packet to $addr"; 
    } 
    else { 
     print "Received a packet from $addr"; 
    } 

    printf " of protocol %04x on %s:\n", $proto, $sock->ifindex2name($ifindex); 

    printf " %v02x\n", $1 while $packet =~ m/(.{1,16})/sg; 
} 
+0

这与我所寻找的相似。然而,我希望能够根据数据包的内容获得一个if /或者类型的语句。例如,如果一个数据包中包含“已知黑客内容”块$ ip,我知道如何阻止IP,并且知道要查找的各种内容类型,或者如果数据包包含“XYZ”将其记录以供将来分析,我不知道的是如何将人类可读的上下文中的所有数据包内容转换为实时运行regex的变量。我知道有些应用程序可以与我一起工作,例如snort,但是为了我的特殊目的,perl是我的选择。 – ThatGuy

+0

在这个例子中,'$ packet'具有有效载荷数据。尽管当然不要忘记它上面有完整的以太网/ IP/TCP标头,所以你也必须在那里做一些解析。 – LeoNerd

+0

好吧,看起来不错,我只需要从现在的十六进制转换,并将该值到一个变种,不应该太难,谢谢。 – ThatGuy

0

我觉得你很困惑在Perl中实现的listen()系统调用与监听网络接口的tcpdump和捕获原始TCP或UDP数据包。

在服务器中使用的listen()系统调用在您创建原始套接字并将其绑定到IP:port组合后调用。之后,accept()系统调用将为每个传入连接返回实际套接字fds。

Unix套接字接口完全提取原始TCP/UDP IP数据包。套接字接口不是你想要的。

+0

没有那个是我想要的。我需要所有的RAW数据完全像tcpdump输出它在tcpdump -ieth1 -nnA -s15000我不想听IP /端口组合。 – ThatGuy

+0

我的意思是套接字接口不是你想要的。 :-) – SzG