将数据包重定向到用户空间TCP堆栈而不修改应用程序

时间:2009-06-08 17:37:17

标签: linux tcp

我正在使用基于在Linux下运行的Linux堆栈的用户空间TCP堆栈。不幸的是,它需要应用程序专门调用它自己的正常套接字API函数的修改版本,然后只使用libpcap来获取它接收的传入数据包。

现在我的问题是,是否有任何方法可以将数据包从应用程序重定向到此TCP堆栈,而无需修改应用程序本身。换句话说,我正在寻找一种方法来拦截对套接字API的调用,并将它们重定向到等效的用户空间。

希望我或多或少清楚我的意思。

2 个答案:

答案 0 :(得分:1)

两个想法(未经测试,首先谷歌他们看看以前有人做过):

  1. 设置替换stdlib,它使用TCP lib而不是syscalls。然后使用ld.so在加载时覆盖它。

    • 设置tun网络设备,让应用程序对此进行讨论,并编写另一个将tun的另一端连接到用户空间TCP lib的任务。
  2. 我猜第一个表现更好,可能不那么脆弱。思想需要一些精致的stdlib知识。此外,tun设备似乎只为您提供IP数据包。

    您最好的选择是搜索TCP库的其他用户,很可能已经有某种“加载器”可以完全实现这一点。

答案 1 :(得分:0)

使用tuntap作为网桥是一个好主意,而tap(不是tun)可以为您提供完整的以太网数据包,包括ehternet(mac)标头。在这里,我有一个问题,您的用户空间堆栈如何处理传入的数据包。在你的帖子中,你提到它使用libpcap来获取数据包,但据我所知,libpcap只会得到传入数据包的副本,然后该数据包仍将进入正常的内核堆栈路径,这可能不是你的想。例如,如果它是您的应用程序的tcp数据包,它基于用户空间tcp / ip堆栈运行,并且内核不知道它并且可能只是发送第一个数据包,这可能会破坏您的正常连接。所以我认为你的用户空间tcp / ip栈可能会应用一些特殊的方法来防止将incomming数据包传入内核,对吧?它是如何做到的?