1

是否可以使用 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 服务器,侦听已路由到 TUN 设备的 IP 地址。底部框是一个自定义 TCP/IP 堆栈,它适用于原始以太网帧。

问题:

  1. 是否可以像这样背靠背连接两个 TAP/TUN 设备?
  2. 这里需要“桥”吗?他们还怎么背靠背说话?
  3. 最后:有没有更好的方法来做到这一点?

提前谢谢。

PS:我将在同一台机器上运行所有这些。“盒子”更像是这里的过程或集合或过程。

4

1 回答 1

1

我不确定这是否是一个合理的设计。这完全取决于您要达到的目标。

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

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

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

于 2013-04-16T20:40:30.743 回答