gpt4 book ai didi

perl - 绑定(bind)到 perl 中的接口(interface)

转载 作者:行者123 更新时间:2023-12-03 12:05:24 26 4
gpt4 key购买 nike

好的,所以我正在查看 perls Socket 模块,但它似乎不支持监听接口(interface)上的所有流量......比如说 eth1。

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

最佳答案

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

为此,您可能希望使用 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 - 绑定(bind)到 perl 中的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23161193/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com