【问题标题】:testing user-space TCP/IP stack with TUN / TAP使用 TUN / TAP 测试用户空间 TCP/IP 堆栈
【发布时间】:2013-04-16 18:35:48
【问题描述】:

是否可以使用 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. 最后:有没有更好的方法来做到这一点?

提前感谢。

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

【问题讨论】:

  • 事实证明,我实际上并不需要创建两个设备。这是可以演示获取原始数据包的命令集: # socat STDOUT TUN:10.0.0.1/24,up ; # ping 10.0.0.2

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


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 2012-01-28
    • 1970-01-01
    • 2016-10-29
    相关资源
    最近更新 更多