是否可以使用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堆栈,适用于原始以太网帧。
问题:
提前完成。
PS:我要在同一台机器上运行所有这些。 “Box”更像是流程或设置或流程。答案 0 :(得分:1)
我不确定这是否合理。这完全取决于你想要达到的目标。
你当然可以将流量发送到顶盒上的TUN设备......但是你必须在该盒子上运行某种过程来收集通过TUN设备的流量。该过程可能是您的实际自定义TCP / IP堆栈,或者它可能是将数据包隧道传输到底盒的东西。我假设您希望它是一个隧道,因为您想在另一台机器(底部框)上运行自定义TCP / IP堆栈。在这种情况下,您甚至可能会发现在顶部框中有问题的隧道软件是有用的,例如OpenVPN。
但是,我的猜测是,您的需求更有可能通过在顶部框中运行没有隧道的标准TCP / IP堆栈来服务,并且底部框充当在真实以太网接口之间路由数据包的路由器(数据包从顶盒到达)和TUN设备。在TUN设备的用户空间端,有自定义TCP / IP堆栈。
在这两种情况下,您都不需要使用任何原始套接字或任何套接字。无论哪种方式,您的自定义TCP / IP堆栈都会从TUN设备接收帧(可能从tophost隧道传输,可能直接在bottomhost上)并将它发出的帧注入到同一个TUN设备中。