配置策略路由让待发送流量根据源地址选择路由

在Alibaba Cloud Linux 3系统中,默认路由算法是根据报文的目的地址选择路由,这导致当待发送流量的源地址为辅助网卡(如eth1),且目的地址位于网卡子网内时,系统总是通过主网卡(如eth0)发送流量,而不会通过辅助网卡(如eth1)发送流量。为了解决这一问题,您可以配置策略路由,让待发送流量根据源地址选择路由。

使用限制

操作系统:Alibaba Cloud Linux 3。

配置策略路由

Alibaba Cloud Linux 3默认采用NetworkManager配置网卡,因此推荐使用其提供的nmcli工具来配置策略路由。本文以为辅助网卡eth1配置策略路由为例说明。

持久化配置策略路由

持久化配置的策略路由,即使在重启实例后,配置依然被保留。

  1. 执行以下命令,创建并打开config_dual_traffic.sh文件。

    sudo vim config_dual_traffic.sh
  2. i键进入编辑模式,将以下内容复制到config_dual_traffic.sh文件中。

    #!/bin/bash
    
    # Target NIC name
    NIC=$1
    
    # URL for metaserver
    BASE_URL="http://100.100.100.200/latest/meta-data/network/interfaces/macs"
    
    # MAC/IP address/netmask/gateway for NIC
    MAC=$(cat /sys/class/net/$NIC/address)
    IP_ADDRESS=$(curl $BASE_URL/$MAC/primary-ip-address)
    NETMASK=$(curl $BASE_URL/$MAC/netmask)
    GATEWAY=$(curl $BASE_URL/$MAC/gateway)
    
    # 255.255.255.0 to /24
    netmask_to_cidr() {
        local binary_mask=""
    
        IFS='.' read -ra ADDR <<<"$NETMASK"
        for octet in "${ADDR[@]}"; do
            binary_mask+=$(echo "obase=2; $octet" | bc)
        done
    
        local cidr=0
        for ((i=0; i<${#binary_mask}; i++)); do
            if [ "${binary_mask:$i:1}" == "1" ]; then
                ((cidr++))
            fi
        done
    
        echo "$cidr"
    }
    
    CIDR=$(netmask_to_cidr $NETMASK)
    NETWORK_ADDRESS=$(ipcalc -n $IP_ADDRESS $NETMASK | cut -d= -f2)
    IP_CIDR="${NETWORK_ADDRESS}/${CIDR}"
    
    # Connection name for NIC
    CONNECTION_NAME=$(nmcli -g NAME,DEVICE connection show | grep $NIC | awk -F: '{print $1}')
    
    echo "NIC name: $NIC"
    echo "mac addrss: $MAC"
    echo "ip address: $IP_ADDRESS"
    echo "netmask: $NETMASK"
    echo "IP_CIDR: $IP_CIDR"
    echo "default gateway: $GATEWAY"
    echo "connection: $CONNECTION_NAME"
    
    nmcli connection modify "$CONNECTION_NAME" +ipv4.routing-rules "priority 100 from $IP_ADDRESS table 200"
    nmcli connection modify "$CONNECTION_NAME" +ipv4.routes "0.0.0.0/0 $GATEWAY table=200"
    nmcli connection modify "$CONNECTION_NAME" +ipv4.routes "$IP_CIDR table=200"
    nmcli connection up "$CONNECTION_NAME"
    
    echo "The dual network card sending network configuration is completed."
  3. Esc键,输入:wq后按Enter键,保存配置。

  4. 执行以下命令,使辅助网卡eth1配置的策略路由生效。

    eth1:需替换为实际的网卡名称。

    sudo sh config_dual_traffic.sh eth1
  5. 执行以下命令,查看路由规则和路由项。

    ip rule
    ip route show table 200

    添加完成后,路由规则和路由项如下图所示。

    image

临时配置策略路由

临时配置的策略路由,将在实例重启后失效。

  1. 执行以下命令,创建并打开config_dual_traffic.sh文件。

    sudo vim config_dual_traffic.sh
  2. i键进入编辑模式,将以下内容复制到config_dual_traffic.sh文件中。

    #!/bin/bash
    
    # Target NIC name
    NIC=$1
    
    # URL for metaserver
    BASE_URL="http://100.100.100.200/latest/meta-data/network/interfaces/macs"
    
    # MAC/IP address/netmask/gateway for NIC
    MAC=$(cat /sys/class/net/$NIC/address)
    IP_ADDRESS=$(curl $BASE_URL/$MAC/primary-ip-address)
    NETMASK=$(curl $BASE_URL/$MAC/netmask)
    GATEWAY=$(curl $BASE_URL/$MAC/gateway)
    
    # 255.255.255.0 to /24
    netmask_to_cidr() {
        local binary_mask=""
    
        IFS='.' read -ra ADDR <<<"$NETMASK"
        for octet in "${ADDR[@]}"; do
            binary_mask+=$(echo "obase=2; $octet" | bc)
        done
    
        local cidr=0
        for ((i=0; i<${#binary_mask}; i++)); do
            if [ "${binary_mask:$i:1}" == "1" ]; then
                ((cidr++))
            fi
        done
    
        echo "$cidr"
    }
    
    CIDR=$(netmask_to_cidr $NETMASK)
    NETWORK_ADDRESS=$(ipcalc -n $IP_ADDRESS $NETMASK | cut -d= -f2)
    IP_CIDR="${NETWORK_ADDRESS}/${CIDR}"
    
    # Device name for NIC
    DEVICE_NAME=$(nmcli -g NAME,DEVICE connection show | grep $NIC | awk -F: '{print $2}')
    
    echo "NIC name: $NIC"
    echo "mac addrss: $MAC"
    echo "ip address: $IP_ADDRESS"
    echo "netmask: $NETMASK"
    echo "IP_CIDR: $IP_CIDR"
    echo "default gateway: $GATEWAY"
    echo "device: $DEVICE_NAME"
    
    nmcli device modify "$DEVICE_NAME" +ipv4.routing-rules "priority 100 from $IP_ADDRESS table 200"
    nmcli device modify "$DEVICE_NAME" +ipv4.routes "0.0.0.0/0 $GATEWAY table=200"
    nmcli device modify "$DEVICE_NAME" +ipv4.routes "$IP_CIDR table=200"
    
    echo "The dual network card sending network configuration is completed."
  3. Esc键,输入:wq后按Enter键,保存配置。

  4. 执行以下命令,使辅助网卡eth1配置的策略路由生效。

    eth1:需替换为实际的网卡名称。

    sudo sh config_dual_traffic.sh eth1
  5. 执行以下命令,查看路由规则和路由项。

    ip rule
    ip route show table 200

    添加完成后,路由规则和路由项如下图所示。

    image