假设 Google HTTP 服务器的 IP 地址是111.111.111.111
,我的电脑在局域网内分配了这个 IP 地址。
我知道如果我访问localhost
,计算机知道它正在访问自己,并且可能不会去询问我认为的路由器/网关?
但是如果我访问网络管理员分配的局域网IP地址,与访问相比会发生localhost
什么?
它会向路由器/网关询问例如谁111.111.111.111
是谁吗?路由器可以愚弄/告诉它111.111.111.111
在 LAN 之外并告诉它出去找到它吗?更准确地说,NAT 可以将 LAN 路由111.111.111.111
到公共区域111.111.111.111
吗?
我问这个是因为我认为我的 ISP 给我一个公共 IP 作为 LAN IP 地址(不太可能我真正连接到那个公共 IP),所以我想知道我上面描述的细节以及我的要求是否可以实现.
不会。通常,操作系统会意识到它拥有目标地址,不会将数据包发送到外部任何地方。
例如,在 Linux 系统上,这是通过路由表发生的——如果您查看该
local
表,您会看到所有分配的 IP 地址都具有指向“lo”接口的 /32 路由。在 Windows 或 BSD 等其他操作系统中,该机制可能更加不透明,但最终结果是相同的。(唯一的例外是使用“jails”、“containers”、“network namespaces”或“VRFs”时——每个实例只识别自己的 IP 地址,而不识别属于其他 jails/containers 的 IP 地址。)
地址是“公共”还是“私人”并不重要。
如果它与您计算机的 IP 地址完全匹配 – 不。计算机甚至不会首先联系路由器。
如果它与您计算机的 IP 地址位于同一子网中 – 可能,但有困难。除了 NAT 之外,路由器还需要 Proxy-ARP。从理论上讲,Linux iptables 应该是可行的,但我不确定是否有任何最终用户路由器内置了该功能。
ISP 发布公共 IP 地址是正常的,那是因为 ISP 通常不发布LAN IP 地址:那是您的路由器的工作。ISP 仅为该路由器提供初始配置(并且仅当设备本身由 ISP 提供时)。当然,路由器本身从 ISP 获取地址。
提供的设备可能实际上只是一个网桥(或网桥模式下的路由器),在这种情况下接收公共 IP 地址是完全正常的。
也就是说,一些 ISP 以“借用”以前未使用的 IP 空间而闻名。例如,范围 1.0.0.0/8 多年来几乎未被使用(直到 CloudFlare 将其捡起),因此各种网络管理员有时决定将其用作标准私有地址范围的扩展。在这些情况下,最好联系客户服务并提交具体投诉,说明您无法通过重叠地址联系到某些特定服务。
(请注意,范围 100.64.0.0/10 不是公共的,恰恰相反。它是一个私有范围,意在 ISP 及其客户之间严格使用,在他们没有任何公共 IP 地址的情况下。)
您的网络管理员设置的 DNS 机制是您的计算机将使用的机制,因为路由将在它到达任何类型的外部 DNS 之前通过他们的基础设施。因此,如果您的管理员出于某种原因分配了一个他们不应该拥有的内部 IP 地址,并且该 IP 地址通常会转到外部位置 - 您的计算机将被路由到该内部系统。
虽然 ISP 有几种不同的方法来分配公共 IP 地址,但简单的答案是他们不会为您提供其他外部位置使用的 IP 地址。大多数情况下,这是由 DHCP 处理的,因此一旦公共 IP 变为非活动状态或其租约已过期,该 IP 可能会被重新分配(这是 DNS 很重要的一个很好的原因 - 特别是如果你不是一些主要的与一组静态 IP 地址合并)。
因此,以不同的方式重申:如果您的路由器告诉您的计算机
111.111.111.111
在您的 LAN 之外,您的计算机将遵循该路由,直到外部系统将其发送到111.111.111.111
(如果存在),它应该只公开分配到一个地方。有管理 IP 地址分配的标准,如果您有兴趣进一步研究,还有许多其他规则。