【问题标题】:How do I use raw sockets in Perl?如何在 Perl 中使用原始套接字?
【发布时间】:2010-09-16 23:17:07
【问题描述】:

如何在 Perl 中获得 原始 套接字,那么构建用于它的数据包的最佳方法是什么?

【问题讨论】:

    标签: perl networking sockets


    【解决方案1】:

    在创建套接字时设置套接字类型,与在 C 中所做的相同。

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

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

    【讨论】:

    • 您链接的页面未提及原始套接字。
    • 尝试阅读您的手册页。 Socket 模块作为 BSD 套接字之上的一个薄层,您所读到的关于它们的内容也适用于 Perl 套接字。
    • Leon 是正确的,您想要的信息在 socket() 的手册页中 - 例如任何 *nix 上的“man socket”都应该给你你想要的。
    【解决方案2】:

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

    【讨论】:

    • 这解释了常规套接字,但是我如何构建 raw 套接字并设置其参数?
    • 如果您知道自己在做什么,您应该能够使用 IO::Socket 构造函数的 socktype 和协议参数来完成。
    • 如果我知道自己在做什么,我就不会在这里了。 :)
    【解决方案3】:

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

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

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

    【讨论】:

    • 正确。我应该问什么问题?
    • 告诉我们你想做什么,而不是你想怎么做 :)
    【解决方案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】:

      看起来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;
      

      【讨论】:

      • 为什么这是您问题的答案,而不是内置的套接字操作?您是否必须选择特定的 NIC 或其他东西?
      • 我在寻找示例代码——例如,“这是您设置源 IP 的方式。这是您设置特定 TCP 标志的方式。”其他帖子都没有回答这个问题。他们基本上说“RTFM”
      【解决方案6】:

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

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

      【讨论】:

        【解决方案7】:

        请注意,如果您尝试使用原始套接字发送一堆 SYN 数据包,那么您只需“使用 Socket;”这将填满您的 ARP 表并用“没有可用的缓冲区空间”和“netstat”中的一堆“CLOSE_WAIT”条目轰炸(这会阻止您的机器进行任何类型的更多连接,直到其中一些被释放)。

        或者换句话说 - 你确实需要 Net::RawIP - 它会有所作为。

        【讨论】:

          猜你喜欢
          • 2010-11-10
          • 1970-01-01
          • 1970-01-01
          • 2021-06-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多