英创嵌入式Linux主板多网口多路由方案

 2018-6-29     作者:Emtronix     [nemail]    
[lablebox]

  主流的英创嵌入式主板均支持双网络接口,其中支持ISA扩展总线的主板型号,如:EM335x、ESM335x、ESM6802、ESM6800V等,还可以通过ISA总线外接ETA728模块,再扩展两路独立的10M/100M网络,从而可构成4网口系统。多网络口的英创主板在工业应用中的典型应用是作为通讯管理机,通过网络将应用数据上传至数据中心。在实际应用中,有些需求是将应用数据上传至不同的数据中心,这就需要多网口多路由的支持,也就是说每个网口有自己独立的路由表,在英创Linux主板上通过相关的配置,即可实现上述功能,本文以ESM335x主板为例重点介绍该配置方案。


1、Linux内核配置


  为了支持多路由表功能,内核配置中必须设置:

  CONFIG_IP_ADVANCED_ROUTER=y

  CONFIG_IP_MULTIPLE_TABLES=y


  具体menuconfig位置如下:

  Networking support  ---> 

       Networking options  

          [*]   IP: advanced router 

          [*]   IP: policy routing   


2、利用ip route配置生成多路由表


  对于多个路由表,是通过/etc/iproute2/rt_tables进行管理的,Linux系统最多可以支持255张路由表,其中3张是内置的:

  255  local

  254  main

  253  default


  分别表示了路由表table的序号和名称。在英创主板上对于各个网口的路由表定义序号从1开始,名称就采用网口名称。如:

  1eth0

  2eth1

  3eth2

  4eth3


  生成路由表的步骤如下:

  1、在rt_tables文件中增加一个路由表的序号和名称:

  #>echo “1 eth0” >> /etc/iproute2/rt_tables

  #>echo “2 eth1” >> /etc/iproute2/rt_tables

  配置好后,可以用cat命令查看rt_tables文件:


英创嵌入式Linux主板多网口多路由方案.png


  2、定义路由表规则

  利用2个Linux工具ip route、ip rule来定义路由表规则,可以用来指定IP地址的数据选择指定的路由表。

  #>ip route add 192.168.202.0/24 dev eth1 src 192.168.202.175 table eth1

  #>ip route add default via 192.168.202.1 dev eth1 table eth1

  #>ip rule add from 192.168.202.175/32 table eth1

  #>ip rule add to 192.168.202.175/32 table eth1

  #>route add default gw 192.168.202.1


  增加后,可以用ip route show table eth1来查看:


英创嵌入式Linux主板多网口多路由方案.png


  按照此定义的路由表规则,即所有来自“192.168.202.175”的IP数据包访问外网时选择eth1路由表,并使用该网段的网关路由。


3、自动生成多网络路由表


  在多网络的情况下,为了方便客户使用,我们采用网络配置文件(ifcfg-eth*)和加载脚本文件(route-cfg.sh)来完成多个路由表的自动配置,免除了逐一配置的繁琐过程。


  其中 ifcfg-eth*用于配置各个网络的参数,一个文件对应于一个网口,例如对eth0的配置文件名为ifcfg-eth0,其文件内容如下:

       DEVICE=eth0                                                // 网络名称
             TABLENUM=1                                              // table 序号
             NETWORK=192.168.201.0                            // 网段IP
             NETMASK=255.255.255.0                                   // 子网掩码
             ROUTER=192.168.201.1                                // 本网口的路由网关IP
             IPADDR=192.168.201.175                                  
// 本网口IP地址


按上述方法生成好需要的若干配置文件ifcfg-eth*后,将ifcfg-eth*和route-cfg.sh均复制到/mnt/nandflash/目录下。然后直接执行脚本文件route-cfg.sh即可自动完成路由表配置,该文件会根据ifcfg-eth*文件中的参数,自动生成所需的多网口多路由表

#/mnt/nandflash/>./route-cfg.sh

route-cfg.sh文件内容如下:

#!/bin/sh


  for interface_file in $(ls /mnt/nandflash/ifcfg-eth*) ;do

    . ${interface_file}

    prefix=$(ipcalc -p ${IPADDR} ${NETMASK} | awk -F= '{print $2}')

    tablenum=${TABLENUM}

    if ! grep "^${tablenum} ${DEVICE}$" /etc/iproute2/rt_tables >/dev/null ;then

      echo "${tablenum} ${DEVICE}" >>/etc/iproute2/rt_tables

    fi

    echo ${DEVICE}: IPADDR=${IPADDR} gw=${ROUTER}

    ifconfig ${DEVICE} ${IPADDR} 

    # flush table

    ip route flush table ${DEVICE}

    # add table

    ip route add ${NETWORK}/${prefix} dev ${DEVICE} src ${IPADDR} table ${DEVICE}

    ip route add default via ${ROUTER} dev ${DEVICE} table ${DEVICE}

    ip rule add from ${IPADDR}/32 table ${DEVICE}

    ip rule add to ${IPADDR}/32 table ${DEVICE}

    # add default gw

    route add default gw ${ROUTER}  

  done


4、测试网络


  以ESM335x为核心,搭建双网口双网关的多路由系统,作为测试环境。下图为双网口网络拓扑图:


335x.png


  最简单的方法就是利用ping命令进行测试,ping命令可以指定网口。如:

  #> ping  -I eth0  202.98.96.68          (指定通过eth0 访问外网 -> internet网站)

       #> ping  -I eth1  192.168.203.70        (指定通过eth1 访问外网 -> 企业数据中心)


  如果利用系统的多路由表,也可以不用指定网口进行ping测试,但是系统有个自动选路的处理,会存在一定的延时。

  #> ping  202.98.96.68         

       #> ping  192.168.203.70


英创嵌入式Linux主板多网口多路由方案.png


英创嵌入式Linux主板多网口多路由方案.png

[lablebox]