2013-04-16 30 views
1

是否可以使用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

回答

1

我不確定這是否合理的設計。這取決於你想要達到的目標。

你當然可以將流量發送到機頂盒上的TUN設備中......但是你必須有某種類型的流程才能通過TUN設備收集流量。該過程可能是您的實際定製TCP/IP堆棧,或者它可能是將數據包隧道傳輸到底部盒子的東西。我假設你想讓它成爲一個隧道,因爲你想在不同的機器上運行自定義TCP/IP堆棧(底部框)。在這種情況下,您甚至可能會發現,有關頂盒上的隧道軟件是已經存在的內容的優勢,如OpenVPN。

但是,我的猜測是,通過運行標準的TCP/IP協議棧,在頂部沒有隧道的情況下,您的需求更有可能被提供服務,並且底部框充當路由器,用於在真實以太網接口(數據包從頂盒到達)和TUN設備。並且在TUN設備的用戶空間末端安裝您的自定義TCP/IP堆棧。

在任何情況下,您都不需要使用任何原始套接字或實際上任何套接字。無論採用哪種方式,您的自定義TCP/IP協議棧都會從TUN設備中接收幀(可能從底層主機直接傳輸到底層主機),並將源自它們的幀注入到同一個TUN設備中。