我明白如私有地址10.0.0.0/8
,172.16.0.0/12
并且192.168.0.0/16
是不可路由的。但是,究竟是什么使这些地址无法路由呢?ISP是否实施阻止这些网络路由的ACL,还是更高级别的东西?
另外,是IANA创造了这种设计吗?
我明白如私有地址10.0.0.0/8
,172.16.0.0/12
并且192.168.0.0/16
是不可路由的。但是,究竟是什么使这些地址无法路由呢?ISP是否实施阻止这些网络路由的ACL,还是更高级别的东西?
另外,是IANA创造了这种设计吗?
Answers:
私有IP地址是可路由的,尽管它们不是公开路由的。基本上,路由器会将专用地址路由到专用/内部LAN,而不是Internet。
扩展我的答案:路由器可以通过其默认网关将专用地址路由到公共端。但是,由于其他路由器丢弃了该数据包,或者由于数据包的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专用网络。
但是,究竟是什么使这些地址无法路由呢?
通讯实体实施的公认标准。这些是在软件,硬件和配置中强制执行的。
ISP是否实施阻止这些网络路由的ACL,还是更高级别的东西?
他们可以但实际上停止的仅仅是不符合标准的无效翻译。
如果您像大多数家庭用户一样,可以将一个IP地址分配给您作为公共IP地址。为了使来自所有已连接设备的流量进行通信,路由器使用NAT(网络地址转换)或PAT(端口地址转换)对这些内部IP地址进行转换。
基本上,路由器会记住您的LAN(局域网)中的哪个内部IP地址启动了会话,该会话通过路由器到达WAN之外,并到达WAN(广域网)接口。当数据退出路由器时,它将包含分配给您的单个IP地址作为源IP。进入时,数据包包含与目标IP相同的地址。然后,路由器决定从那里定向到何处。
在外部,您只有一个IP地址,实际上是路由器的IP。路由器能够跟踪这些会话并确定哪些流量属于其LAN上的每个内部IP地址,并相应地引导该流量。这是一个复杂的管理过程,但是一旦您了解到每个路由器都在翻译所有内容,这个想法实际上就非常简单。
此外,大多数家用路由器都具有交换端口,因此流量是通过MAC地址而不是IP地址传递的。数据包中的源MAC地址保持不变,直到它到达路由器为止。路由器会剥离该源MAC地址,并插入其自己的WAN接口的MAC地址。
另外,是IANA创造了这种设计吗?
这些标准最初不是由IANA设计的。今天,尽管他们率先制定标准,但他们肯定不会通过任何法律手段来强制执行。它们是通过共识实施的标准。搜索RFC 791。
他们具有“权威”,以至于每个人都愿意遵守它们。完全有可能违反这些标准,但是您最终会在一条路径上遇到某个ISP,这将要求您坚持使用,否则它们将降低流量。
希望对您有所帮助。
作为对其他答案的澄清,您在本地使用的专用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过期为止。