14.11 显示IP路由表

route

当使用SSH(Secure Shell)连接局域网内的其他计算机时(将在第15章中介绍),计算机是怎么知道如何把数据包限制在LAN内,而不是把它们发送到路由器,再发送到因特网上呢?当通过浏览器访问www.ubuntu.com时,Linux系统是如何知道把请求发送到路由,而不是相邻的另一台计算机呢?

答案是:Linux内核通过路由表来保持跟踪这些信息。要查看当前的路由表,只需要在shell中输入route。(查看路由表不需要root权限,而对其进行修改则需要root权限,这是下一节将要介绍的内容。)如下所示:

  1. $ route
  2. Kernel IP routing table
  3. Destination Gateway Genmask Flags Metric
  4. Ref Use Iface
  5. 192.168.0.0 * 255.255.255.0 U 0 0 0 eth0
  6. default 192.168.0.1 0.0.0.0 UG 0 0 0 eth0

说明 在这台机器上仅有一个网卡,所以这个路由表相当简单。在同时安装了以太网卡和无线网卡的笔记本电脑上,将会看到其他一些条目。

IP地址由4个八位元组(octet)构成,其格式可以表示为xxx.xxx. xxx.xxx,如192.168.0.124。当从你的机器发送一个数据包时,就会把这个数据包的目标IP地址和路由表中的Destination (目标)列进行比较。Genmask(子网掩码)列用于标识应该检查IP地址4个八位元组中的哪一部分,并和Destination 列一同决定数据包的目标网络地址。

例如,假设在shell中输入ping 192.168.0.124。子网掩码(Genmask)255.255.255.0表明只有最后一个八位元组(由0表示的那个八位组)是重要的。换句话说,当遇到192.168.0.124这样的IP地址时,只有.124这部分对于将数据包路由到正确的主机地址才是重要的。向IP地址从192.168.0.1到192.168.0.255(这个网段IP地址的最大范围)发送的任何数据包都可以匹配Genmask 和 Destination,于是它们会呆在局域网中,不会转发给路由器。这也就是为什么在192.168.0.0旁边的Gateway列有一个星号(*)的原因:不需要通过网关(Gateway),因为是局域网本地流量。

另一方面,其他数据包都默认发送到路由器(在这个例子中是Gateway列的192.168.0.1)。该行的掩码(Genmask列)是0.0.0.0,这表明任何不匹配从192.168.0.1 到192.168.0.255的目标IP地址都将通过192.168.0.1进行发送(因为192.168.0.1是网关地址,这是一种特殊情况)。72.14.203.99、82.211.81.166以及216.23.180.5都匹配0.0.0.0,所以它们必须通过网关访问外网。

route命令提供的路由表的另一个有趣的地方是它的Flags(标志)列,该列提供关于路由本身的一些信息。标志有几种,但最常见的是U(表明路由已启动并可用)和G(表明路由使用网关)。从前面的表中可以看到,两个路由都已经启动,但只有第二个是网关。