常规计算机的静态和公共 IP 地址



我想使用WebRTC在浏览器上做一个消息传递应用程序,但我想摆脱像STUN和TURN服务器这样的所有第三方(我也想摆脱信令服务器,但首先要做的是)。我希望用户以键值方式将他们的联系人保存在浏览器中localStorage:人名 => IP 地址。

我真的不在乎用户如何找到自己的公共 IP 地址(他们可以做一个ipconfig,因为没有 Web API 来检索它)也不在乎他们如何分发它(他们可以使用像 Messenger 这样的集中式服务将他们的公共 IP 地址提供给他们的朋友,或者他们可以使用名片上的二维码)。

但我遇到的主要问题是我希望这些公共 IP 地址是静态的,因为我不想在我的网关每次更改我的公共 IP 地址时通知我所有朋友更新他们的联系人文件。

在IPv4中,可用地址太少(只有40亿个),因此公共静态地址全部保留给网站和住宅网关。每当我想访问互联网时,我的网关都会为我的计算机打开一个特定的端口。例如,如果我的网关具有公共地址1.2.3.4,则计算机的"公共地址"将暂时1.2.3.4:3000。此过程称为 NAT。要找到一个人的"公共地址",必须向STUN服务器发送请求,该服务器将使用哪个IPv4地址和它看到的端口进行响应。但是网关会在某个时候关闭端口的连接,所以这不是我想要的公共静态地址。

但在IPv6中则不同,可能的地址数量高得离谱(2^128),因此理论上我们可以为世界上的每台计算机提供一个静态公共地址。NAT 基本上是无用的(我在这里不是在谈论防火墙)。但同样,有一个问题,在IPv6中,您有一个静态但不是公共的地址,并且您有一个或多个公共但不是静态的地址。因此,IPv4并没有真正改变任何东西,它仍然不能解决我的问题。

我有两个问题:

  • 如何为普通计算机设置公共和静态地址?我不希望我的用户干涉他们的路由器/ISP 或在他们的计算机上安装任何东西。
  • 为什么我们还没有静态和公共IPv6地址?这背后有设计选择吗?

谢谢你的帮助。

你的问题并不是一个真正的编程问题,所以我假设你需要知道这一点,因为你正在开发使用IPv6的软件。从应用的角度来看:

  1. 你不需要TURN来发现你自己的公共地址。如果没有 NAT,您的地址不会被网络更改,您的本地地址就是您的公共地址。您只需要让您的软件询问操作系统当前配置的地址是什么。

  2. 使用IPv6,通常不是网关向连接的设备提供地址。网关仅将网络前缀 (a/64) 传送到网络,并且所有设备都选择自己的地址(通常每个设备多个地址)。

DHCPv6 确实存在,但它通常不用于在设备上配置 IPv6 地址。它可以在无状态模式下用于配置域名、DNS 解析器等,但这与分配地址无关。

因此,设备在网关传达的前缀中选择自己的地址。它如何选择?

最初,设备使用其接口 MAC 地址作为后缀(使用修改后的 EUI-64 算法)。这样做的问题是,例如,如果您有一圈,您连接的在线服务可以跟踪您的设备。因为无论您连接到哪个网络,地址的最后 64 位都将包含您唯一的 MAC 地址。这样就可以跟踪您的设备从工作到家到您最喜欢的咖啡馆等。

如今,操作系统使用隐私扩展来使您的IPv6地址无法追踪。通常有一个链接到网络前缀的稳定地址,因此每次连接到同一网络时都会获得相同的地址。该地址对于对等通信很有用。

但他们走得更远。通常还有一组隐私地址,随着时间的推移(半)随机变化。您的设备可能每天甚至每小时都会生成一个新地址。这使得在线服务甚至可以确定是否有单个设备更改了其隐私地址,或者是否存在多个设备。由于此地址会随时间而变化,因此适用于短期出站连接,但对于接受入站连接则不是很有用。为此,请使用我在上一段中提到的稳定地址。

可能最困难的一点是如何向操作系统询问可用地址。看着我自己的macOS盒子,我看到:

en2: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
ether c8:e0:eb:5c:af:61
inet6 fe80::1074:8568:e447:d9e3%en2 prefixlen 64 secured scopeid 0x12
inet6 2a02:xxxx:xxxx:xxxx:3e:873f:837:1417 prefixlen 64 autoconf secured
inet6 2a02:xxxx:xxxx:xxxx:b19c:71c5:1de8:8fde prefixlen 64 autoconf temporary

您可以同时查看长期secured地址和短期temporary地址。

不知道您正在为哪种操作系统以及使用哪种编程语言开发,我无法进一步帮助您。请调整您的问题以包含该信息。

最新更新