Router中使用routers字段表示路由表,这是一个数组,每个元组的类型是[desnination,nexthop],其中destination表示目的网段(cidr),nexthop表示下一跳的IP,举例如下:
“routes”:[ { “destination”:”10.50.10.0/24” “nexthop”:”10.50.10.1” } { “destination”:”10.60.10.0/24” “nexthop”:”10.60.10.1” } ]
首先要明确,这里的nexthop指的是“外部”路由的接口IP,如下图所示:
nexthop指的就是图中Port2的IP:10.50.10.1
我们再看看外部网关信息(external_gateway_info)图。
该图中,在Router上对应端口(Port1),Neutron会自动创建,但是这里,如第一张图对应的端口(Port1),Neutron却不会主动创建,需要通过调用接口add_router_interface显示创建。这是为什么呢?这要从两者的模型(或者说参数)说起,如下表所示。
external_gateway_info为网关配置了subnet_id和network_id,routes没有。而且external_gateway_info中所对应的Router上的Port(第2张图的Port1)也属于这sunbet_id和network_id。Neutron的Port不能孤立存在,它必须要属于Subnet和Network。所以,从这一点来说,external_gateway_info对应的Port(第2张图的Port1),Neutron可以自动创建,而routers所对应的Port(第1张图的Port1),Neutron则不会自动创建,必须要调用接口add_router_interface进行显示创建。
上表中,还提到external_gateway_info有SNAT功能,而routes里没有。这是因为,两者虽然都是要连接“外部网络”,但是两者的“外部”所指的含义是不同的,虽然“外部网络”指的都是Neutron管理范围之外的网络。external_gateway_info的“外部网络”可以包括公网 ,当他它连接公网时,必须要启动SNAT。Routes模型中的外部网络,一般指的是私网,所以它没有启动SNAT这个功能。
Routes中的路由表项,我们称之为静态路由(不是默认路由,因为有目的网段)。从表中,我们看到,external_gateway_info并没有包含目的网段,所以它所对应的路由表(虽然没有显示地存在routes字段中),我们称之为默认静态路由。也就是说,除了直连路由(也没有体现在routes中)和静态路由(体现在routes中),到达其他目的地的都走这条默认静态路由。