Router

如何在沒有 STUN 的情況下將網路數據包從 ipv4 地址(帶有埠轉發)發送到 ipv6 地址(無埠轉發)?

  • May 29, 2015

*** 我有以下情況:***

Bob 想直接與 Alice 互動(加密互動,沒有中間伺服器來轉發他的數據包)。兩者都在 NAT 之後。Alice 有一個公共 ipv6 地址和一個 ipv4 地址(在非對稱 NAT 之後)。Bob 有一個帶有 ipv4 埠轉發的 ipv4 地址,但 Alice 沒有她的 ipv4 流量的埠轉發。Bob 知道 Alice 的 ipv6 地址和她目前的 ipv4 地址,Alice 知道 Bob 的公共 ipv4 地址。Bob 想直接發起與 Alice 的網路通信,但是 Alice 的私有 ipv4 地址在 NAT 之後無法訪問。Bob 必須嘗試從 Alice 的 ipv4 地址到達 Alice 的 ipv6 地址。鮑勃怎麼能找到愛麗絲?6to4 是解決方案嗎?

*** 背景資料: ***

Alice 和 Bob 都在執行一個點對點應用程序(我正在開發該應用程序)。這個點對點應用程序在啟動時會嘗試打開 Alice 和 Bob 的 ipv4 埠。uPnP(通用即插即用)埠開放庫適用於 Bob 的路由器及其 ipv4 網際網路,但不適用於 Alice 的路由器及其雙 ipv4/ipv6 網際網路。這就是為什麼 Bob 在執行應用程序時打開了他的 ipv4 埠,而 Alice 沒有。假設 STUN 和 TURN 不可用 - Bob 想要啟動與 Alice 的直接連接,而不使用中間伺服器(STUN 或其他)來促進連接。Bob 會怎麼做呢(假設 Alice 和 Bob 都在 NAT 之後,並且他們的 NAT 都不是對稱 NAT)?

大澄清

Bob 並不是真的從 ipv6 地址發送 ipv6 數據包。Alice 的網際網路既有 ipv4 又有 ipv6(Alice 可以訪問啟用/準備好 ipv6 的網站,例如 Google,她可以訪問僅提供 ipv4 的網站)。因此,如果 Alice 在 Google 中輸入“我的 ip 是什麼”,她會得到一個 ipv6 地址(試試看)。但如果她訪問http://checkip.amazonaws.com(也試試這個 - 它沒有啟用 ipv6),她只會得到她的 ipv4 地址。我想知道 Bob 是否有可能將發往 Alice 的 ipv6 數據包與他的 ipv4 數據包(ipv6 over ipv4,或 6to4)一起包裝,作為 NAT 穿越的一種手段。

*** 我所說的“無中間人”是什麼意思?***

我的意思是沒有 TURN 轉發或任何其他形式的轉發,其中中間伺服器接收到發往 Alice 的數據包副本並將該副本轉發給 Alice。

*** 如果 Alice 有一個 ipv4 地址,並且 Bob 和 Alice 知道彼此的 ipv4 地址,為什麼 Bob 不直接從他的 ipv4 地址發送數據包到 Alice 的 ipv4 地址?***

Bob 有埠轉發,而 Alice 沒有埠轉發。即使 Alice 正在等待私有埠 30000 上的連接,當 Bob 從他的 ipv4 地址上的公共埠 30000 向 Alice 的公共埠 30000 發送一個數據包時,Alice 的 NAT 也不會讓 Bob 的數據包通過。

沒有中間人的要求可以用不同的方式來解釋。並且使用哪種確切的解釋確實會產生影響,因為某些解釋將與其他要求結合起來導致一組不可能的要求。

考慮到向每個端點提供網際網路連接的 ISP 是無法依賴的第三方,顯然過於嚴格而無法進行通信。但是,即使我們在可以依賴的基礎設施中端點之間的 IPv4 路徑上包含路由器,由於其他要求,這仍然是不可能的:

  • Bob 想要啟動連接。
  • Bob 只能發送 IPv4 數據包。
  • Bob 不知道將數據包發送到的任何 IPv4 地址。

如果我們將無中間人要求解釋為簡單地說大部分流量不得通過第三方路由,但允許第三方參與連接設置是可以接受的,那麼這是可能的。

Bob 可以通過公共 IPv4 地址向第三方發送數據包,請求將消息發送到 Alice 的 IPv6 地址,要求 Alice 通過 IPv4 連接回 Bob。在任何旨在成為未來證明的新協議設計中,我只會使用端點之間的 IPv4 連接作為隧道傳輸 IPv6 數據包的一種方式,然後讓所有更高層只處理 IPv6。

哪些 IPv6 隧道協議可能適用

讓我們考慮一下 Bob 獲取可用於批量傳輸的 IPv6 地址的以下選項:6to4、6rd、6in4、native、Teredo、home grow。

Bob 的 ISP 缺乏支持立即排除了 6rd 和本機。

沒有第三方的要求排除了 6in4,除非 Alice 和 Bob 之間直接路徑上的 ISP 之一提供 Bob 可以使用的 6in4。這樣的服務不太可能存在於直接路徑上,如果它確實需要 Bob 的更多配置,那麼我想你會願意的。

沒有第三方的要求也意味著 6to4 和 Teredo 可能存在問題。

任何使用協議 41 的東西都很難通過 NAT。即使你可以讓它通過 NAT 工作,它在大多數情況下也只能支持 NAT 後面的單個使用者。鑑於 Alice 甚至無法獲得埠轉發,我們幾乎可以排除使用協議 41 端到端。因此,6in4 和 6to4 成為可能的端到端通信。

根據協議 41 設置任何內容都需要在您配置它的端點上具有管理員權限。這是反對 6in4、6rd 和 6to4 的另一個論據。基於 UDP 的隧道可以直接建構到應用程序中,因為 UDP 埠可以由非特權應用程序打開。

在 Bob 一側使用 6to4,在 Alice 一側使用本地 IPv6 意味著必須使用中繼。由於我認為 Alice 不能發送協議 41 數據包,Alice 將不得不依賴由其他人操作的中繼。幸運的是,Alice 的 ISP 有一個中繼,但你不能依賴它。反過來也好不了多少,因為 Bob 的 ISP 根本不支持 IPv6,他們也不太可能有任何中繼。所以這種場景下的 6to4 很可能在兩個方向都有問題。這排除了 6to4。

我們從起始列表中剩下的是 Teredo 或本土產品。如果 Bob 使用 Teredo,他的第一個數據包將被發送到 Bob 選擇的 Teredo 伺服器。由於 Bob 可以選擇使用哪個 Teredo 伺服器,因此使用第三方將不是問題。如果第三方證明不可靠,Bob 可以簡單地切換到另一個。

但這僅涵蓋從 Bob 到 Alice 的第一個數據包。返迴路徑有點問題。如果您僅僅依賴預設路由,那麼來自 Alice 的返回流量將進入由 Alice 的 ISP 運營的 Teredo 中繼,或者更有可能是第三方中繼。如果 Alice 的 ISP 部署了足夠多的 Teredo 中繼來處理客戶的流量,並且他們關注中繼的穩定性,那麼 Teredo 在這種情況下是可靠的。然而,這樣的 ISP 很少見。

愛麗絲可以決定執行她自己的中繼。但是 Teredo 客戶端(在 Bob 的電腦上執行)和 Teredo 中繼(在 Alice 的電腦上執行)之間的連接通常是從客戶端打開到中繼的。那是方向,它對你不起作用。

Teredo 中有一種已棄用的操作模式,在這種模式下,可以在從中繼到客戶端的另一個方向上打開連接。

這意味著您可以將 Teredo 客戶端直接建構到您的軟體中,並在您描述的特定設置中讓它在 Bob 的電腦上使用這種不推薦使用的模式。在 Alice 的一端,您的軟體在本機 IPv6 地址上執行,但同時您的軟體必須使用這種已棄用的 Teredo 模式檢測對等點,並且在檢測到時嘗試使用直接建構到您的軟體中的 Teredo 中繼將數據包直接發送到對等點。

您必須注意的一個警告是,當來自 Bob 的第一個回應要求通過 Teredo 伺服器發送到 Alice 時,它將由 Alice 電腦上作業系統中的 IPv6 堆棧處理,而不是由您的應用程序處理。這意味著通過 Teredo 中繼將回复路由到您的軟體中會很棘手。

如果您採用這種方法,我強烈建議您編寫軟體以支持通過建構 Teredo 程式碼或通過普通路由發送數據包。並定期探測兩種發送數據包的方式,以便您始終使用這兩種方式中最可靠的一種。

有點諷刺的是,在我能想到的所有標準協議中,最符合您要求的協議恰好是 Teredo 的已棄用變體。考慮到 Teredo 通常被認為是不可靠的,更是如此。也就是說,我真的相信在你描述的確切情況下,它可以可靠地工作。

一個可能的本土解決方案

您可以選擇 RFC 4193 地址空間的 /80 前綴在您的應用程序中使用,並使用 IPv6 地址的最後 16 位嵌入隧道端點的 IPv4 地址和埠號。

使用這種方法,Bob 將擁有一個 IPv6 地址,Alice 可以將數據包發送到該地址。這種方法的問題在於,Bob 在到達來自 Alice 的第一個 IPv6 數據包之前將無法向 Alice 發送 IPv6 數據包。

同樣是本土的,沒有公共伺服器可以將這些數據包從 Bob 中繼到 Alice。所以這種特殊的本土方法就像 Teredo,只是基礎設施不足的問題會被放大。

基於此,我在想,如果你想用一個本土的解決方案,你更有可能以 Teredo 為起點並嘗試改進它,而不是從頭開始建構一個本土的解決方案。

引用自:https://serverfault.com/questions/695193