2014-04-18 134 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