我需要更有经验的网络程序员对GNU/Linux系统上有关数据包注入的一些意见/建议。我正在开发一个用于数据包注入和嗅探的开源C++库。图书馆是libcrafter。在页面上有几个例子来看看图书馆是如何工作的。Libnet vs Raw Sockets用于数据包注入
我有一个困境,并希望你的想法。目前,图书馆“提供”两种方式在网上写封包。首先,数据包被构建:
pck.Send("eth0");
2)或使用RawSocketSend()函数(这是一个 “实验”:
Packet pck = IP()/UDP()/DNS();
1),然后与发送()函数所发送函数,我用于基准测试但可用于用户):
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 /包插座?
- 如果我决定停止使用libnet,你知道一些我应该考虑的有关GNU/Linux发行版之间RAW/PACKET套接字可移植性的问题吗?
- 未来版本的内核中RAW/PACKET套接字接口可能会改变吗?
非常感谢你:-)
谢谢你的答案,我不知道这个问题是否清楚,但我是libcrafter的开发者,而不是用户。我想要做的是改变发送函数的下一个版本,以写入原始套接字而不是使用libnet,出于性能的原因...我的开发系统是Ubuntu,而“安全”我的意思是如果我可以安全地假设在ubuntu中运行良好的东西(字节排序,使用setsockopt时的行为等)将在其他发行版中这样做。正如你所说,如果其他系统符合POSIX标准,一切都应该没问题,对吧? – LarryPel
是的,因为以上所有都是系统调用,所以实际的过程是在内核级完成的。由于它支持POSIX,所以不应该改变。 无论如何,你可以随时检查其他分区。在虚拟机中 - 检查Linux KVM –