全部產品
Search
文件中心

Alibaba Cloud Linux:配置策略路由讓待發送流量根據源地址選擇路由

更新時間:Sep 04, 2024

在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