实用工具ip可以报告网络状态信息,其中包括发送和接收了多少分组、发送的分组类型、如何对分组进行路由等。

11.4.1 预备知识

8章中讲过的netstat是所有Linux发行版中都包含的标准工具,但如今已经被像ip这样更为高效的工具所取代。这些新工具都来自于iproute2软件包,如今大多数发行版中都已经安装了该软件包。

11.4.2 实战演练

ip的功能众多。在这则攻略中将会讨论几个有助于跟踪网络行为的功能。

使用 ip route 输出路由

如果分组无法到达目的地(pingtraceroute命令失败),有经验的用户做的第一件事就是检查线缆。接着要做的就是检查路由表。如果表中缺少默认网关(0.0.0.0),那么分组只能被发送到本地网络上的其他主机。如果有多个网络,你需要在路由表中添加路由表项,以便能够通过网关在不同的网络之间转发分组。

ip route命令能够输出已知的路由:

  1. $ ip route
  2. 10.8.0.2 dev tun0 proto kernel scope link src 10.8.0.1
  3. 192.168.87.0/24 dev vmnet1 proto kernel scope link src 192.168.87.1
  4. 192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.44
  5. default via 192.168.1.1 dev eth0 proto static

ip route的输出以空格分隔。每行的第一个输出项之后是一系列关键字和对应的值。

上面输出的第一行表明地址10.8.0.2是一个使用内核协议(kernel protocol)的隧道设备,该地址仅对此设备有效。第二行表示网络192.168.87.x用于同虚拟机进行通信。第三行描述了系统所在的主网络(primary network),对应的网络设备是/dev/eth0。最后一行定义了通过eth0指向192.168.1.1的默认路由。

ip route命令输出中包含的关键字如下。

  • via:指明下一跳的地址。
  • proto:该路由所使用的协议。使用内核协议的路由是内核所设置的,管理员负责设置静态路由。
  • scope:地址的有效范围。如果scope取值为link,则表明地址仅对该设备有效。
  • dev:与该地址关联的设备。

跟踪最近的IP连接和ARP

ipneighbor命令可以输出IP地址、设备与硬件MAC地址之间的已知关系。通过该命令可以
了解到这种关系是最近重新建立的还是已经变得陈旧(stale)了:

  1. $ ip neighbor
  2. 192.168.1.1 dev eth0 lladdr 2c:30:33:c9:af:3e STALE
  3. 192.168.1.4 dev eth0 lladdr 00:0a:e6:11:c7:dd STALE
  4. 172.16.183.138 dev vmnet8 lladdr 00:50:56:20:3d:6c STALE
  5. 192.168.1.2 dev eth0 lladdr 6c:f0:49:cd:45:ff REACHABLE

ipneighbor命令的输出显示本系统与默认网关、主机192.168.1.4以及虚拟机172.16.183.138之间在最近一段时间内都没有发生活动,除此之外,主机192.168.1.2刚接入网络不久。

当前状态REACHABLE表明该arp表项是最新的,主机拥有远程系统的MAC地址。这里的STALE状态并不是说系统不可达,只是表明该arp表项已过时(expired)。当系统尝试使用这种表项时,会先发送ARP请求验证IP地址所对应的MAC地址。

MAC地址与IP地址之间的映射关系只有在更换硬件或是重新设置设备参数的情况下才会发生变化。

如果网络设备出现间歇性的连接故障,有可能是两个设备使用了相同的IP地址。也有可能是运行了两个DHCP服务器或是手动分配了已经被占用的地址。

如果两个设备使用了相同的IP地址,该IP地址对应的MAC地址会不时发生变化,ipneihbor命令可以帮助我们找出配置不当的设备。

跟踪路由

8章中讲过的命令traceroute可以跟踪分组从当前主机到目的地所经历的完整路径。route get可以输出当前主机的下一跳地址:

  1. $ ip route get 172.16.183.138
  2. 172.16.183.138 dev vmnet8 src 172.16.183.1
  3. cachemtu 1500 hoplimit 64

上面的输出显示到达虚拟机的路由需要经过地址为172.16.183.1的接口vmnet8。发往此处的分组如果大于1500字节,需要进行分片,经过64跳之后会被丢弃:

  1. $ in route get 148.59.87.90
  2. 148.59.87.90 via 192.168.1.1 dev eth0 src 192.168.1.3
  3. cachemtu 1500 hoplimit 64

如果要将分组送达到Internet上的某个地址,分组需要先通过默认网关离开本地网络,主机上的eth0接口(IP地址为192.168.1.3)与该网关相连接。

11.4.3 工作原理

ip命令作为各种内核用表的接口,运行在用户空间中。借助于该命令,普通用户可以检查网络配置,高级用户可以配置网络。