gpt4 book ai didi

linux - 使用 perl 确定 IPv4 数据包的源端口

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:14:02 26 4
gpt4 key购买 nike

我有一个 perl 脚本,可以从 TunTap 接口(interface)读取和处理 IPv4 数据包。精简一点,它看起来像这样:

#!/usr/bin/perl
use warnings;
use strict;
use Common;
use Linux::TunTap;
use NetPacket::IP;
use IO::Socket;
$|++;

###### Predecs #####
my $tun;
my %config = Loadconfig();

$tun = Linux::TunTap->new(NAME => $config{'localtun_name'})
or die "Couldn't connect to Interface $config{localtun_name}\n";
print "Interface up: " . $tun->{interface} . "\n";

while (my $rawdata = $tun->get_raw()) {
$rawdata =~ s/^....//; # Strip the TunTap header
my $packet = NetPacket::IP->decode($rawdata);
print "$packet->{id} $packet->{src_ip} -> $packet->{dest_ip} $packet->{proto} $packet->{len}\n";
# Do some processing here
}

出于路由原因,我需要知道数据的源端口。我还没有找到使用 NetPacket::IP 执行此操作的方法,那么是否有不同的方法来确定这一点?我目前只使用 NetPacket::IP 出于调试原因,所以我并没有真正设置那个模块,特别是如果一个不同的模块允许我提取除了序列号、大小之外的源端口、源 IP 和目标 IP。

最佳答案

NetPacket::IP 只处理没有端口概念的 IP 数据包。端口仅在 TCP/UDP(或您在 IP 之上的任何层)层上发挥作用,因此您需要例如NetPacket::TCP 获取此信息。您可能需要查看 $packet->{proto} 来决定要使用哪个模块(TCP 或 UDP)进行 layer4 解析。

如果您确定不需要更高级别的 NetPacket 模块有意义的额外 header 字段,您可以利用源端口位于前 16 位的事实TCP 和 UDP 的 header ,所以你可以说

# Untested, so I'm not sure about the case returned in
# $packet->{proto}
if($packet->{proto} eq 'tcp' or $packet->{proto} eq 'udp') {
$port = unpack('n', $packet->{data});
...
}

编辑:顺便说一句,如果担心的话,使用 substr() 而不是正则表达式替换应该会更快。

关于linux - 使用 perl 确定 IPv4 数据包的源端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33052837/

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