在出现网络问题的时候,我一般习惯于使用netstat -r来查看路由表,但是今天突然需要查看一下10.73.22.3到底走的哪一条路由,man了一圈,发现route竟然如此强大!
先直接上例子:
$ route -n get 10.73.22.3
route to: 10.73.22.3
destination: 0.0.0.0
mask: 0.0.0.0
gateway: 10.72.6.1
fib: 0
interface: igb0
flags: <UP,GATEWAY,DONE,STATIC>
recvpipe sendpipe ssthresh rtt,msec mtu weight expire
0 0 0 0 1500 1 0
上面显示:
(1)目的地址为:10.73.22.3
(2)目标为:0.0.0.0,说明走的是默认的路由
(3)掩码为:0.0.0.0,跟上面相同,说明走的是默认路由
(4)网关地址:10.72.16.1,如果不走网关,则没有这一行
(5)fib:默认fib
(6)走的网卡接口为:igb0
如果FreeBSD没有开启路由,或者是作为独立的工作站(如web服务器),则正常的结果都跟上面的例子相似。
接着看到另一个内网段的例子:
# route show 10.72.224.109
route to: 10.72.224.109
destination: 10.72.224.0
mask: 255.255.240.0
fib: 0
interface: em0
flags: <UP,DONE,PINNED>
recvpipe sendpipe ssthresh rtt,msec mtu weight expire
0 0 0 0 1500 1 0
这是另一段内网,注意
(1)目的网络不再是0.0.0.0,而是10.72.224.0,掩码为255.255.240.0,这是一个典型的路由网段,IP路由不是直接连接到目的IP,而是先转发到目的网络,就像电话号码的区号一样。
(2)结果中没有出现网关,因为这本机IP为10.72.224.1/20,属于本地网络,不需要再转发到下一个路由,并且直接连接的网卡为em0。
再来看一个不是直连网络的例子,注意gateway的值:
% route get 10.72.161.109
route to: 10.72.161.109
destination: 10.72.160.0
mask: 255.255.240.0
gateway: 10.72.16.3
interface: igb0
这个route get命令还有一个“妙用”:做pppoe或vpn服务器时,可以用来查找指定IP对应的虚拟网卡,比如现在知道一个接入的pptp用户IP为10.72.224.103,想找到对应的ng界面。
如果ng界面数量不多的时候,用ifconfig可以很快查到,但是如果ng数百上千的时候,那找就非常麻烦了,不如route get方便:
root@ftp:/home/hu # route show 10.72.224.103
route to: 10.72.224.103
destination: 10.72.224.103
fib: 0
interface: ng3
flags: <UP,HOST,DONE,PINNED>
recvpipe sendpipe ssthresh rtt,msec mtu weight expire
0 0 0 0 1480 1 0
可以看到,10.72.224.103对应的界面为:ng3,非常方便,甚至写入到脚本中都很方便,直接grep interface就能找到。
另外顺便提一下,route show和route get是同义词。
是不是跟交换机/路由器里面的命令相似呢?