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インスタンスに永続的なポリシーベースのルートを設定した場合、インスタンスを再起動した後もルートは有効なままです。
次のコマンドを実行して、
config_dual_traffic.shファイルを作成して開きます。sudo vim config_dual_traffic.shIキーを押して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."Escキーを押して:wqと入力し、enterキーを押してファイルを保存して閉じます。次のコマンドを実行して、
eth1セカンダリNICに設定されているポリシーベースのルートを有効にします。eth1を実際のNIC名に置き換えます。
sudo sh config_dual_traffic.sh eth1次のコマンドを実行して、ルーティングルールとルートエントリを表示します。
ip rule ip route show table 200次のコマンド出力は、ポリシーベースのルートが設定されていることを示します。

一時的なポリシーベースのルートの設定
ECSインスタンスに一時的なポリシーベースのルートを設定した場合、インスタンスを再起動するとルートは無効になります。
次のコマンドを実行して、
config_dual_traffic.shファイルを作成して開きます。sudo vim config_dual_traffic.shIキーを押して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."Escキーを押して:wqと入力し、enterキーを押してファイルを保存して閉じます。次のコマンドを実行して、
eth1セカンダリNICに設定されているポリシーベースのルートを有効にします。eth1を実際のNIC名に置き換えます。
sudo sh config_dual_traffic.sh eth1次のコマンドを実行して、ルーティングルールとルートエントリを表示します。
ip rule ip route show table 200次のコマンド出力は、ポリシーベースのルートが設定されていることを示します。
