代码之家  ›  专栏  ›  技术社区  ›  Nikolas Stephan

在不修改应用程序的情况下将数据包重定向到用户空间TCP堆栈

  •  4
  • Nikolas Stephan  · 技术社区  · 15 年前

    我使用的是基于Linux下运行的Linux栈的用户空间TCP栈。不幸的是,它要求应用程序专门调用其自己修改过的普通sockets API函数版本,然后使用libpcap获取接收到的响应数据包。

    现在我的问题是,是否有任何方法可以将数据包从应用程序重定向到此TCP堆栈,而不必修改应用程序本身。换言之,我正在寻找一种方法来截获对SocketsAPI的调用,并将它们重定向到与之相当的用户空间。

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

    2 回复  |  直到 15 年前
        1
  •  1
  •   Javier    15 年前

    两个想法(未经测试,首先谷歌他们看看是否有人做过这件事):

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

      • 设置一个 tun NET设备,让应用程序对此进行对话,并编写另一个任务,将TUN的另一端连接到用户空间TCP库。

    我想第一个更好,而且不那么脆弱。它需要一些微妙的stdlib知识,思想。此外, 设备似乎只给你IP包。

    最好的办法是搜索TCP库的其他用户,很可能已经有了某种“加载器”可以做到这一点。

        2
  •  0
  •   zhi gang    15 年前

    使用tun tap作为网桥是一个好主意,tap(而不是tun)可以为您提供完整的以太网包,包括ehternet(mac)头。这里我有一个问题要问您,您的用户空间堆栈如何处理传入的数据包。在您的帖子中,您提到它使用libpcap来获取数据包,但正如我所知,libpcap只会获取一个传入数据包的副本,然后该数据包仍然会传递到正常的内核堆栈路径,这可能不是您想要的。例如,如果它是应用程序的一个TCP数据包,它是基于用户空间TCP/IP堆栈运行的,而内核不知道它,可能只是发送一个RST数据包,它可能会中断您的正常连接。因此,我认为您的用户空间TCP/IP堆栈可能会应用一些特殊的方法来防止输入数据包被传递到内核,对吗?它是怎么做到的?