About null0 interface(Black Hole Router)
        黑洞路由,便是将所有无关路由吸入其中,使它们有来无回的路由,一般是admin主动建立的路由条目。

Introduction

一般情况下,路由器提供一个称为NULL0的接口,该接口是一个逻辑接口,有一个重要的特性:永远是UP的,并且发送到该接口的数据帧都会被丢弃。由此可以推断,如果我们在路由器上配置一条静态路由,该路由的出口就是NULL0,那么该路由会有下列特性:

1、这个静态路由永远的有效,那是因为接口不会DOWN掉;

2、使用该路由转发数据帧消耗的系统资源很少,因为路由器只是丢弃接收的数据报;

3、路由器根据配置的参数要不然向数据源发一个丢弃通知(ICMP通知消息),要不就不做任何反应。

正是有了这些特性,使得该接口有广泛而重要的用途,尤其在进行一些高级的路由策略时,比如路由聚合,网络发布等,有灵活而巧妙的应用。下面具几个例子:

NULL0与路由汇总

一般情况下,为了提高网络的可伸缩性,都得在边缘路由器上弄路由聚合。但是路由聚合需要满足一些的条件,比如,OSPF中,只能在区域边界路由器对路由进行汇总,这样,为了进行路由聚合,我们就得进行划分多区域,但是这在某些情况下是不可满足的,再者,在BGP中,为通知一个汇总网络,这个网络就得存在在路由表,否则无法通知。

但如果使用了NULL0接口和静态路由技术,这些问题会很巧妙的被解决。下面我们举两个例子,一个例子说明如何解决单区域情况下的OSPF路由汇总,另外一个例子说明在BGP中如何通告聚合路由。这两个例子都很有代表性。

1.1 单区域模式下OSPF路由汇总

这个网络,RT1经过两个高速的POS链路直接连接上层的两台中心路由器CRT1和CRT2,在RT1下面直接连接了很多DDN的用户,每个DDN的用户用一个C类IP的地址,目前已经使用了四个:
192.168.1.0,192.168.2.0,192.168.3.0,192.168.4.0,按照这样,192.168.0.0/16整个分配给该了路由器下的DDN的用户以使用。

在RT1和两台中心路由器之间运行OSPF协议,RT1和DDN用户之间采用静态路由,为了把DDN用户的静态路由分发到整个INTERNET,在 RT1上把所有静态路由引入了OSPF。这样工作起来是没有问题的,但因为整个192.168.0.0/16路由都分配给了RT1,即说明该网络不会在外部网络上出现,这时候我们可以采用路由聚合的技术,把这些“零碎”网段聚合成192.168.0.0/16,然后通过OSPF发布出去。

当前的问题是,在OSPF,要进行路由聚合,必须在区域边界进行,这时一个解决方案就是把所有连接DDN用户的接口划分到另外一个区域中(RT1和 CRT1,CRT2之间划分为区域0),然后在RT1上进行聚合,把所有DDN路由聚合后发送到区域0里面。这样做有很多弊端,比如,容易造成路由泄露(RT1上的路由可能被DDN用户截获),浪费DDN线路带宽(OSPF要在接口上不断发送HELLO报文)等。

一个不另外划分区域而解决该问题的方式就是应用NULL0接口路由。可以按照下列步骤进行:

1、在RT1上配置静态路由,如下:

(CRT1-config)#ip route 192.168.0.0 255.255.0.0 NULL0

2、创建访问列表,用于OSPF中的路由分发,如下:

(CRT1-config)#access-list 10 permit 192.168.0.0 0.0.255.255
(CRT1-config)#access-list 10 deny any

3、在OSPF中分发静态路由,并使用访问列表10来控制分发的路由,如下:

(CRT1-config-router-ospf)#redistribute static
(CRT1-config-router-ospf)#distribute-list 10 out static

以上仅仅列出了跟路由分发相关的配置。完成这样配置后,OSPF在分发静态路由时,就会根据访问列表10来进行控制,而仅仅分发出去一条汇总路由,而其他具体的路由都会被过滤掉。

需要注意,OSPF在分发静态路由时,仅分发路由表里存在的路由,因此我们就得新建一条下一跳为NULL0接口的静态路由来欺骗OSPF,这也是上述操作的重点。

1.2 BGP协议中的路由汇总

BGP作为一种边界网关之间的路由协议,有很大的伸缩性和灵活性,可以对路由进行精确的控制和分发。在一些ISP中,往外发布自己的内部路由时往往需要做一些汇总,而不发送具体的路由出去,这样不但有利于保密的目的,而且也不会引入太多的路由到INTERNET上.

BGP,我们用SUMMARY-ADDRESS命令来进行路由聚合,但是聚合后出现路由属性的改变问题,像AS-PATH的属性,会由具体的AS的号更换为AS-SET,这样对以后的路由控制有着不利的影响。也就是说,在BGP中,引入路由的最理想方式是使用NETWORK命令直接引入到本地路由表中的路由,这样引入的路由起点属性为IGP,可信度是最好的。

但NETWORK命令总有一个限制,就使用NETWORK来引入的路由必须在路由表中存在,否则就不能引入。实际情况是,路由表中存在着一些具体的路由,而不存在汇总路由,这时候用NETWORK便不起作用。

跟上面OSPF的解决方式是一样的,我们可以用配置一条静态的来指向NULL0接口的路由进行欺骗BGP,如下步骤:

1、配置静态路由,如下:

(CRT1-config)#ip route 192.168.0.0 255.255.0.0 NULL0

2、在BGP中,把聚合路由引入到其中,如下:

(CRT1-config-router-bgp)#network 192.168.0.0 mask 255.255.0.0

完成这些配置后,BGP就会把一条聚合路由引入其中,同样的道理,配置上该条静态路由后,也不会对数据的正常转发造成任何影响。

NULL0的其它应用

2.1 作为备用路由使用

一般,如果一台路由器接收了一个数据包,而在自己的路由表里又没有查询到要转发的路由,该路由器就会把数据报丢弃,并向数据源发送一个目的地不可达的ICMP消息。当然,这是一种正确的行为,但有些情况下就可能不符合人的愿望,比如,我们在路由器上配置了一条静态路由,使这个路由指向一个物理串口,这个串口正常时,该静态路由就可用,但这个串口DOWN掉时候,该静态路由就会被删除,这样如果再收到这样一个数据报(该数据报需要配置的静态路由进行转发),则丢弃,并给源发送一个ICMP目的地不可达消息,接收到ICMP不可达消息的主机就有可能修改自己的路由表(尤其是在一些UNIX主机),而这是我们所不希望的。

这时候我们可以配置一条指向NULL0接口的备用路由,但是把优先级降低,假设我们在路由器上做如下配置:

(router-config)#ip route 0.0.0.0 0.0.0.0 Serial 0 preference 60
(router-config)#ip route 0.0.0.0 0.0.0.0 NULL0 preference 20

即使SERIAL0接口断掉了,路由器也就会不断使用下条路由地进行转发(转发的结果当然就是丢弃数据报),而不再给源目的地发送ICMP不可达消息。这在路由摆动比较频繁的情况下也可以使用,不至于影响到其它路由器,而仅仅只是把摆动限制在自己身上。

2.2 在IP策略中的使用

某些情况,我们也可能采取某些IP转发的策略,像,进行源地址的路由等。在这些情况下,我们可能需要转发一些符合条件数据,而丢弃一些不符合条件的数据。有些情况下,比如源地址的路由等,可以通过访问列表解决,但有些特殊情况下,用访问列表是解决不了的,比如,我们在以太网接口上过滤1500字节的数据,即如果数据报的长度超过了1500,我们可以丢弃。该需求可以通过IP策略解决,如下:

1、配置一个路由影像(ROUTE-MAP),如下:

(router-config)#route-map Deny_1500 permit 100
(router-route-map)#match length 1500
(router-route-map)#set interface NULL0
(router-route-map)#exit

2、到接口的模式下,实施IP的策略,如下:

(router-config-if)#ip policy route-map Deny_1500

完成这样配置后,所有以太网接口上都将收到的1500字节的数据帧过滤掉。

RIP v2 中的使用

路由器会提示如下信息:

“Summary mask must be greater or equal to major net”

显示的提示信息表明汇总后的掩码升序必须要大于或等主类网络的掩码长度,因为”22<24”,所以不能汇总。

所以,RIPv2不支持CIDR汇总,但是可以传递CIDR汇总。

解决方案如下:

(1)用静态路由发布被汇总的路由

R4(config)#ip route 192.168.96.0 255.255.252.0 null0

(2)将静态路由重分布到RIP网络中

R4(config)#router rip

R4(config-router)#redistibute static  //将静态路由重分布到RIP网络中

R4(config-router)#no network 192.168.96.0

R4(config-router)#no network 192.168.97.0

R4(config-router)#no network 192.168.98.0

R4(config-router)#no network 192.168.99.0

(3)在路由器R1上查看路由表