有时候在系统上配置一个32位掩码的IP地址是不错的,这样一来可以使系统路由表瘦身,二来可以防止显式路由之外的主机和本系统通信。这个怎么说呢?通过配置一个32位掩码的IP地址,就会发现在路由表的main表中,少了该地址的直连路由,因为它是32位的,本身不表征不携带任何网络,在路由表的local表中,少了该地址表征的网段的广播路由,因为它不表征任何网段,因此除非你显式地配置一条路由,否则该地址应该可以被看作是孤立的了。
        在单网卡机器上,如果配置eth0的地址为192.168.40.249/32,那么别指望用常规的方式添加任何路由,这是因为链路层直连路由已经不存在了,我们如下的尝试:
route add -net 192.168.0.0/16 gw 192.168.40.254
将失败,因为网关地址并不和本地地址同在任何一个网段,那么如何是好呢?Linux的iproute2工具包提供了一个onlink参数,可以满足这样的要求:
ip route add 172.16.0.0/16 via 192.168.40.254 dev eth0 onlink
之所以要指明dev参数是因为没有链路层直连路由,因而协议栈根本不知道从哪个网卡发出数据包,必须显式指明才可以,最后的一个onlink参数表明强制此网关是“在链路上”的(虽然并没有链路层路由)。除了路由之外的所有访问都将以“路由不可达”这种错误而告终。
        按照上述的配置,即使你访问192.168.40.0/24网段的,也会失败,因为192.168.40.249/32和谁都不在一个网段。那么onlink能表达什么呢?onlink的意义在于协议栈虽然找不到链路层直连路由,但是还是会发布针对via网关的arp请求的,仅此而已。如此一来,这种网络通信显得更加纯粹些。仅仅就是为了通信,不会因为通信本身而造出一个IP网段来。