【问题标题】:Libnet vs Raw Sockets for packet injection用于数据包注入的 Libnet 与原始套接字
【发布时间】:2012-06-02 04:20:34
【问题描述】:

我需要更多有经验的网络程序员关于 GNU/Linux 系统上的数据包注入的一些意见/建议。我正在开发一个用于数据包注入和嗅探的开源 C++ 库。图书馆是libcrafter。页面上有一些示例可以了解该库的工作原理。

我有一个两难的选择,很感激你的想法。目前,库“提供”两种在线写入数据包的方法。首先,构造数据包:

Packet pck = IP()/UDP()/DNS();

1) 然后使用 Send() 函数发送:

pck.Send("eth0");

2) 或者使用 RawSocketSend() 函数(这是我用于基准测试但可供用户使用的“实验性”函数):

pck.RawSocketSend(sd);

其中 sd 是一个套接字描述符。如果数据包具有链路层协议(如以太网),则 sd 应该是 PACKET 套接字描述符。如果不是,应该是 RAW 套接字描述符。

发送数据包的标准和记录方法是使用 Send() 方法。目前,Send() 方法使用libnet 将数据包写入网络。

问题是 Send() 函数远比 RawSocketSend() 慢...我经常不得不做很多棘手和烦人的事情来调整 libcrafter 处理协议字段的方式以正确使用libnet_build* 函数(这会导致性能下降)。每次我实现一个协议时,我都必须查看 libnet 文档,这使得开发过程非常乏味和缓慢。所以,我想停止使用 libnet 进行数据包注入,而直接在 Send() 函数中使用 RAW/PACKET 套接字。

Libcrafter 旨在以透明的方式为用户处理所有繁琐的数据包制作工作(校验和计算、字节排序、标头长度等)。在使用 RAW/PACKET 套接字(RawSocketSend 函数)的最流行的 GNU/Linux 系统(Ubuntu、Fedora、Debian)上一切正常。

我使用 libnet 的唯一原因是出于可移植性问题。但是我没有将 libcrafter 移植到其他系统而不是 GNU/Linux 系统的知识或意图。

我的问题是:

  1. 在 GNU/Linux 的数据包注入库中使用 RAW/PACKET 套接字是否谨慎且安全?
  2. 如果我决定停止使用 libnet,您是否知道关于 GNU/Linux 发行版之间的 RAW/PACKET 套接字的可移植性我应该考虑的一些问题?
  3. RAW/PACKET 套接字接口可能会在未来的内核版本中发生变化?

非常感谢:-)

【问题讨论】:

    标签: c++ network-programming raw-sockets libnet packet-injection


    【解决方案1】:

    开源的美妙之处在于您实际上可以浏览源代码,所以我检查了: http://code.google.com/p/libcrafter/source/browse/libcrafter/crafter/Packet.cpp

    并且看到 Packet::send 效率不高:它执行了太多系统调用(每次都将设备名称与实际接口匹配)并调用 libnet 函数,我猜它每次都会打开一个套接字并发送数据包。无论如何,发送数据包的开销太大。

    原始发送,我没有看到函数代码,但我猜它只是使用send()。如果我是你,如果我对 sendRawPacket() 函数不满意,我会简单地使用行套接字发送它,我已经看到该数据包提供了 getRawBuffer() 函数。

    有关原始套接字的更多信息: http://www.tenouk.com/Module43a.html 并尝试谷歌。

    对于你的问题:

    1) 我不明白您所说的“安全”是什么意思?一般的答案是“是的,小心”

    2) 关于可移植性,使用原始套接字是 POSIX 标准的一部分,因此它适用于任何 linux dist,也可能适用于 windows。我不知道 libcraft 是否可以移植到 Windows,但它应该可以在任何 linux dist 上运行。如果没有,您可以为库做出贡献并使其可移植。

    3) 我无法回答有关未来的问题。再说一遍,这是 POSIX 标准,现在很多年都没有太大变化,将来可能会改变。我不是先知,但我认为在不久的将来它不会改变。

    男人

    【讨论】:

    • 谢谢你的回答,我不知道从问题中是否清楚,但我是libcrafter的开发者,而不是用户。出于性能原因,我想要做的是更改下一个版本的发送功能以写入原始套接字而不是使用 libnet...我的开发系统是 Ubuntu,并且“安全”我的意思是如果我可以安全地假设在 ubuntu 中运行良好的东西(字节排序、使用 setsockopt 时的行为等)在其他发行版中也会这样做。正如您所说,如果其他系统符合 POSIX,那么一切都应该没问题,对吧?
    • 是的,由于以上都是系统调用,实际过程是在内核级别完成的。由于它支持 POSIX,因此不应更改。无论如何,您可以随时检查其他 dist。在虚拟机中 - 检查 Linux KVM
    猜你喜欢
    • 1970-01-01
    • 2011-05-10
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    • 2010-09-17
    • 1970-01-01
    相关资源
    最近更新 更多