我需要更有经验的网络程序员关于 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 套接字接口可能会在未来的内核版本中发生变化?
非常感谢 :-)