すべてのプロダクト
Search
ドキュメントセンター

Alibaba Cloud Linux:Alibaba Cloud Linux 3でポリシーベースのルートを設定し、送信元IPアドレスに基づいてトラフィックを転送する

最終更新日:Aug 16, 2024

Alibaba Cloud Linux 3を実行するElastic Compute Service (ECS) インスタンスの場合、デフォルトのルーティングアルゴリズムは、パケットの宛先IPアドレスに基づいてルートを選択します。 その結果、システムは、常に、eth1などのセカンダリNICの代わりに、eth0などのプライマリネットワークインターフェースコントローラ (NIC) を使用して、セカンダリNICから発生し、セカンダリNICのサブネットに宛てられたトラフィックを送信する。 上記の問題を解決するには、送信元IPアドレスに基づいてトラフィックを転送するポリシーベースのルートを設定します。

ポリシーベースのルートの設定

デフォルトでは、Alibaba Cloud Linux 3ではNetworkManagerがNICの設定に使用されます。 ポリシーベースのルートを設定するには、NetworkManagerが提供するnmcliツールを使用することを推奨します。 このセクションでは、eth1セカンダリNICのポリシーベースのルートを設定する方法について説明します。

永続的なポリシーベースのルートの設定

ECSインスタンスに永続的なポリシーベースのルートを設定した場合、インスタンスを再起動した後もルートは有効なままです。

  1. 次のコマンドを実行して、config_dual_traffic.shファイルを作成して開きます。

    sudo vim config_dual_traffic.sh
  2. Iキーを押してInsertモードに入り、次のコンテンツを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セカンダリNICに設定されているポリシーベースのルートを有効にします。

    eth1を実際のNIC名に置き換えます。

    sudo sh config_dual_traffic.sh eth1
  5. 次のコマンドを実行して、ルーティングルールとルートエントリを表示します。

    ip rule
    ip route show table 200

    次のコマンド出力は、ポリシーベースのルートが設定されていることを示します。

    image

一時的なポリシーベースのルートの設定

ECSインスタンスに一時的なポリシーベースのルートを設定した場合、インスタンスを再起動するとルートは無効になります。

  1. 次のコマンドを実行して、config_dual_traffic.shファイルを作成して開きます。

    sudo vim config_dual_traffic.sh
  2. Iキーを押してInsertモードに入り、次のコンテンツを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セカンダリNICに設定されているポリシーベースのルートを有効にします。

    eth1を実際のNIC名に置き換えます。

    sudo sh config_dual_traffic.sh eth1
  5. 次のコマンドを実行して、ルーティングルールとルートエントリを表示します。

    ip rule
    ip route show table 200

    次のコマンド出力は、ポリシーベースのルートが設定されていることを示します。

    image