忽略设置linkdown标志的路由表项

遇到一个路由转发问题,如下路由表,在ens40网卡链路断开的时候,目的地址为192.168.3.0/24网段的报文,还是走ens40网卡,而不是默认路由,导致报文被丢弃。

$ ip route
default via 192.168.9.1 dev ens39 
192.168.3.0/24 dev ens40 proto kernel scope link src 192.168.3.248 
192.168.9.0/24 dev ens39 proto kernel scope link src 192.168.9.10 

如下,虽然ens40的直连路由被设置了linkdown标志,但是在路由查找中依然生效。

$ ip route
default via 192.168.9.1 dev ens39 
192.168.3.0/24 dev ens40 proto kernel scope link src 192.168.3.248 linkdown 
192.168.9.0/24 dev ens39 proto kernel scope link src 192.168.9.10 

查看内核路由查找函数fib_table_lookup,发现即使设置了RTNH_F_LINKDOWN标志的路由项,如果没有设置IN_DEV_IGNORE_ROUTES_WITH_LINKDOWN,内核还是会使用的。

int fib_table_lookup(struct fib_table *tb, const struct flowi4 *flp,
             struct fib_result *res, int fib_flags)
{
    /* Step 3: Process the leaf, if that fails fall back to backtracing */
    hlist_for_each_entry_rcu(fa, &n->leaf, fa_list) {
        struct fib_info *fi = fa->fa_info;
        ...
        if (fi->fib_flags & RTNH_F_DEAD)
            continue;
        for (nhsel = 0; nhsel < fi->fib_nhs; nhsel++) {
            const struct fib_nh *nh = &fi->fib_nh[nhsel];
            struct in_device *in_dev = __in_dev_get_rcu(nh->nh_dev);

            if (nh->nh_flags & RTNH_F_DEAD)
                continue;
            if (in_dev &&
                IN_DEV_IGNORE_ROUTES_WITH_LINKDOWN(in_dev) &&
                nh->nh_flags & RTNH_F_LINKDOWN &&
                !(fib_flags & FIB_LOOKUP_IGNORE_LINKSTATE))
                continue;

如下,网络设备ens40的PROC文件ignore_routes_with_linkdown值为零,随后将其设置为1,恢复正常,报文由默认路由发出。

$ cat /proc/sys/net/ipv4/conf/ens40/ignore_routes_with_linkdown
0
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值