路由表
内核中路由表有2种:
l 一个是缓存路由(fib),是自动学习生成自动管理的,用户没必要去干预,但是内核还是提供了方法让用户可以去清空它。但是用户不能设置它的项,但是可以根据这个缓存更新的原理从外部影响他。
l 路由表:一共有256个,在内核中是一个数组,可以配置让内核使用其中的一个或者多个。默认的是使用0,254,255这三个。一般大家关系都是254号的main路由,route命令看到的和操作的都是这个路由表。255是local路由,还包含了广播地址等,0是全路由,还包括了ipv6的,是最全面的。但是254的主路由是最容易看,也是用户最关心的,所以route命令只操作这个路由表。选择使用哪个路由表叫做留有策略,这个也是可以通过ip rule命令配置的。
路由表里面的路由类型有6种,我们平时见的最多的是单播和网段类型的:
l 单播。目的地址是某一个ip,一般是手动添加的。
l 网段。这个是最常见的,到达某个网段需要从哪里发送出去
l Nat。是的,nat也是路由的一种,他会修改掉ip的地址域为要到达的地址。之所以nat也是路由的一种是因为,nat也是一种形式的路由。这个nat和iptable的nat是同时存在的两种不同的机制。
l Unreachable:不可达类型的路由。我们经常看到不可达,通常是因为没有配置到目的地址的路由,或者是配置的不对。但是还可以单独的配置一个不可达类型的路由,即使他是可达的。
l Prohibit:禁止类型的路由。到某个地址的路由默认都是添加的如何到达,但是也可以添加如何禁止。同样是到某个网段或地址的路由,可以在某个网口上设置其禁止,这个与实际的到不了不再一个层次。这个是查路由的时候路由表告诉你的这个网段是被禁止的。
l Blackhole:到达目标网段的所有数据包都可以查到,但是都会直接被丢弃。也就是这是一个欺骗的路由条目。你以为你查到了,你以为你发出去了,其实都被悄悄地丢掉了。
这些种类的路由由于功能和路由策略重合,同时使用比较混乱,所以如果要实现复杂的路由,就应该使用路由策略规则,而不是这里的路由类型。
路由表查询匹配算法
路由表的查询匹配算法一般是lpm(longest prefix match),这种算法适合于不同精细度的网段,允许匹配最精细的网段设置,如果没有更精细的则匹配当前的。最不精细的等级就是0.0.0.0网段,可以匹配全部的网段。
路由策略
每一个路由表都对应一个路由策略,默认的路由策略最简单,就是查询表即可。默认也有3个路由策略:
所以,我们自己添加了一个0,254,255之外的路由表之后,这个路由表也是不会正常的工作的,路由表只是数据库,查不查询,怎么查询是由路由策略决定的。自己添加了路由表之后要想让这个路由表被查询,需要添加一个对应的路由策略。默认的路由策略都是lookup,就是我们通常意义的查询行为,还有其他的路由策略行为:
l Nat:查询到的路由是用来做nat的。对应的路由表中一般是有很多nat类型的路由表
l Unreachable:所有在对应的路由表中查到的路由条目都给出unreachable的答案
l Prohibit:所有在对应的路由表中查到的路由条目都给出prohibit的答案
l Blackhole:所有在对应的路由表中查到的路由条目都直接丢弃
路由策略从第一个开始向后查询,进入查询每个策略对应的路由表,如果查到了,就采取对应的路由策略规定的行为。
路由查找流程
路由会现在缓存(fib)中查找,找不到则到路由表中查找。但是这个在路由表中查找并不但单纯的去查表,网上很多资料都是描述的仿佛是直接去查路由表,匹配目的地址,但这已经是2.2版本内核之前的事情了。现在的流程复杂的多。
以前的路由查找,只是单纯的根据目的ip地址来进行lpm匹配查询,而现在的策略路由支持根据其他的域,比如源地址,tos,来的端口等来决定匹配的策略(这些叫做selector)。当然,路由表还是单纯的目的地址匹配,支持多种匹配的是路由策略(rule)。