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

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

问题描述:

是否可以使用TUN/TAP接口测试TCP堆栈? 我想的机制是这样的:用TUN/TAP测试用户空间TCP/IP堆栈

+--------------------------------+ 
    | 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. 最后:有没有更好的方法来做到这一点?

Thanx提前。 PS:我要在同一台机器上运行所有这些程序。 '盒子'更像是过程,设定或过程。

+0

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

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

你当然可以将流量发送到机顶盒上的TUN设备中......但是你必须有某种类型的流程才能通过TUN设备收集流量。该过程可能是您的实际定制TCP/IP堆栈,或者它可能是将数据包隧道传输到底部盒子的东西。我假设你想让它成为一个隧道,因为你想在不同的机器上运行自定义TCP/IP堆栈(底部框)。在这种情况下,您甚至可能会发现,有关顶盒上的隧道软件是已经存在的内容的优势,如OpenVPN。

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

在任何情况下,您都不需要使用任何原始套接字或实际上任何套接字。无论采用哪种方式,您的自定义TCP/IP协议栈都会从TUN设备中接收帧(可能从底层主机直接传输到底层主机),并将源自它们的帧注入到同一个TUN设备中。