前面我们提到过路由策略的问题,策略性是指对于IP包的路由是以网络管理员根据需要定下的一些策略为主要依据进行路由的。例如我们可以有这样的策略:“所有来直自网A的包,选择X路径;其他选择Y路径”,或者是“所有TOS为A的包选择路径F;其他选者路径K”。
策略性路由机制与传统的路由算法相比主要是引入了多路由表以及规则的概念。关于多路由表,我们前面已经讲过,当内核配置了“路由策略”后,就可以使用多达
255张路由表(数组的第0项不能使用)。有三张路由表是系统内置的,即本地路由表,主路由表,和默认路由表。
在配置多路由表的情况下,查找路由时就存在了一个问题,即应该从哪个路由表中查找,如果找不到,接下来应该在哪个路由表中查找。对某个路由表应不应该进行查找等等。这一系例问题就引出了路由规则与规则之间的优先级的问题。
结构体struct fib_rule定义一条路由规则,而多个struct fib_rule构成一条链表,链表上的先后顺序表明了它们之间的优先级:
struct fib_rule
{
struct fib_rule *r_next;
atomic_t r_clntref;
u32 r_preference;
unsigned char r_table;
unsigned char r_action;
unsigned char r_dst_len;
unsigned char r_src_len;
u32 r_src;
u32 r_srcmask;
u32 r_dst;
u32 r_dstmask;
u32 r_srcmap;
u8 r_flags;
u8 r_tos;
#ifdef CONFIG_IP_ROUTE_FWMARK
u32 r_fwmark;
#endif
int r_ifindex;
#ifdef CONFIG_NET_CLS_ROUTE
__u32 r_tclassid;
#endif
char r_ifname[IFNAMSIZ];
int r_dead;
};
r_next指向下一条比本条优先级低的规则;r_table表明本条规则对应的路由表;r_action是本条规则的行为,比如为
RTN_UNREACHABLE,则表示符合本条规则的数据包都是目的地不可达的;r_src, s_srcmask, r_dst,
r_dstmask定义了数据包的源和目地地址或网络,r_tos定义服务类型,r_ifindex定义输入网络设备接口的编号,再加上
r_fwmard,只有这些值都符合的数据包,才符合本条规则,可以进入本条规则指定的路由表进行路由查找,否则,不适用本规则,接着往下找低优先级的规
则。
系统内置了三张路由表,所以,相应的,系统也内置了三条路由规则:
static struct fib_rule mydefault_rule = {
.r_clntref = ATOMIC_INIT(2),
.r_preference = 0x7FFF,
.r_table = RT_TABLE_DEFAULT,
.r_action = RTN_UNICAST,
};
static struct fib_rule mymain_rule = {
.r_next = &mydefault_rule,
.r_clntref = ATOMIC_INIT(2),
.r_preference = 0x7FFE,
.r_table = RT_TABLE_MAIN,
.r_action = RTN_UNICAST,
};
static struct fib_rule mylocal_rule = {
.r_next = &mymain_rule,
.r_clntref = ATOMIC_INIT(2),
.r_table = RT_TABLE_LOCAL,
.r_action = RTN_UNICAST,
};
r_preference是优先级,RT_TABLE_LOCAL优先级最高,为0,RT_TABLE_MAIN为0x7FFE,
RT_TABLE_DEFAULT为0x7FFF。它们以链表的形式组织在一起,系统管理员可以通过系统命令操作向这个链表中再添加其它优先级的路由规
则。三条内置规则对数据包的源和目的地址,以及服务类型都没有作任何特殊限制,所以任何一个数据包都可以按顺序查找这三个路由表,直到找到相应的路由为
止。
阅读(6427) | 评论(0) | 转发(0) |