观察双网卡主机如何选路

穷则独善其身,达则兼善天下。

—— 战国·孟子·《孟子》

主机如果安装了多块网卡,就可以接入多个不同的网络。

笔记本电脑一般都有无线网卡,可以连接 Wifi 网络;还有网线插槽,可以连接有线网络。虽然我们通常只连接一个网络,但双网卡笔记本理论上可以同时接入两个。

你或许也有过这样的经历:笔记本通常连接 Wifi 上网,偶尔需要插上网线访问内网服务;但只要网线一插上,无线 Wifi 就断网了,很烦人!

这是什么原因呢?难道鱼和熊掌不可兼得?本节,我们深入研究多网卡主机的选路过程,探索问题的答案。

典型案例

如图,笔记本有两块网卡,其中无线网卡 eth0 接入 Wifi 无线办公网;有线网卡 eth1 接入内网:

那么,当用户发起网络通信时,系统是如何决定走哪张网卡的呢?

笔记本通过 Wifi 接入无线办公网,接入点网段是 192.168.50.0/24 ;当它完成 IP 地址配置后,系统自动为 192.168.50.0/24 网段配置 直接路由 ,因此笔记本可以访问接入该网段的其他主机。

  • 路由规则一:192.168.50.0/24 从 eth0 网卡直接发送;

无线办公网规模可能很大,内部可能通过路由器划分为许多子网。由于笔记本只有子网 192.168.50.0/24 的路由规则,它无法访问其他子网。

为访问其他子网,笔记本必须为它们配置正确的路由。由于访问其他子网都是以无线网关 192.168.50.1 为下一跳,因此可以将连续的子网合并起来配置,无须逐个配置。

网络规划通常为同一网络中的子网分配一大段连续的地址,例如整个无线办公网的网段是 192.168.0.0/16 。因此,笔记本可以为 192.168.0.0/16 网段配置路由规则:

  • 路由规则二(甲):192.168.0.0/16 通过 192.168.50.1 转发;

192.168.0.0/16 包含子网 192.168.50.0/24 ,那么子网的路由规则会不会被覆盖呢?其实不会。网络号越长的网络越精确,因此 192.168.50.0/24 的路由规则优先级比 192.168.0.0/16 更高。

当用户访问本地网其他主机,例如 192.168.50.33 ,虽然系统找到两条匹配的路由规则,但它会挑选匹配度更高的那条,也就是 192.168.50.0/24 这条,从 eth0 网卡直接发送。

当用户访问其他子网的主机,例如 192.168.87.10 ,则匹配 192.168.0.0/16 这条路由规则,以 192.168.50.1 为下一跳。至此,笔记本可以正常访问整个办公网中的主机。

办公网有一个出口路由,接入了互联网;发往互联网的 IP 包,只要进入接入路由,都会被转发到出口路由,并进入互联网。因此,笔记本想要访问互联网的话,只需将数据包交给 192.168.50.1 来转发即可。

你可能已经想到了,笔记本只要添加了路由规则,即可访问互联网。但互联网地址何其多,到底添加什么网段好呢?其实,系统一般是配置一条默认的路由规则,来访问互联网的。

默认路由其实就是 0.0.0.0/0 网段,这个网段可以匹配任意 IP 地址。这个网段匹配度是最低的,因此优先级也是最低的。

  • 路由规则二(乙):0.0.0.0/0 通过 192.168.50.1 转发;

值得一提的是,上述两条规则的处理策略是一样的,因此这两个网段可以进一步合并成:

  • 路由规则二:0.0.0.0/0 通过 192.168.50.1 转发;

笔记本接入的有线网络也是类似的:只要 eth1 配置了正确的地址,系统就会为本地子网添加一条直接路由,它就可以访问本地子网了。

  • 路由规则三:10.2.35.0/24 从 eth1 网卡直接发送;

如果笔记本想要访问位于其他子网的内网服务,它需要再配置路由规则。假设整个有线内网的网段是 10.0.0.0/8 ,那么可以这样添加路由规则:

  • 路由规则四:10.0.0.0/8 通过10.2.35.1 转发;

有了这四条路由规则,笔记本就可以正常访问任一网络了:

  • 访问本地无线子网主机,如 192.168.50.33 ,命中规则一,从 eth0 网卡直接发送;
  • 访问其他无线网主机,如 192.168.87.10 ,命中规则二,通过 192.168.50.1 转发;
  • 访问互联网主机,如 223.5.5.5 ,命中规则二,通过 192.168.50.1 转发;
  • 访问本地有线子网主机,如 10.2.35.11 ,命中规则三,从 eth1 网卡直接发送;
  • 访问其他有线网服务,如 10.2.89.63 ,命中规则四,通过 10.2.35.1 转发;

问题分析

插上网线,Wifi断网

那为什么笔记本连接 Wifi 时插上网线,经常导致 Wifi 断网呢?原因只有一个,那就是路由表。它单独连接 Wifi 时,系统一般会自动配置两条路由规则:

  • 192.168.50.0/24 从 eth0 网卡直接发送;
  • 0.0.0.0/0 通过 192.168.50.1 转发;

这两条路由规则,保证笔记本可以访问本地子网、其他无线子网以及互联网。但网线插上之后,系统除了自动添加直接路由,可能还会修改默认路由:

  • 192.168.50.0/24 从 eth0 网卡直接发送;
  • 10.2.35.0/24 从 eth1 网卡直接发送;
  • 0.0.0.0/0 通过 10.2.35.1 转发;

这时,笔记本可以访问两个本地子网以及整个有线网,但无法访问其他无线子网以及互联网。因为路由规则将去往这些目的地的 IP 包,错误地送到 10.2.35.1 了。

插上网线,仍无法访问

还有一种情况,插上网线后,系统只是自动添加直接路由,系统路由表是这样的:

  • 192.168.50.0/24 从 eth0 网卡直接发送;
  • 10.2.35.0/24 从 eth1 网卡直接发送;
  • 0.0.0.0/0 通过 192.168.50.1 转发;

这时,笔记本无法访问位于其他子网的内网服务,例如 10.2.87.10 。

不管出现以上哪种情况,我们只要将路由规则修改正确,笔记本就能正常访问相关网络。

小菜学网络】系列文章首发于公众号【小菜学编程】,敬请关注:

【小菜学网络】系列文章首发于公众号【小菜学编程】,敬请关注: