在Alibaba Cloud Linux 3系统中,默认路由算法是根据报文的目的地址选择路由,这导致当待发送流量的源地址为辅助网卡(如eth1),且目的地址位于网卡子网内时,系统总是通过主网卡(如eth0)发送流量,而不会通过辅助网卡(如eth1)发送流量。为了解决这一问题,您可以配置策略路由,让待发送流量根据源地址选择路由。
使用限制
操作系统:Alibaba Cloud Linux 3。
配置策略路由
Alibaba Cloud Linux 3默认采用NetworkManager
配置网卡,因此推荐使用其提供的nmcli
工具来配置策略路由。本文以为辅助网卡eth1
配置策略路由为例说明。
持久化配置策略路由
持久化配置的策略路由,即使在重启实例后,配置依然被保留。
执行以下命令,创建并打开
config_dual_traffic.sh
文件。sudo vim config_dual_traffic.sh
按
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."
按
Esc
键,输入:wq
后按Enter
键,保存配置。执行以下命令,使辅助网卡
eth1
配置的策略路由生效。eth1:需替换为实际的网卡名称。
sudo sh config_dual_traffic.sh eth1
执行以下命令,查看路由规则和路由项。
ip rule ip route show table 200
添加完成后,路由规则和路由项如下图所示。
临时配置策略路由
临时配置的策略路由,将在实例重启后失效。
执行以下命令,创建并打开
config_dual_traffic.sh
文件。sudo vim config_dual_traffic.sh
按
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."
按
Esc
键,输入:wq
后按Enter
键,保存配置。执行以下命令,使辅助网卡
eth1
配置的策略路由生效。eth1:需替换为实际的网卡名称。
sudo sh config_dual_traffic.sh eth1
执行以下命令,查看路由规则和路由项。
ip rule ip route show table 200
添加完成后,路由规则和路由项如下图所示。
文档内容是否对您有帮助?