Teredo

**Teredo** 是一個 IPv6 轉換機制，它可為執行在 IPv4 網際網路但沒有 IPv6 網路原生連接的支援 IPv6 的主機提供完全的連通性。與其他的類似協定不同，它可以在網路位址轉換（NAT）裝置（例如家庭路由器）後完成功能。

Teredo 使用跨平台隧道協定提供 IPv6 連通性，將 IPv6 資料包封裝在 IPv4 使用者資料報協定（UDP）封包內。Teredo 路由器將這些資料報在 IPv4 網際網路上傳輸及通過 NAT 裝置。其他在 IPv6 網路上的 Teredo 節點（被稱為 Teredo 中繼，英文為 **Teredo relays**）接收封包，解開它們的封裝，以及傳遞它們。

Teredo 是一種臨時措施。在長遠的未來，所有 IPv6 主機都應該使用原生的 IPv6 連接。Teredo 應在原生 IPv6 連接可用時被停用。Christian Huitema 在微軟開發了 Teredo，並且網際網路工程任務組（IETF）將其標準化為 RFC 4380。Teredo 伺服器監聽 UDP 埠 3544。

## 目的

6to4，最常用的 IPv6 通過 IPv4 的隧道協定，但它需要隧道端點有一個公網 IPv4 位址。然而，許多主機目前通過一個或多個 NAT 裝置來連接 IPv4 網際網路，原因之一是 IPv4 位元址枯竭。在這種情況下，只有 NAT 裝置有 IPv4 位址，6to4 隧道端點必須在 NAT 裝置上被實現。出於技術或經濟原因，目前已被部署的許多 NAT 裝置無法升級為實現 6to4。

Teredo 通過在 UDP/IPv4 封包內封裝 IPv6 封包來緩解這個問題，大多數 NAT 可以正確轉發此種流量。這樣一來，NAT 後的 IPv6 感知主機可以作為 Teredo 隧道端點，即使它沒有專用的公網 IPv4 位址。實際上，一個實現 Teredo 的主機可以在沒有本地網路環境合作的條件下獲得 IPv6 連通性。

從長遠來看，所有 IPv6 主機都應該使用原生 IPv6 連接。臨時性的 Teredo 協定包含「落幕程式」規定：Teredo 實現應該提供一個方法在當 IPv6 成熟並且使用一個非脆弱的連通機制時停止 Teredo 連接的使用。根據 IETF89，微軟計劃在 2014 年上半年停用他們為 Windows 準備的 Teredo 伺服器，並鼓勵停用公共執行的 Teredo 中繼。

## 概述

　
: 有關完整解釋見外部連結中的 Teredo 概述。

Teredo 協定執行幾種功能：

1. 診斷 UDP 通過 IPv4（UDPv4）的連通性並發現當前的 NAT 種類（使用 STUN 協定的簡化版）
2. 為每個使用它的主機分配一個全域可路由的唯一 IPv6 位址
3. 將 IPv6 封包封裝在 UDPv4 資料報中以通過 IPv4 網路傳輸（包括 NAT 穿透）
4. 在 Teredo 主機與原生（或其他非 Teredo）IPv6 主機之間路由流量

### 節點類型

Teredo 定義了幾種不同類型的節點：

**Teredo 客戶端**
: 一個在 NAT 後具有 IPv4 網際網路連接的主機，並且使用 Teredo 隧道協定來存取 IPv6 網際網路。Teredo 客戶端被以 Teredo 字首 (`2001::/32`) 為開頭分配一個 IPv6 位址。

**Teredo 伺服器**
: 一個眾所周知的主機，用於初始化 Teredo 隧道的組態。Teredo 伺服器從不轉發任何客戶端的流量（除了 IPv6 ping），因此有著適度的頻寬限制（大多是每個客戶端幾百位元每秒），單台伺服器就可以支援許多客戶端。此外，Teredo 伺服器可以用完全無狀態的方式實現，因此無論支援多少客戶端，它都只占用同樣的記憶體。

**Teredo 中繼**
: Teredo 隧道的遠端。Teredo 中繼必須代表它服務的 Teredo 客戶端轉發所有資料，但 Teredo 客戶端直接到 Teredo 客戶端的交換除外。因此，一個中繼需要大量的頻寬，並且只能同時支援有限數量的客戶端。每個 Teredo 中繼服務一定範圍內的 IPv6 主機（例如單個校園 / 公司，單個網際網路服務供應商或整個運營商網路，或甚至整個 IPv6 網際網路）；它在任何 Teredo 客戶端與任何所述範圍內的主機間轉發流量。

**Teredo 特定主機中繼**
: 此種 Teredo 中繼只服務於執行它的主機。因此，它沒有特別的頻寬或路由要求。具有特定主機中繼的電腦使用 Teredo 與其他 Teredo 客戶端通信，但繼續用其主 IPv6 網路提供與其他 IPv6 網際網路的連接。

### IPv6 位址

每個 Teredo 客戶端被分配一個公共 IPv6 位址，其構造如下（高階位編號為 0）：

* 位 0 至 31 保持 Teredo 字首（2001::/32）。
* 位 32 至 63 嵌入要使用的 Teredo 伺服器的 IPv4 主位址。
* 位 64 至 79 保持一些標記位及其他位元。這 16 位元的格式為：首先是 MSB——「CRAAAAUG AAAAAAAA」。「C」位，如果 Teredo 客戶端位於一個錐形 NAT 後面則設為 1，否則為 0，但 RFC 5991 將它改為始終為 0，以避免向陌生人暴露此情況。「R」位目前未分配，應該設為 0 傳送。「U」和「G」位設為 0 以類比 MAC 位址中的「通用 / 本地」和「組 / 個人」位。前十一個「A」位為隨機值，第十二個「A」位在原 RFC 4380 規範中為 0，但在 RFC 5991 中更改為由 Teredo 客戶端選擇的隨機位，以額外保護 Teredo 避免基於 IPv6 的掃描攻擊。
* 位 80 至 95 包含混淆後的 UDP 埠號。這是 NAT 對映給 Teredo 客戶端的埠號，將所有位元翻轉。
* 位 96 至 127 包含混淆後的 IPv4 位址。這是 NAT 的公網 IPv4 位址，將所有位元翻轉。

_Teredo IPv6 位址表_

舉例來說，IPv6 位址 2001:0000:4136:e378:8000:63bf:3fff:fdd2 就是通過一個 Teredo 中繼：

* 使用位址為 65.54.227.120 的 Teredo 位址（十六進位的 4136e378）
* 在錐形 NAT 後面，並且客戶端不完全相容 RFC 5991（設定了第 64 位元）
* 很可能（99.98%）不相容 RFC 5991（12 個隨機位均為 0，在相容時的發生概率小於 0.025%）
* 使用其 NAT 對映的 40000 埠（十六進位取反（not）63bf 等於 9c40，即十進位數字 40000）
* NAT 公共 IPv4 位址 192.0.2.45（取反 3ffffdd2 等於 c000022d，這就變成了 192.0.2.45）

_Teredo IPv6 範例表_

### 伺服器

　
: 有關現有 Teredo 伺服器的列表，見外部連結中的列表。

Teredo 客戶端使用 Teredo 伺服器通過簡化的類 STUN「鑑別流程」檢測客戶端是否在任何類型的 NAT 後面。Teredo 客戶端也通過定期傳送 UDP 封包來維護其 NAT 上對其 Teredo 伺服器的繫結，這樣確保伺服器始終可以聯絡到其客戶端 ——NAT 打孔正常工作的必要條件。

如果一個 Teredo 中繼（或另一個 Teredo 客戶端）必須傳送一個 IPv6 封包到一個 Teredo 客戶端，它首先傳送一個 Teredo 氣泡（bubble）包到客戶端的 Teredo 伺服器（根據 Teredo 客戶端的 Teredo IPv6 位址推算）。然後伺服器轉發「氣泡」包到客戶端，使 Teredo 客戶端軟體了解它必須打孔到 Teredo 中繼。

Teredo 伺服器也可以將 Teredo 客戶端的 ICMPv6 包傳輸到 IPv6 網際網路。在實踐中，當一個 Teredo 客戶端想聯絡一個原生 IPv6 節點，它必須定位相應的 Teredo 中繼 —— 即公網 IPv4 和 UDP 埠號，以傳送封裝的 IPv6 包。為做到此目的，客戶端製作一個傳往 IPv6 節點的 ICMPv6 Echo 請求（ping），並經它組態的 Teredo 伺服器傳送。Teredo 伺服器解開封裝並將 ping 傳往 IPv6 網際網路，使 ping 最終抵達 IPv6 節點。IPv6 節點應該在收到 ICMPv6 Echo 回覆後按照 RFC 2460 應答。這個應答包首先被路由到最近的 Teredo 中繼，然後逐步抵達與其聯絡的 Teredo 客戶端。

維護一個 Teredo 伺服器所需的頻寬很少，因為它們不參與 IPv6 封包的實際傳送與接收。另外，它不涉及對網際網路路由協定的任何存取。Teredo 伺服器的必備條件僅有：

* 可以發出源位址屬於 Teredo 字首的 ICMPv6 封包
* 兩個不同的公網 IPv4 位址。雖然這沒有寫在官方的規範中，但微軟 Windows 客戶端期望兩個連續的位址 —— 第二個 IPv4 位址用於 NAT 檢測

公共 Teredo 伺服器：

* teredo.remlab.net/teredo-debian.remlab.net (德國)
* teredo.ngix.ne.kr (韓國)
* teredo.managemydedi.com (美國芝加哥)
* teredo.trex.fi (芬蘭)
* win8.ipv6.microsoft.com (隱藏於 Windows RT 8.1 中的 Teredo 伺服器)，Windows 7 中不存在。
* win10.ipv6.microsoft.com （Windows10 中的 Teredo 伺服器）

### 中繼

Teredo 中繼可能需要大量的網路頻寬。另外，它必須輸出（宣告）Teredo IPv6 字首（2001::/32）到其他 IPv6 主機。這樣之後，Teredo 中繼就能收到其他定址到 Teredo 客戶端的 IPv6 主機的流量，然後通過 UDP/IPv4 轉發它們。與此對應，它會收到其他通過 UDP/IPv4 定址到 IPv6 主機的 Teredo 客戶端發來的封包，將這些封包注入到 IPv6 網路。

在實踐中，網路管理員可以設定一個只服務於他們公司或校園的私有 Teredo 中繼。這可以為他們的 IPv6 網路與任何 Teredo 客戶端提供一個短途路徑。但是，在超過單個網路的規模上設定一個 Teredo 中繼需要輸出 BGP IPv6 路由到其他自治系統（AS）的能力。

不同於 6to4，連接中的兩個端點可以使用不同的中繼，在原生 IPv6 主機與一個 Teredo 客戶端之間的流量使用同一個 Teredo 中繼，即最靠近原生 IPv6 主機網路側的那個。Teredo 客戶端不能自己定位一個中繼，因為它不能自己傳送 IPv6 封包。如果它需要啟動與一個原生 IPv6 主機的連接，它首先通過 Teredo 伺服器使用客戶端的 Teredo IPv6 位址傳送一個封包到原生 IPv6 主機。原生 IPv6 主機之後照常回應客戶端的 Teredo IPv6 位址，這能使封包最終找到 Teredo 中繼，從而啟動與客戶端的連接（可能使用 Teredo 伺服器進行 NAT 打孔）。Teredo 客戶端和原生 IPv6 主角之後使用中繼進行通信，只要它們需要。此設計意味著 Teredo 伺服器與客戶端都不需要知道任何 Teredo 中繼的 IPv4 位址。它們通過全域 IPv6 路由表自動找到合適的路由，因為所有 Teredo 中繼都宣告網路 2001::/32。

　
: 有關 Teredo 和 BGP 上的近即時資訊見外部連結。

2006 年 3 月 30 日，義大利 ISP ITGate 是第一個在其 IPv6 網際網路上宣告到 2001::/32 的路由的 AS，這使 RFC 4380 相容的 Teredo 實現有望充分可用。但截至 2007 年 2 月 16 日，它已不再有效。

2009 年第一季度，IPv6 骨幹 Hurricane Electric 使用任播技術啟用了 14 個 Teredo 中繼並全域性宣告 2001::/32。這些中繼分別位於西雅圖、弗里蒙特、洛杉磯、芝加哥、達拉斯、多倫多、紐約、Ashburn、邁阿密、倫敦、巴黎、阿姆斯特丹、法蘭克福和香港。

預計大型網路業者將維護 Teredo 中繼。與 6to4 一樣，仍不清楚如果大部分網際網路主機通過基於 IPv4 的 Teredo 使用 IPv6，Teredo 將會如何擴充。雖然微軟自發布用於 Windows XP 的 Teredo 偽隧道以來執行有一組 Teredo 伺服器，但他們從未為 IPv6 網際網路整體提供 Teredo 中繼服務。

## 限制

Teredo 不相容所有 NAT 裝置。根據 RFC 3489 的術語，它支援全錐、受限和埠受限的 NAT 裝置，但不支援對稱 NAT。最初的 Shipworm 規範製作的最終版 Teredo 協定也支援對稱 NAT，但最終由於安全考慮而放棄。

台灣的國立交通大學之後提出了 SymTeredo，這增強了原有的 Teredo 協定以支援對稱 NAT，並且微軟和 Miredo 的實現實施了某些的未規定、非標準的擴充以改進對對稱 NAT 的支援。但是在對稱 NAT 後的 Teredo 客戶端與在對稱 NAT 或埠限制 NAT 後的 Teredo 客戶端的連通似乎仍然不可能。

另外，Teredo 假設兩個客戶端交換封裝的 IPv6 封包時，他們使用的對映 / 外部的 UDP 埠號與他們聯絡 Teredo 伺服器（以及建立 Teredo IPv6 位址）的埠號相同。若無此假設，兩個客戶端直接不可能建立直接通信，從而中繼不得不進行三角形路由。一個 Teredo 實現嘗試在啟動時檢測 NAT 類型，並且如果 NAT 看起來對稱，則拒絕運作。（此限制有時可以在 NAT 裝置上組態轉發規則來解決，但這需要 NAT 裝置的管理權限。）

Teredo 只能為每個隧道端點提供一個 IPv6 位址。因此，不能使用一個 Teredo 隧道連接多個主機，這不同於 6to4 和某些對等 IPv6 隧道。所有 Teredo 客戶端與 IPv6 網際網路的可用頻寬都受到 Teredo 中繼可用資源的限制，這與 6to4 等中繼沒什麼區別。

## 備選方案

6to4 需要一個公網 IPv4 位址，但為每個隧道端點提供一個較大的 48 位元 IPv6 字首，並有較低的封裝頭。對等隧道可能比 Teredo 更可靠和負責，並且提供永久 IPv6 位址通常不依賴於隧道端點的 IPv4 位址。部分對等隧道中間人（Tunnel broker）也支援 UDP 封裝以穿透 NAT（例如 AYIYA 協定可以做到）。但反過來說，對等隧道通常需要註冊。自動化工具（例如 AICCU）可以簡化使用對等隧道的流程。

## 安全事項

### 暴露

Teredo 分配全域可路由的 IPv6 位址使 NAT 裝置後的網路主機增加了攻擊面，因為如不這樣做則無法被網際網路存取。因為這樣做，Teredo 潛在地將任何啟用 IPv6 並開放埠到外部的應用程式暴露在外。Teredo 隧道的封裝可以隱蔽 IPv6 資料流量的內容，防止封包檢測乃至部分 IPv4 惡意軟體的傳播。US CERT 已發表一篇論文，論述使用 IPv6 隧道的惡意軟體風險。Teredo 也將 IPv6 棧和隧道軟體暴露給攻擊者，如果它們被發現存在任何遠端可利用的漏洞，這可能變得危險。

微軟 IPv6 棧有一個「保護等級」通訊端選項。這允許應用程式指定它們是否願意處理出自 Teredo 隧道的流量，任何非 Teredo 隧道的流量（預設設定），或者只接收本地內部網路的流量。

Teredo 協定也在封包中封裝有關隧道端點的詳細資訊。

### 防火牆、過濾和阻止

為使 Teredo 偽隧道正常工作，發出的 UDP 封包不能被過濾。此外，對這些封包的回覆（即回傳的流量）也不能被過濾。這取決於 NAT 的典型設定及其有狀態防火牆的功能。如果外發的 IPv4 UDP 流量被攔截，Teredo 隧道軟體會檢測到致命錯誤並停止。另外，如果攔截外發值 3544 埠的 UDP 流量可能會干擾 Teredo 的活動。

### 通過路由環路 DoS

在近期，一種新的使用 Teredo 隧道利用路由環路製造阻斷服務攻擊已被發現。這相對容易預防。

### 預設啟用

微軟作業系統的目前版本已啟用 IPv6 過渡技術，包括預設啟用 Teredo。如果 IPv6 未在公司網路上實現，可以通過命令列提示符、登錄檔編輯或使用組策略禁用這些過渡技術。由於微軟預設啟用，如果需要避免 IPv6 啟用狀態下的新安全威脅，管理員需要明確組態 Windows 作業系統中的和相關過渡技術。

## 實現

Teredo 目前有多種實現可用：

* Windows XP SP2 包括一個客戶端和特定主機中繼（Service Pack 1 的 Advanced Networking Pack 中也可用）。
* Windows Server 2003 有一個微軟 Beta 計劃提供的中繼和伺服器。
* Windows Vista 和 Windows 7 使用一個未指明的擴充內建了對對稱 NAT 穿透的 Teredo 支援。但是，如果只有一個本地鏈路和 Teredo 位址存在，那麼這些作業系統在 DNS A 記錄存在時不會嘗試解析 IPv6 DNS AAAA 記錄，因此會使用 IPv4。在這種情況下，只能存取明確指定的 IPv6 位址。 在此種情況下，在登錄檔 **HKEY\_LOCAL\_MACHINE\SYSTEM\CurrentControlSet\services\Dnscache\Parameters** 中添加一個 DWORD 值：**AddrConfigControl = 0** 才能使 Teredo 隧道啟用（被預設使用），達到連向 IPv6 的目的。
* Miredo 是一個適用於 Linux、\*BSD 和 Mac OS X 的客戶端、中繼和伺服器。
* ng\_teredo 是一個基於 netgraph 的適用於 FreeBSD 的中繼和伺服器，出自 LIP6 大學和 6WIND。
* NICI-Teredo 是一個適用於 Linux 核心的中繼和一個使用者級 Teredo 伺服器，由國立交通大學開發。

## 名稱由來

Teredo 隧道協定的最初暱稱為 shipworm（船蛆）。該想法來自該協定將穿過 NAT 裝置，很像船蟲穿過木頭上的隧道。Shipworms 是造成很多木殼船損壞的成因，但 Christian Huitema 在原始草案中指出：「該種動物只在相對乾淨且未受污染的水中生存，它最近在幾個北美港口的復出也證明這與清潔相關。與此類似，通過穿透 NAT，該服務將有助於達到新的網際網路透明度。」

Christian Huitema 後將名稱改為 Teredo 以避免將它與電腦蠕蟲混淆。Teredo navalis（船蛆）是一種著名的船蟲種類的拉丁名。

## 參考資料

## 外部連結

* Teredo 概述（頁面存檔備份，存於網際網路檔案館），Microsoft TechNet 提供（英文）
* 當前任播的 Teredo BGP 路由器（頁面存檔備份，存於網際網路檔案館）（英文）
* TEREDO-MNT（頁面存檔備份，存於網際網路檔案館）：通過 BGP 宣告 Teredo 字首的運營商列表（英文）
* _Teredo: Tunneling IPv6 over UDP through Network Address Translations (NATs)_. RFC 4380, C. Huitema. February 2006.（英文）
* 基於 JavaScript 的 Teredo-IP 位址計算機（頁面存檔備份，存於網際網路檔案館）（英文）