Teredo隧道
![本页使用了标题或全文手工转换](http://upload.wikimedia.org/wikipedia/commons/thumb/c/cd/Zh_conversion_icon_m.svg/35px-Zh_conversion_icon_m.svg.png)
![]() | 此条目翻译自其他语言维基百科,需要相关领域的编者协助校对翻译。 |
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协议执行几种功能:
- 诊断UDP通过IPv4(UDPv4)的连通性并发现当前的NAT种类(使用STUN协议的简化版)
- 为每个使用它的主机分配一个全局可路由的唯一IPv6地址
- 将IPv6数据包封装在UDPv4数据报中以通过IPv4网络传输(包括NAT穿透)
- 在Teredo主机与原生(或其他非Teredo)IPv6主机之间路由流量
节点类型
[编辑]Teredo定义了几种不同类型的节点:
- Teredo客户端
- 一个在NAT后具有IPv4互联网连接的主机,并且使用Teredo隧道协议来访问IPv6互联网。Teredo客户端被以Teredo前缀 (
2001::/32
) 为开头分配一个IPv6地址。[1]
- 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地址表
位 | 0 - 31 | 32 - 63 | 64 - 79 | 80 - 95 | 96 - 127 |
---|---|---|---|---|---|
长度 | 32位 | 32位 | 16位 | 16位 | 32位 |
描述 | 前缀 | Teredo 伺服器IPv4 |
标记 | 混淆的 UDP端口 |
混淆的客户端 公网IPv4 |
举例来说,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示例表
位 | 0 - 31 | 32 - 63 | 64 - 79 | 80 - 95 | 96 - 127 |
---|---|---|---|---|---|
长度 | 32位 | 32位 | 16位 | 16位 | 32位 |
描述 | 前缀 | Teredo 伺服器IPv4 |
标记 | 混淆的 UDP端口 |
混淆的客户端 公网IPv4 |
部分 | 2001:0000 | 4136:e378 | 8000 | 63bf | 3fff:fdd2 |
解码后 | 65.54.227.120 | 锥形NAT | 40000 | 192.0.2.45 |
伺服器
[编辑]- 有关现有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中继[2]并全局性宣告2001::/32。这些中继分别位于西雅图、弗里蒙特、洛杉矶、芝加哥、达拉斯、多伦多、纽约、Ashburn、迈阿密、伦敦、巴黎、阿姆斯特丹、法兰克福和香港。
预计大型网络运营商将维护Teredo中继。与6to4一样,仍不清楚如果大部分互联网主机通过基于IPv4的Teredo使用IPv6,Teredo将会如何扩展[需要解释]。虽然微软自发布用于Windows XP的Teredo伪隧道以来运行有一组Teredo伺服器,但他们从未为IPv6互联网整体提供Teredo中继服务。
限制
[编辑]Teredo不兼容所有NAT装置。根据RFC 3489的术语,它支持全锥、受限和端口受限的NAT装置,但不支持对称NAT。最初的Shipworm规范制作的最终版Teredo协议也支持对称NAT,但最终由于安全考虑而放弃。[3]
台湾的国立交通大学之后提出了SymTeredo,这增强了原有的Teredo协议以支持对称NAT,并且微软和Miredo的实现实施了某些的未规定、非标准的扩展以改进对对称NAT的支持。[4]但是在对称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恶意软件的传播。[5]US CERT已发表一篇论文,论述使用IPv6隧道的恶意软件风险。[5]Teredo也将IPv6栈和隧道软件暴露给攻击者,如果它们被发现存在任何远程可利用的漏洞,这可能变得危险。
微软IPv6栈有一个“保护等级”套接字选项。这允许应用程式指定它们是否愿意处理出自Teredo隧道的流量,任何非Teredo隧道的流量(默认设置),或者只接收本地内部网的流量。
Teredo协议也在数据包中封装有关隧道端点的详细资讯。[6]
防火墙、过滤和阻止
[编辑]为使Teredo伪隧道正常工作,发出的UDP数据包不能被过滤。此外,对这些数据包的回复(即回传的流量)也不能被过滤。这取决于NAT的典型设置及其有状态防火墙的功能。如果外发的IPv4 UDP流量被拦截,Teredo隧道软件会检测到致命错误并停止。另外,如果拦截外发值3544端口的UDP流量可能会干扰Teredo的活动。
通过路由环路DoS
[编辑]在近期,一种新的使用Teredo隧道利用路由环路制造拒绝服务攻击已被发现。这相对容易预防。[7]
默认启用
[编辑]微软操作系统的当前版本已启用IPv6过渡技术,包括默认启用Teredo。如果IPv6未在公司网络上实现,可以通过命令行提示符、注册表编辑或使用组策略禁用这些过渡技术。由于微软默认启用,如果需要避免IPv6启用状态下的新安全威胁,管理员需要明确配置Windows操作系统中的和相关过渡技术。[8]
实现
[编辑]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。[9]
- NICI-Teredo是一个适用于Linux内核的中继和一个用户级Teredo伺服器,由国立交通大学开发。[10]
名称由来
[编辑]Teredo隧道协议的最初昵称为shipworm(船蛆)。该想法来自该协议将穿过NAT装置,很像船虫穿过木头上的隧道。Shipworms是造成很多木壳船损坏的成因,但Christian Huitema在原始草案中指出:“该种动物只在相对干净且未受污染的水中生存,它最近在几个北美港口的复出也证明这与清洁相关。与此类似,通过穿透NAT,该服务将有助于达到新的互联网透明度。”
Christian Huitema后将名称改为Teredo以避免将它与电脑蠕虫混淆。[11]Teredo navalis(船蛆)是一种著名的船虫种类的拉丁名。
参考资料
[编辑]- ^ Teredo Addresses (Windows). msdn.microsoft.com. [2016-12-22]. (原始内容存档于2016-12-23) (英语).
- ^ Levy, Martin. Hurricane Electric's experience in deploying Teredo and 6to4 relays (PDF). LACNIC-XII/FLIP6 2009 Conference, Panama City, Panama. May 28, 2009 [2016-12-22]. (原始内容存档 (PDF)于2015-04-11).
- ^ Shipworm: Tunneling IPv6 over UDP through NATs. [2016-12-22]. (原始内容存档于2016-03-03).
- ^ Huang, Shiang-Ming; Wu, Quincy; Lin, Yi-Bing. Enhancing Teredo IPv6 tunneling to traverse the symmetric NAT. IEEE Communications Letters. 2006-05, 10 (5) [2023-04-18]. ISSN 1558-2558. doi:10.1109/LCOMM.2006.1633339. (原始内容存档于2019-06-29).
- ^ 5.0 5.1 Malware Tunneling in IPv6 | US-CERT. [2016-12-22]. (原始内容存档于2016-12-08).
- ^ IPv6 Tunneling Protocols: Good for Adoption, Not So Hot for Security - TrendLabs Security Intelligence Blog. 2009-10-26 [2016-12-22]. (原始内容存档于2016-10-08) (美国英语).
- ^ Gont, Fernando. Internet-Draft - Teredo routing loops - Mitigating Teredo Rooting Loop Attacks. ietf.org: 2. September 8, 2010 [2016-12-22]. (原始内容存档于2017-05-09).
- ^ Perschke, Susan. Hackers target IPv6. [2016-09-05]. (原始内容存档于2016-09-11).
- ^ Kabassanov, Konstantin; Jardin, Vincent.
- ^ "Solomon, Aaron".
- ^ Huitema, Christian. (ngtrans) Renaming Shipworm as Teredo?. IETF ngtrans wg mailing list. December 19, 2001.[失效链接]
外部链接
[编辑]- 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地址计算器(页面存档备份,存于互联网档案馆)(英文)
|