我的一台计算机使用仅支持 IPv4 的 ISP,因此我使用 miredo 来获得 IPv6 地址。现在我需要使用 IPv6 远程访问这台计算机。(我不能在这里使用 IPv4,因为它位于 NAT I 后面,无法添加新的端口转发。)问题是我无法添加 AAAA DNS 记录,因为每次计算机连接到网络时,IP 地址的某些部分都会随机更改。
所以我的问题是:有没有办法让 Teredo 始终使用相同的 IP 地址?
答案1
Teredo IP 地址取决于以下几点维基百科。
首先,这取决于路由器的 IPv4 地址。如果 IPv4 地址发生变化,则会出现问题。
其次,这取决于 Teredo 使用的源端口,该端口可能会被 NAT 设备转换和更改。如果您的 NAT 设备确实保留了内部应用程序使用的源端口,则可能能够使其保持不变。如果您使用的是 Windows,Teredo 的“clientport”选项可能会有用。请参阅此技术网络文章。
简短回答:你可能在大多数情况下,它都能保持相同,但您的里程可能会有很大差异。很可能,您将无法获得可靠的结果,因为 NAT 设备可能会破坏您的源端口。您可以通过在防火墙上设置端口转发来阻止这种情况......但您已经无法做到这一点......所以......
更好的选择可能是设置一个动态 DNS 客户端,假设您可以找到一个将发布 teredo 接口的 IPv6 地址的客户端。
答案2
显然,自从RFC 5991,IPv6 地址的某些部分始终是随机的,以使其不可预测。
因此,对我来说最简单的解决方案是使用支持 IPv6 的动态 DNS 服务,例如 dynv6.com。
答案3
是的,使用 Teredo 协议可以实现这一点。但这需要在 Teredo 客户端和 Teredo 服务器上都修改代码。
为了解释为什么在客户端和服务器都修改之后仍然可以被视为相同的协议,我首先必须解释参与通信的其他组件是什么。
Teredo 基础知识
使用 Teredo 协议进行通信的四个关键网络节点是:
- Teredo 客户端
- Teredo 服务器(由客户端选择)
- Teredo 中继(由本地 IPv6 节点选择)
- 本地 IPv6 节点
最终,Teredo 客户端和本地 IPv6 节点需要交换 IPv6 数据包。Teredo 服务器和 Teredo 中继的存在就是为了促进这种通信。
Teredo 服务器仅参与初始连接设置。一旦建立连接,Teredo 客户端和本地 IPv6 节点之间的流量将通过中继,而 Teredo 服务器不会看到任何流量。
由于客户端无法影响 Teredo 中继的选择,因此任何需要更改中继的解决方案都行不通。幸运的是,这并不是必需的。客户端和中继之间的连接(大部分流量都发送该连接)仍将完全是标准的 Teredo 流量。
由于客户端和中继仍然使用标准 Teredo 进行通信,并且客户端在前缀中仍然具有 IPv6 地址2001::/32
,因此这仍然符合 Teredo 的条件。
需要做出改变
Teredo 地址中的 12 位是由 Teredo 客户端随机选择的。需要在客户端进行修改,以使这些位不是随机的。
Teredo 地址中的 48 位是 Teredo 服务器所见的 Teredo 客户端的 IPv4 地址和 UDP 端口号。
这里非常重要的一点是,这 48 位是服务器看到的端口地址。由于 NAT,客户端和中继可能认为 UDP 端口具有完全不同的地址。但客户端和中继看到的 IPv4 地址和端口号对最终的 IPv6 地址没有影响。
通常,唯一涉及的 NAT 位于 Teredo 客户端附近。但是,如果您想影响最终的 IPv6 地址,可以将 NAT 放在与 Teredo 服务器相同的机器上。如果您愿意,甚至可以将 NAT 直接构建到 Teredo 服务器中。
存在这个实现吗?
可能不会。
我之前已经实现过最多Teredo 服务器可以做到这一点。但客户端只能选择 IPv4 地址,而不能选择 UDP 端口号。我需要 UDP 端口号来区分客户端。
支持为特定用户保持 IPv4 地址和 UDP 端口静态的 Teredo 服务器需要某种方式来识别用户。协议中有一些字段可能用于此目的。但我不知道有任何实现支持识别 Teredo 客户端和 Teredo 服务器。
此外,Teredo 还存在严重的可靠性问题。该可靠性问题与 Teredo 协议的一部分有关,而我在此描述的任何修改均未涉及该部分。
Teredo 的问题
问题在于本地 IPv6 节点如何选择使用哪个 Teredo 中继。理想情况下,本地 IPv6 节点所在网络的管理员将为该网络配置 Teredo 中继(如果 NAT 用于 IPv4,则将其置于 NAT 之外)。
但许多管理员选择不部署 Teredo 中继。通常的理由是,由于 Teredo 非常不可靠,他们不需要支持它(从未意识到这种理由使 Teredo 不可靠性成为一种自我实现的预言)。
相反的情况是,来自本机 IPv6 节点的流量将通过默认路由发送到上游提供商,而上游提供商又可能将其发送给他们的上游提供商,最终流量可能会到达已决定宣布的 AS 上的公共第三方中继2001::/32
。
使用第三方中继意味着更长的网络路径,从而意味着延迟增加。这也意味着没有 SLA,并且 Teredo 中继可能没有足够的容量来处理发送给它的流量。
大多数情况下,需要使用静态 IP 地址,同时也需要一定的可靠性。由于您很少能够控制将与之通信的所有远程节点,因此您也无法控制将使用哪些 Teredo 中继。
这使得具有静态 IP 地址的 Teredo 成为一种小众产品,只针对那些愿意安装修改后的 Teredo 客户端以获取静态 IP 地址但可靠性没有保证的少数人。
答案4
隧道可能更好6in4
。它使用协议 41,不需要额外的 NAT 规则。有些代理提供免费隧道。只要您是网络上唯一使用隧道代理 IP 的人,就不会有问题。
如果您的路由器的 IP 地址不是静态的,则需要进行额外的配置,以便在 IP 地址更改时重新配置网络。这与您需要使用 DDNS 执行的操作类似。
请对您的连接使用防火墙,因为没有 NAT 保护您免受不必要的流量侵害。
6in4
Linux内置了对两者的支持6to4
。我最初使用的是 6to4,虽然可以工作,但稳定性不如我喜欢的那样。6in4
有了它,我的连接就稳定了。我一直用它来进行 NTP 连接,并通过 IPv6 获得稳定的时间源。