
这个问题也可以结合主机路由表及主机发送数据包的过程进行理解。总体结论:
1.只要本机路由表有目的地址匹配项,该数据包就会被送出去;
2.网关地址在Linux中必须对应一条类型为scope link的路由表项,在进行ARP广播时根据该表项选择进行arp广播的接口。
为了简化和直观显示结果,我直接启动了一台virtualbox虚拟机,虚拟机里安装了ubuntu 14.04,并通过NAT和主机相连(NAT接口的原理和PPPOE一致)。同时主机还有一个内网接口。
步骤一:初始默认情况,主机自动获得IP10.0.2.15/24和网关10.0.2.2一个网段,
如果输入ip route命令,结果如下,ping网关正常能通;
步骤二:主机地址手动设为10.0.1.2/32,ping网关依旧能通;
ip route命令返回的主机路由表
步骤三:删除所有路由,只添加default 路由,不能直接添加,提示Network is unreachable。
步骤四:多个接口同一个相同的网关地址,路由表配置优先选择不和网关直连接口,此时ping 10.0.0.2不通
ip route
清空arp 表
ping 10.0.0.2不通
原因:进行arp广播根据metric 1的路由表选择仅从eth1接口广播,不会在所有接口上都广播,然而网关实际和eth0相连,所以收不到arp应答,无法ping 通。
注:注意到测试过程中有时网关主动通过eth0发来arp消息,系统会自动把eth1的表项删除。此时又可以ping通了。
参考:
How to clear the ARP cache on Linux? - Linux Audit
arp requesting to another subnet, how?