一、问题背景

在某项目的华为云平台上部署银河麒麟服务器操作系统V10SP1虚拟机并配置多个网卡后,发现只有主网卡能与外部网络通信,其他网卡无法与外部网络通信(其中每个网卡都属于不通的子网)。主路由表(main路由表)的默认路由为该虚拟机主网卡的网关地址,如果不做其他额外配置的话,所有网卡均会使用主路由表的默认路由,那么此场景中的所有副网卡无法与外部通信就可以解释了。

二、解决方法

1. 服务器虚拟机的网卡配置

主网卡enp3s0: 192.168.30.8/24 网关192.168.30.1
副网卡enp5s0: 192.168.31.5/26 网关192.168.31.62
副网卡enp6s0: 192.168.28.21/27 网关192.168.28.30
外部网络地址:192.168.58.10

2. 添加路由表和策略路由

echo "31 net_31" >> /etc/iproute2/rt_tables
echo "28 net_28" >> /etc/iproute2/rt_tables
ip route flush table net_31
ip route add default via 186.82.31.62 dev enp5s0 table net_31
ip rule add from 186.82.31.0/26 table net_31
ip route flush table net_28
ip route add default via 186.82.28.30 dev enp6s0 table net_28
ip rule add from 186.82.28.0/27 table net_28

3. 测试路由策略生效

使用ping命令从副网卡到外部网络是否连通

ping  -I  enp5s0  192.168.58.10
ping  -I  enp6s0  192.168.58.10

备注:由于上述添加的策略路由在系统重启后就会丢失,我们起初尝试添加策略路由的命令加入到/etc/rc.local来使策略路由开机自启生效,结果发现不成功,原因未知。所以这里我们采用cron定时任务的方式来实时保障策略路由生效。步骤如下:

4. 添加定时任务

echo  "*  *  *  *  *   root   bash /root/route.sh" >> /etc/crontab

其中定时任务执行的脚本route.sh的内容如下:

#!/bin/bash
rule_31=`ip rule list | grep -i net_31 |wc -l`
rule_28=`ip rule list | grep -i net_28 |wc -l`
route_31=`ip route show table 31 | wc -l`
route_28=`ip route show table 28 | wc -l`
if [ $rule_31 -eq 0 ];then
        ip rule add from 186.82.31.0/26 table net_31
fi

if [ $rule_28 -eq 0 ];then
        ip rule add from 186.82.28.0/27 table net_28
fi

if [ $route_31 -eq 0 ];then
        ip route add default via 186.82.31.62 dev enp5s0 table net_31
fi

if [ $route_28 -eq 0 ];then
        ip route add default via 186.82.28.30 dev enp6s0 table net_28
fi

5. 重启crond服务

systemctl  restart  crond

重启虚拟机,确认策略路由开机自动生成。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐