如何在Perl中使用原始套接字?

时间:2008-10-13 20:35:35

标签: perl networking sockets

如何在Perl中获得原始套接字,然后构建与其一起使用的数据包的最佳方法是什么?

7 个答案:

答案 0 :(得分:7)

与在C中执行的方式相同...通过在创建套接字时设置套接字类型。

CPAN上的示例中,使用 SOCK_RAW 而不是 SOCK_DGRAM (UDP)或 SOCK_STREAM (TCP)。

注意:创建原始套接字通常需要管理权限(即UNIX上的root用户)。 Windows操作系统可能已禁用创建原始套接字的功能,您只需测试并查看即可。

答案 1 :(得分:6)

也许搜索CPAN可能会有所帮助?想到IO::Socket

答案 2 :(得分:5)

起初我以为大多数先前的答案都没有回答这个问题。 经过进一步思考,我认为作者可能没有提出正确的问题。

如果您正在编写应用程序,通常不会想到“构建数据包”。你只需打开套接字,格式化数据有效负载,它就是用你的数据构建数据包的协议栈。好的,如果您正在使用数据报,则需要定义,生成和解析有效负载。但是,您通常让内核将其封装在网络级别(例如添加IP头)或链接层(例如添加以太网帧)。你通常不使用pcap。有时只需打包和打包,也许vec就足够了。

如果你正在编写一个不寻常的数据包处理器,例如主动恶意攻击工具,中间人进程或流量整形设备,那么就更有可能“构建数据包”并使用pcap 。也许Net :: Packet也适合你。

答案 3 :(得分:4)

看起来Net::RawIP就像我在寻找的那样:

use Net::RawIP;
$a = new Net::RawIP;
$a->set({ip => {saddr => 'my.target.lan',daddr => 'my.target.lan'},
         tcp => {source => 139,dest => 139,psh => 1, syn => 1}});
$a->send;

$a->ethnew("eth0");
$a->ethset(source => 'my.target.lan',dest =>'my.target.lan');      
$a->ethsend;

$p = $a->pcapinit("eth0","dst port 21",1500,30);
$f = dump_open($p,"/my/home/log");
loop $p,10,\&dump,$f;

答案 4 :(得分:4)

正如austirg和其他人所说,Socket会做得很好:

use Socket;

socket my $socket, PF_INET, SOCK_RAW, 0 or die "Couldn't create raw socket: $!";

send $socket, $message, $flags, $to or die "Couldn't send packet: $!";

my $from = recv $socket, $message, $length, $flags or die "Couldn't receive from socket: $!";

答案 5 :(得分:1)

获取套接字的基本调用是... socket()。它标配perl 5. perl 5基本上为您提供传统UNIX所做的标准socket(),bind(),listen(),accept()调用。

对于更面向对象的模型,请查看IO :: Socket。

答案 6 :(得分:0)

请注意,如果您尝试使用原始套接字发送一堆SYN数据包,而您只是“使用Socket;”这将填满你的ARP表并用“无缓冲区空间”和“netstat”中的一堆“CLOSE_WAIT”条目进行轰炸(这会阻止你的机器再做任何类型的连接,直到它们中的一些空闲)。

或换句话说 - 你真的需要Net :: RawIP - 它会有所作为。