繁体   English   中英

绑定到Perl中的接口

[英]Bind to an interface in perl

好的,所以我在看perls Socket模块,但是它似乎不支持侦听接口上的所有流量...说eth1。

我基本上是将核心路由器上的所有流量都转储到linux机器上,但这不是通过ip完成的。 我可以使用tcpdump监视所有流量,并可以围绕它构建包装器,但是我宁愿perl实际在接口上侦听并解析所有流量。 有任何想法吗?

如果要实现某种数据包捕获系统,则不希望使用常规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;
}

我认为您正在将同样在Perl中实现的listen()系统调用与tcpdump在网络接口上进行侦听并捕获原始TCP或UDP数据包相混淆。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM