簡體   English   中英

通過TCP連接創建VPN

[英]Create VPN over TCP connection

我需要通過TCP連接創建一個虛擬IP網絡。 托管系統是Linux,帶有TUN / TAP內核驅動程序,很容易接收和重新注入虛擬網絡的IP數據包。

困難的部分是將接收到的IP數據包傳輸到另一個主機。 由於某些非技術原因,我只能通過TCP協議傳輸數據包,而不能通過UDP傳輸數據包。 通過UDP傳輸IP數據包很容易,但是使用TCP則很棘手,原因如下:

UDP協議不像IP一樣支持重傳/重排序。 因此,如果為每個接收到的虛擬IP數據包發送一個UDP數據包,則內核TCP / IP協議棧仍會看到虛擬IP數據包丟失/重復/重新排序(如果這些“功能”有效,則TCP / IP必須具備這些功能)丟失,虛擬網絡上的TCP連接速度將受到影響)。 如果IP數據包通過TCP傳輸,則所有必需的“功能”都將丟失,除非對其進行了模擬。

看來我必須在TCP連接上偽造某種數據包重復/丟失/重新排序,或修補內核TCP / IP協議棧。 這兩種選擇都不容易。

還有其他更簡單的解決方案嗎? 還是我只是走錯了方向? 我全是耳朵。

====更新====

我正在考慮使用原始IP套接字(可以在仍然使用TCP數據包的情況下輕松擺脫物理網絡上所有TCP重新傳輸/重新排序的內容)來傳輸接收到的虛擬網絡IP數據包。 但是,在接收主機上,我如何只接收我感興趣的數據包,並將所有其他IP數據包返回到內核TCP / IP堆棧?

首先,您不想建立基於TCP的VPN,因為最終最終將導致tcp-over-tcp。 主要問題是內部TCP和外部TCP的計時器可能會大不相同,這會對TCP會話的可靠性產生負面影響。 您可以在這里找到更長的解釋。

UDP協議不像IP一樣支持重傳/重排序。 因此,如果為每個接收到的虛擬IP數據包發送一個UDP數據包,則內核TCP / IP協議棧仍會看到虛擬IP數據包丟失/重復/重新排序(如果這些“功能”有效,則TCP / IP必須具備這些功能)丟失,虛擬網絡上的TCP連接速度將受到影響)。 如果IP數據包通過TCP傳輸,則所有必需的“功能”都將丟失,除非對其進行了模擬。

這沒有任何意義,如果您的外層使用TCP作為傳輸機制,則沒有什么可以阻止您的內層仍然使用完整的ip / tcp堆棧,包括那些功能。 它們可能會像我說的那樣發生嚴重沖突,但這並不是該功能消失或完全中斷。

似乎您實際上實際上只是想使用TCP來獲得標頭,而忽略實際的協議,這確實可以避免tcp超過tcp的問題。 但是,這又是一個非常糟糕的主意。 防火牆,NAT,DPI,tcp增強程序的流處理變得越來越普遍,如果您偽造TCP數據包,可能會使這些設備承受壓力,從而可能再次破壞您自己的連接。

因此,您應該問自己為什么不能使用UDP,以及是否沒有其他協議(標頭)可以使用,例如GRE或L2TP。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM