【发布时间】: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 系统的知识或意图。
我的问题是:
- 在 GNU/Linux 的数据包注入库中使用 RAW/PACKET 套接字是否谨慎且安全?
- 如果我决定停止使用 libnet,您是否知道关于 GNU/Linux 发行版之间的 RAW/PACKET 套接字的可移植性我应该考虑的一些问题?
- RAW/PACKET 套接字接口可能会在未来的内核版本中发生变化?
非常感谢:-)
【问题讨论】:
标签: c++ network-programming raw-sockets libnet packet-injection