使用TUN / TAP测试用户空间TCP / IP堆栈

时间:2013-04-16 18:35:49

标签: networking tcp ethernet tcp-ip raw-ethernet

是否可以使用TUN / TAP接口测试TCP堆栈? 我在考虑这样一种机制:

  +--------------------------------+
  |   TCP Client / Server          |
  |  socket(AF_INET, SOCK_STREAM)  |
  | e.g. HTTP Server / Client      |
  +----------+---------------------+
             |
             |  +---------------------+
             |  |  TUN Device         |
             |  | ( kernel does TCP ) |
             |  +---------------------+
             |                       
  +------------+----------------------+
  | Linux Kernel + Forwarding Magic   |
  +-----------------------------------+
            |
            | +---------------------+
            | |TAP Device           |
            | |Raw ethernet frames  |
            | +---------------------+
            |
 +----------+----------------------+
 |  Raw  Socket API                |
 | socket(AF_PACKET, SOCK_RAW)     |
 | User mode TCP Stack over raw API|
 | a HTTP client/server over it    |
 +---------------------------------+

顶盒是(比方说)一个标准的未经修改的HTTP服务器,监听IP地址,  已经路由到TUN设备。  底部框是一个自定义TCP / IP堆栈,适用于原始以太网帧。

问题:

  1. 是否可以像这样背靠背连接两个TAP / TUN设备 ?
  2. 这里需要'桥'吗?他们怎么说话 背靠背?
  3. 最后:有更好的方法吗?
  4. 提前完成。

    PS:我要在同一台机器上运行所有这些。 “Box”更像是流程或设置或流程。

1 个答案:

答案 0 :(得分:1)

我不确定这是否合理。这完全取决于你想要达到的目标。

你当然可以将流量发送到顶盒上的TUN设备......但是你必须在该盒子上运行某种过程来收集通过TUN设备的流量。该过程可能是您的实际自定义TCP / IP堆栈,或者它可能是将数据包隧道传输到底盒的东西。我假设您希望它是一个隧道,因为您想在另一台机器(底部框)上运行自定义TCP / IP堆栈。在这种情况下,您甚至可能会发现在顶部框中有问题的隧道软件是有用的,例如OpenVPN。

但是,我的猜测是,您的需求更有可能通过在顶部框中运行没有隧道的标准TCP / IP堆栈来服务,并且底部框充当在真实以太网接口之间路由数据包的路由器(数据包从顶盒到达)和TUN设备。在TUN设备的用户空间端,有自定义TCP / IP堆栈。

在这两种情况下,您都不需要使用任何原始套接字或任何套接字。无论哪种方式,您的自定义TCP / IP堆栈都会从TUN设备接收帧(可能从tophost隧道传输,可能直接在bottomhost上)并将它发出的帧注入到同一个TUN设备中。