如上图所示,规划192.168.187.0/23网段时,并没有考虑到192.168.186.0/24网段已经存在。这就会导致192.168.187.0/23网段里所有的机器,到192.168.186.0/24网段不通(其他网段不受影响)。原因很简单:会将192.168.186.0/24当做本地局域网,只进行二层通信,压根不会到达路由。当然,186到187同样不通,也是由于上面的原因,导致回包不可达。
除了规划网络出错会有该问题,手动配置主机网络时,写错也会出现该问题,例如:
IPADDR=192.168.187.212
PREFIX=23
GATEWAY=192.168.187.1
解决方法有两种:
1、在187.0/23网段上,修正网段位数(以centos7为例:),网络重启后恢复正常。
BOOTPROTO=none
IPADDR=192.168.187.212
PREFIX=24
GATEWAY=192.168.187.1
2、手动追加路由(也就是说强制让192.168.186.0/24的报文发往网关进行路由)
ip route add 192.168.186.0/24 via 192.168.187.1 dev eth0 metric 200
方法二,一开始想当然的追加路由发往192.168.186.1,认为:由于子网位数错误,导致到186.0/24的报文错误地发往了192.168.187.1而不是192.168.186.1。这种理解是错误的,187.0/23物理上的出接口对端有且只有192.168.187.1,而不是192.168.186.1。如上配置之后,会导致192.168.186.1不可达而路由失败。
192.168.186.0/23 dev eth0 proto kernel scope link src 192.168.187.212 metric 100
该路由是被kernel创建的,配置在eth0接口上,作用域只限于局域网(所以不会被路由器处理),metric权重为100。
ip route add 192.168.186.0/24 via 192.168.187.1 dev eth0 metric 200
该路由被手动创建,配置在eth0接口上,作用域为global(默认),网关地址为:192.168.187.1,metric权重为200
路由表项的优先级为:1、目的网络掩码越大优先级越高;2、metric值越小优先级越高。
protocol
kernel:路由在自动配置时由内核安装。
boot:路由在引导过程中被安装。如果路由守护进程启动,它将清除所有boot路由。
static:管理员为覆盖动态路由而安装的路由。
ra:被路由发现协议安装的路由
redirect:由于ICMP重定向而安装的路由。scope
在Linux中,路由的scope是到destination network.的距离的指示器。一个IP地址的scope指示该地址与已知的本地主机之间的距离。默认是global域。
global:说明该地址全局有效;everywhere。
全局地址就是您目前可能认为的“正常”地址。即单播地址,在外部网络上可见并可路由。
site:说明该地址只在本地站点内有效,该值只在ipv6中使用;
站点本地地址应该在站点内使用。路由器不会转发任何源地址或目的地址为站点本地的数据包到站点之外。
link:只在该网络链路上有效;作用在局域网内使用。
链路本地地址应该被用于在单个链路上寻址节点。来自链路本地地址或以链路本地地址为目的地的数据包不会被路由器转发。
host:只在该主机上有效;作用在仅用于主机内部通信时。在主机之外,这个地址是不被知道的,不能被使用。例如,环回地址127.0.0.1。
主机地址是只存在于主机本身中的东西。例如127.0.0.1是通常分配给环回接口的主机地址。环回接口没有外部连接,因此它的作用域被限制在主机的范围内。
src
当发送到目的地时,被路由前缀覆盖的首选的源地址。