我理解诸如10.0.0.0/8
、172.16.0.0/12
和 之类的私有地址192.168.0.0/16
是不可路由的。但是,究竟是什么阻止了这些地址的路由?ISP 是否实施了阻止这些网络路由的 ACL,还是有更高层的原因?
此外,这个设计是 IANA 创建的吗?
答案1
私有 IP 地址是可路由,尽管它们不是公开路由。基本上,路由器会将私有地址路由到私有/内部 LAN,而不是互联网。
扩展我的答案:路由器能通过其默认网关将私有地址路由到公共端。但是,由于其他路由器丢弃数据包,或者数据包的 TTL 达到 0,数据包将在传输过程中“丢失”。
例如,看一下这个(部分混淆)traceroute -I -n 192.168.200.1
:
[root@myhost ~]# traceroute -I -n 192.168.200.1
traceroute to 192.168.200.1 (192.168.200.1), 30 hops max, 60 byte packets
1 x.x.x.x 0.851 ms 0.841 ms 0.818 ms
2 6x.xx.xx.xx 0.791 ms 0.791 ms 0.849 ms
3 15x.xx.xx.xx 1.350 ms 1.347 ms 1.373 ms
4 15x.x.xx.xx 1.446 ms 1.435 ms 1.428 ms
5 151.6.68.20 2.272 ms 2.266 ms 2.251 ms
6 151.6.0.91 8.818 ms 8.256 ms 8.326 ms
7 * * *
8 * * *
9 * * *
10 * * *
...
...
29 * * *
30 * * *
如您所见,数据包是通过机器的默认网关路由到公共互联网。然而,它在传输过程中被丢弃,从未到达任何正确的目的地。
毕竟,私有 IP/类别(根据定义)在客户之间重叠,那么应该在数千个 192.168.200.x/24 网络中的哪一个上路由此数据包?
有趣的是:互联网提供商经常使用私有地址进行内部路由。例如,如果将私有 192.168.200.x/24 类用于内部路由,则第一个 IP 为 192.168.200.1 的路由器/机器将要接收但丢弃数据包,因为它是未经请求的。ICMP 是一个有趣的例外,因为路由器/机器通常会回复未经请求的 PING。这意味着您有时可以使用私有地址扫描来映射您的 ISP 私有网络。
答案2
私有 IP 地址(根据 RFC 1918)非常易于路由,但不在公共互联网上。
通常,私有 IP 地址会被 ISP 过滤。您的接入路由器也应进行配置,以免这些地址泄露。
私有 IP 地址不能在互联网上使用,因为任何人都可以使用它们。可能有数百万台设备私下使用 192.168.1.1 - 哪一个互联网路由器应该发送数据包?
零配置地址 (169.254.0.0/16) 实际上根本无法路由。这些地址可以以临时方式在任何地方使用,但它们无法访问互联网或任何子网,只能访问本地子网。它们无法路由,因为它们只能在广播域内有效,每个设备都可以自己选择一个未使用的地址。根据定义,zeroconf 没有像 DHCP 服务器那样的管理实例。
答案3
但是,究竟是什么阻止了这些地址被路由呢?
由通信实体强制执行的公认标准。这些标准在软件、硬件和配置中强制执行。
ISP 是否实施了阻止这些网络路由的 ACL,还是有更高级别的措施?
他们可以,但真正被阻止的只是不符合标准的无效翻译。
如果您和大多数家庭用户一样,那么您会分配一个 IP 地址作为公共 IP 地址。为了使所有连接设备的流量能够通信,路由器会使用 NAT(网络地址转换)或 PAT(端口地址转换)对这些内部 IP 地址进行转换。
基本上,您的路由器会记住 LAN(局域网)中的哪些内部 IP 地址启动了到达 LAN 外部、通过路由器到达 WAN(广域网)接口的会话。当数据离开路由器时,它包含分配给您的单个 IP 地址作为源 IP。当它进入时,数据包包含与目标 IP 相同的地址。然后路由器决定从那里将其定向到哪里。
从外部来看,您只有一个 IP 地址,实际上是路由器的 IP。路由器能够跟踪这些会话,并确定哪些流量属于其 LAN 上的每个内部 IP 地址,并相应地引导该流量。这是一个复杂的管理过程,但一旦您了解了所有内容都在每个路由器上进行转换,这个想法实际上就很简单了。
此外,大多数家用路由器都有交换端口,因此流量是通过 MAC 地址而不是 IP 地址传输的。数据包中的源 MAC 地址在到达路由器之前保持不变。路由器会剥离该源 MAC 地址并插入其自身 WAN 接口的 MAC 地址。
此外,这个设计是 IANA 创建的吗?
这些标准最初并非由 IANA 设计的。如今,尽管他们在制定标准方面处于领先地位,但他们当然不会通过任何法律手段来执行这些标准。这些标准是通过共识来执行的。搜索 RFC 791。
它们具有“权威”,只要每个人都愿意遵守它们。完全有可能违抗这些标准,但你最终会在某个地方遇到 ISP,它会要求你遵守,否则他们会丢弃你的流量。
我希望这有帮助。
答案4
作为其他答案的澄清,私有 IP 地址范围你在本地使用不路由到 Internet,因为它们在路由表中有自己的明确条目。例如,这是我家里的台式机的路由表:
$ ip route
default via 192.168.1.1 dev enp5s0 proto dhcp src 192.168.1.104 metric 1024
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown
172.18.0.0/16 dev br-90a372f4b373 proto kernel scope link src 172.18.0.1 linkdown
192.168.1.0/24 dev enp5s0 proto kernel scope link src 192.168.1.104
192.168.1.1 dev enp5s0 proto dhcp scope link src 192.168.1.104 metric 1024
注意172.17.0.0/16
和172.18.0.0/16
。发往这些网络的数据包将直接发往我的 docker 网桥,而无需离开我的计算机,因为它们在我的路由表中有一个特定的条目。该192.168.1.0/24
条目明确指出发往该网络的流量将从接口发出enp5s0
。我的路由器的路由表将有一个类似的条目,它将把该私有网络的所有流量从我的桌面连接到的接口发出。
只有未明确列在表中的网络的数据包才会转到默认路由。您可以通过以下方式明确将网络标记为不可访问:
$ ip route add unreachable 10.0.0.0/8
这将我的路线表更改为:
$ ip route
default via 192.168.1.1 dev enp5s0 proto dhcp src 192.168.1.104 metric 1024
unreachable 10.0.0.0/8
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown
172.18.0.0/16 dev br-90a372f4b373 proto kernel scope link src 172.18.0.1 linkdown
192.168.1.0/24 dev enp5s0 proto kernel scope link src 192.168.1.104
192.168.1.1 dev enp5s0 proto dhcp scope link src 192.168.1.104 metric 1024
现在,我的桌面甚至不会尝试向默认网关询问该范围内的地址。查找该地址会立即返回“没有到主机的路由”。
$ traceroute 10.0.0.1
traceroute to 10.0.0.1 (10.0.0.1), 30 hops max, 60 byte packets
connect: No route to host
未明确指明无法访问的网络的数据包标记因为路由表中不可达的数据包将继续通过默认路由转发,直到数据包到达明确知道网络不可达的路由器,或者 TTL 过期。