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连接可用时被停用。在微软开发了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定义了几种不同类型的节点：
IPv6地址.
每个Teredo客户端被分配一个公共IPv6地址，其构造如下（高阶位编号为0）：
"Teredo IPv6地址表"
举例来说，IPv6地址2001:0000:4136:e378:8000:63bf:3fff:fdd2就是通过一个Teredo中继：
"Teredo IPv6示例表"
服务器.
Teredo客户端使用Teredo服务器通过简化的类STUN“鉴别流程”检测客户端是否在任何类型的NAT后面。Teredo客户端也通过定期发送UDP数据包来维护其NAT上对其Teredo服务器的绑定，这样确保服务器始终可以联系到其客户端——正常工作的必要条件。
如果一个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服务器：
中继.
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。
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目前有多种实现可用：
名称由来.
Teredo隧道协议的最初昵称为shipworm（船蛆）。该想法来自该协议将穿过NAT设备，很像船虫穿过木头上的隧道。Shipworms是造成很多木壳船损坏的成因，但Christian Huitema在原始草案中指出：“该种动物只在相对干净且未受污染的水中生存，它最近在几个北美港口的复出也证明这与清洁相关。与此类似，通过穿透NAT，该服务将有助于达到新的互联网透明度。”
Christian Huitema后将名称改为Teredo以避免将它与电脑蠕虫混淆。Teredo navalis（船蛆）是一种著名的船虫种类的拉丁名。