# 自动为多网卡Linux云服务器配置IPv4和IPv6策略路由（HCE 2.0/CentOS 8.0及以上）
#### 操作场景
本文档指导用户使用自动化脚本为双网卡Linux云服务器配置策略路由，**自动化脚本支持的操作系统包括Huawei Cloud EulerOS 2.0、CentOS 8.0及以上版本。**
- IPv4：若需实现多网卡云服务器间的IPv4通信，需要配置IPv4路由，请执行[Linux IPv4操作步骤]。
- IPv6：若需实现多网卡云服务器间的IPv6通信，需要配置IPv6路由，请执行[Linux IPv6操作步骤]。
- IPv4/IPv6双栈：若需实现多网卡间的IPv4和IPv6通信，需要同时配置IPv4和IPv6路由，请依次执行[Linux IPv4/IPv6双栈操作步骤]。
关于云服务器双网卡的背景知识及组网说明，请参见[方案概述](https://support.huaweicloud.com/usermanual-vpc/vpc_nic_0014.html#vpc_nic_0014)。
 #### Linux IPv4操作步骤
1. 收集配置策略路由需要的云服务器IPv4网卡地址等信息。 具体操作请参见[收集云服务器网络信息](https://support.huaweicloud.com/usermanual-vpc/vpc_nic_0015.html#vpc_nic_0015)。
   本示例中，云服务器的网络信息如[表1]所示。
    表1Linux IPv4信息说明 
   | 类型   | 主网卡                                                                                                                                                                                                                                                                                                                                                                                                                                                  | 扩展网卡                                                                                                                                                                                                                                                                                                                                                                                                                                       |
   |:---|:---|:---|
   | 源端  | - 网卡IPv4地址：10.0.0.115  - 子网IPv4网段：10.0.0.0/24  - 子网IPv4网关：10.0.0.1   | - 网卡IPv4地址：10.0.1.183  - 子网IPv4网段：10.0.1.0/24  - 子网IPv4网关：10.0.1.1   |
   | 目的端 | 网卡IPv4地址：10.0.2.12                                                                                                                                                                                                                                                                                                                                                                                                                                   | 不涉及                                                                                                                                                                                                                                                                                                                                                                                                                                         |
      
   
2. 登录源端云服务器。 ECS有多种登录方法，具体请参见[登录弹性云服务器](https://support.huaweicloud.com/ecs_faq/ecs_faq_0632.html)。
   
3. 执行以下命令，检查源端云服务器主网卡和目的端云服务器IPv4网络通信情况。 **配置多网卡策略路由前，请务必确保源端主网卡和目的端通信正常。**
   **ping -I** *源端云服务器主网卡IPv4地址* *目的端云服务器网卡IPv4地址*
   命令示例：
   ping -I 10.0.0.115 10.0.2.12
   回显类似如下信息，表示可以正常通信。
   ```
   [root@ecs-resource ~]# ping -I 10.0.0.115 10.0.2.12
   PING 10.0.2.12 (10.0.2.12) from 10.0.0.115 : 56(84) bytes of data.
   64 bytes from 10.0.2.12: icmp_seq=1 ttl=64 time=0.775 ms
   64 bytes from 10.0.2.12: icmp_seq=2 ttl=64 time=0.268 ms
   64 bytes from 10.0.2.12: icmp_seq=3 ttl=64 time=0.220 ms
   64 bytes from 10.0.2.12: icmp_seq=4 ttl=64 time=0.167 ms
   ^C
   --- 10.0.2.12 ping statistics ---
   ```
   
4. 执行以下命令，查看云服务器网卡名称。 ifconfig
   回显类似如下信息，通过网卡地址查找对应的网卡名称，本示例中：
   - 10.0.0.115为主网卡IPv4地址，对应的名称为eth0。
   
   - 10.0.1.183为扩展网卡IPv4地址，对应的名称为eth1。
   
   
   ```
   [root@ecs-resource ~]# ifconfig
   eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
           inet 10.0.0.115  netmask 255.255.255.0  broadcast 10.0.0.255
           inet6 fe80::f816:3eff:fe92:6e0e  prefixlen 64  scopeid 0x20<link>
           ether fa:16:3e:92:6e:0e  txqueuelen 1000  (Ethernet)
           RX packets 432288  bytes 135762012 (129.4 MiB)
           RX errors 0  dropped 0  overruns 0  frame 1655
           TX packets 423744  bytes 106716932 (101.7 MiB)
           TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
   eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
           inet 10.0.1.183  netmask 255.255.255.0  broadcast 10.0.1.255
           inet6 fe80::f816:3eff:febf:5818  prefixlen 64  scopeid 0x20<link>
           ether fa:16:3e:bf:58:18  txqueuelen 1000  (Ethernet)
           RX packets 9028  bytes 536972 (524.3 KiB)
           RX errors 0  dropped 0  overruns 0  frame 1915
           TX packets 6290  bytes 272473 (266.0 KiB)
           TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
   ```
   
5. 执行以下步骤，创建自动化脚本配置IPv4路由。
   1. 执行以下命令，创建自动化配置脚本文件**15-policy-route.sh** 。
      **vi /etc/NetworkManager/dispatcher.d/15-policy-route.sh**
      
   
   2. 按i进入编辑模式。
   
   3. 在文件中添加自动化脚本配置文件。
      ```
      #!/bin/bash
      if [ "$2" != "up" ]; then
          exit 0
      fi
      interface=$1
      check_route_table() {
          local route_table_id=$1
          local ip_version=$2
          local max_attempts=100
          local attempts=0
          while [ $attempts -lt $max_attempts ]; do
              output=$(ip -$ip_version route show table $route_table_id &>/dev/null)
              if [ $? -ne 0 ] || [ -z "$output" ]; then
                  break
              else
                  route_table_id=$((route_table_id + 1))
                  attempts=$((attempts + 1))
              fi
          done
          echo $route_table_id
      }
      add_ipv4_route_table() {
          local DEFAULT_IPV4_ROUTE_TABLE_ID=1000
          v4_route_table_id=$(ip route show table all | grep -F "default via $gateway dev $interface table" | awk '{print $NF}')
          if [ -z $v4_route_table_id ]; then
              interface_number=$(echo $interface | grep -o '[0-9]*$')
              if [ -z "$interface_number" ]; then
                  v4_route_table_id="$DEFAULT_IPV4_ROUTE_TABLE_ID"
              else
                  v4_route_table_id=$((DEFAULT_IPV4_ROUTE_TABLE_ID + interface_number))
              fi
              v4_route_table_id=$(check_route_table $v4_route_table_id 4)
              echo "add policy route for dev: $interface table: $v4_route_table_id subnet: $subnet gateway: $gateway"
              ip route add default via $gateway dev $interface table $v4_route_table_id
              ip route add $subnet dev $interface table $v4_route_table_id
          fi
      }
      generate_ipv4_policy_route() {
          subnet=$(nmcli device show $interface | grep -F 'IP4.ROUTE' | grep -F 'nh = 0.0.0.0' | cut -d'=' -f2 | cut -d',' -f1 | tr -d ' ' | head -n 1)
          gateway=$(ipcalc -i $subnet | awk '/HostMin/ {print $2}')
          add_ipv4_route_table
          nmcli device show $interface | grep -F 'IP4.ADDRESS' | while read -r line; do
              IP=$(echo $line | awk '{print $2}' | cut -d'/' -f1)
              if ip rule list | grep -F "$v4_route_table_id" | grep -q "$IP"; then
                  echo "ip rule already exists for $IP with table $v4_route_table_id"
                  continue
              fi
              echo "Adding rule for $IP on $interface with table $v4_route_table_id"
              ip rule add from $IP table $v4_route_table_id
          done
      }
      generate_ipv4_policy_route
      ```
      
   
   4. 按ESC退出，并输入:wq!保存配置。
   
   5. 执行以下命令，查看自动化配置脚本文件**15-policy-route.sh** 的权限。
      **ll /etc/NetworkManager/dispatcher.d/**
      回显类似如下信息，**15-policy-route.sh** 权限为**-rw-r--r--** ，和其他系统文件（比如**10-ifcfg-rh-routes.sh** ）的权限（**-rwxr-xr-x** ）不一样。
      ```
      [root@ecs-resource ~]# ll /etc/NetworkManager/dispatcher.d/
      total 36
      -rwxr-xr-x. 1 root root 3840 Feb 26 17:45 10-ifcfg-rh-routes.sh
      -rwxr-xr-x. 1 root root 1062 Feb 26 17:45 11-dhclient
      -rw-r--r--  1 root root 2019 Jun 18 12:21 15-policy-route.sh
      -rwxr-xr-x. 1 root root 1412 Feb 26 17:45 20-chrony-dhcp
      -rwxr-xr-x. 1 root root  455 Feb 26 17:45 20-chrony-onoffline
      -rwxrwxr-x  1 root root  719 May 10  2019 hook-network-manager
      drwxr-xr-x. 2 root root 4096 Apr 18 17:12 no-wait.d
      drwxr-xr-x. 2 root root 4096 Feb 26 17:45 pre-down.d
      drwxr-xr-x. 2 root root 4096 Apr 18 17:12 pre-up.d
      ```
      
   
   6. 执行以下命令，为自动化配置脚本文件**15-policy-route.sh** 添加权限。
      **sudo chown root:root /etc/NetworkManager/dispatcher.d/15-policy-route.sh**
      **sudo chmod 755 /etc/NetworkManager/dispatcher.d/15-policy-route.sh**
      
   
   7. 执行以下命令，再次查看自动化配置脚本文件**15-policy-route.sh** 的权限。
      **ll /etc/NetworkManager/dispatcher.d/**
      回显类似如下信息，**15-policy-route.sh** 权限为**-rwxr-xr-x。**
      ```
      [root@ecs-resource ~]# ll /etc/NetworkManager/dispatcher.d/
      total 36
      -rwxr-xr-x. 1 root root 3840 Feb 26 17:45 10-ifcfg-rh-routes.sh
      -rwxr-xr-x. 1 root root 1062 Feb 26 17:45 11-dhclient
      -rwxr-xr-x  1 root root 2019 Jun 18 12:21 15-policy-route.sh
      -rwxr-xr-x. 1 root root 1412 Feb 26 17:45 20-chrony-dhcp
      -rwxr-xr-x. 1 root root  455 Feb 26 17:45 20-chrony-onoffline
      -rwxrwxr-x  1 root root  719 May 10  2019 hook-network-manager
      drwxr-xr-x. 2 root root 4096 Apr 18 17:12 no-wait.d
      drwxr-xr-x. 2 root root 4096 Feb 26 17:45 pre-down.d
      drwxr-xr-x. 2 root root 4096 Apr 18 17:12 pre-up.d
      ```
      
   
   8. 执行以下命令，重启网络服务以触发脚本**15-policy-route.sh** 运行。
      **systemctl restart NetworkManager**
      ![](https://support.huaweicloud.com/usermanual-vpc/public_sys-resources/caution_3.0-zh-cn.png)
      重启网络服务时，此处请确保不影响业务再重启。
      
    
6. 依次执行以下命令，确认网卡IPv4策略路由是否添加成功。 **ip rule**
   **ip route show table 1000**
   **ip route show table** **1001**
   其中，**table** **1000** 为主网卡的路由表名称，**table** **1001**为扩展网卡的路由表名称。
   回显类似如下信息，表示IPv4策略路由添加成功。
   ```
   [root@ecs-resource ~]# ip rule
   0:      from all lookup local
   32764:  from 10.0.1.183 lookup 1001
   32765:  from 10.0.0.115 lookup 1000
   32766:  from all lookup main
   32767:  from all lookup default
   [root@ecs-resource ~]# ip route show table 1000
   default via 10.0.0.1 dev eth0 
   10.0.0.0/24 dev eth0 scope link 
   [root@ecs-resource ~]# ip route show table 1001
   default via 10.0.1.1 dev eth1 
   10.0.1.0/24 dev eth1 scope link
   ```
   
7. 执行以下命令，验证源端云服务器和目的端云服务器是否可以通过IPv4地址正常通信。 **ping -I** *源端云服务器主网卡IPv4地址 目的端云服务器网卡IPv4地址*
   **ping -I** *源端云服务器扩展网卡IPv4地址 目的端云服务器网卡IPv4地址*
   命令示例：
   **ping -I 10.0.0.115 10.0.2.12**
   **ping -I 10.0.1.183 10.0.2.12**
   回显类似如下信息，源端两个IPv4地址均可以和目的端正常通信，表示IPv4策略路由配置成功。
   ```
   [root@ecs-resource ~]# ping -I 10.0.0.115 10.0.2.12
   PING 10.0.2.12 (10.0.2.12) from 10.0.0.115 : 56(84) bytes of data.
   64 bytes from 10.0.2.12: icmp_seq=1 ttl=64 time=0.231 ms
   64 bytes from 10.0.2.12: icmp_seq=2 ttl=64 time=0.195 ms
   ^C
   --- 10.0.2.12 ping statistics ---
   2 packets transmitted, 2 received, 0% packet loss, time 1043ms
   rtt min/avg/max/mdev = 0.195/0.213/0.231/0.018 ms
   [root@ecs-resource ~]# ping -I 10.0.1.183 10.0.2.12
   PING 10.0.2.12 (10.0.2.12) from 10.0.1.183 : 56(84) bytes of data.
   64 bytes from 10.0.2.12: icmp_seq=1 ttl=64 time=0.274 ms
   64 bytes from 10.0.2.12: icmp_seq=2 ttl=64 time=0.196 ms
   64 bytes from 10.0.2.12: icmp_seq=3 ttl=64 time=0.125 ms
   ^C
   --- 10.0.2.12 ping statistics ---
   3 packets transmitted, 3 received, 0% packet loss, time 2042ms
   rtt min/avg/max/mdev = 0.125/0.198/0.274/0.060 ms
   ```
   
 
 #### Linux IPv6操作步骤
1. 收集配置策略路由需要的云服务器网卡IPv4和IPv6地址等信息。 具体操作请参见[收集云服务器网络信息](https://support.huaweicloud.com/usermanual-vpc/vpc_nic_0015.html#vpc_nic_0015)。
   本示例中，云服务器的网络信息如[表2]所示。
    表2Linux IPv4和IPv6信息说明 
   | 类型   | 主网卡                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   | 扩展网卡                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
   |:---|:---|:---|
   | 源端 | - 网卡IPv4地址：10.0.0.133  - 网卡IPv6地址：2407:c080:802:1f85:918b:9039:41b2:24a8  - 子网IPv6网段：2407:c080:802:1f85::/64  - 子网IPv6网关：2407:c080:802:1f85::1   | - 网卡IPv4地址：10.0.1.120  - 网卡IPv6地址：2407:c080:802:2107:ab85:4a27:d20:2119  - 子网IPv6网段：2407:c080:802:2107::/64  - 子网IPv6网关：2407:c080:802:2107::1   |
   | 目的端  | - 网卡IPv4地址：10.0.2.3  - 网卡IPv6地址：2407:c080:802:2108:96ec:3c49:391a:5ebc                                                                                                                                                                                                                                                                                                                          | 不涉及                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
      
   
2. 登录源端云服务器。 ECS有多种登录方法，具体请参见[登录弹性云服务器](https://support.huaweicloud.com/ecs_faq/ecs_faq_0632.html)。
   
3. 执行以下步骤，确保云服务器已开启IPv6协议栈，并且正常获取到IPv6地址。
   ![](https://support.huaweicloud.com/usermanual-vpc/public_sys-resources/caution_3.0-zh-cn.png)
   对于源端和目的端的IPv6云服务器，均需要执行该操作，确保云服务器已获取到IPv6地址，否则云服务器无法通过IPv6地址进行通信。
   本章节云服务器使用的操作系统适用**于CentOS 8.0 64bit** 和**Huawei Cloud EulerOS 2.0 标准版 64位** 公共镜像，以下针对该操作系统举例，更多操作系统配置指导，请参见[动态获取IPv6地址](https://support.huaweicloud.com/usermanual-ecs/ecs_03_0508.html#ecs_03_0508__zh-cn_topic_0129883696_section7426172116710)的"Linux操作系统（手动配置启用IPv6）" 小节。
   1. 执行以下命令，检查云服务器是否可以获取到IPv6地址。
      ip addr
      回显类似如下信息，eth0和eth1为云服务器的网卡，只有一行inet6地址，为fe80开头，表示该云服务器已开启IPv6协议栈，但是未获取到IPv6地址，需要继续执行[3.b]\~[3.g]，获取IPv6地址。
      ```
      [root@ecs-resource ~]# ip addr
      ...
      2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
          link/ether fa:16:3e:72:72:f7 brd ff:ff:ff:ff:ff:ff
          inet 10.0.0.133/24 brd 10.0.0.255 scope global dynamic noprefixroute eth0
             valid_lft 315359994sec preferred_lft 315359994sec
          inet6 fe80::f816:3eff:fe72:72f7/64 scope link noprefixroute 
             valid_lft forever preferred_lft forever
      3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
          link/ether fa:16:3e:72:73:ea brd ff:ff:ff:ff:ff:ff
          inet 10.0.1.120/24 brd 10.0.1.255 scope global dynamic noprefixroute eth1
             valid_lft 315359994sec preferred_lft 315359994sec
          inet6 fe80::f816:3eff:fe72:73ea/64 scope link noprefixroute 
             valid_lft forever preferred_lft forever
      ```
      
   
   2. 执行以下命令，查看云服务器网卡名称。
      ifconfig
      回显类似如下信息，通过网卡地址查找对应的网卡名称，本示例中：
      - 10.0.0.133为主网卡IPv4地址，对应的名称为eth0。
      
      - 10.0.1.120为扩展网卡IPv4地址，对应的名称为eth1。
      
      
      ```
      [root@ecs-resource ~]# ifconfig
      eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
              inet 10.0.0.133  netmask 255.255.255.0  broadcast 10.0.0.255
              inet6 fe80::f816:3eff:fe72:72f7  prefixlen 64  scopeid 0x20<link>
              ether fa:16:3e:72:72:f7  txqueuelen 1000  (Ethernet)
              RX packets 50917  bytes 71068144 (67.7 MiB)
              RX errors 0  dropped 0  overruns 0  frame 0
              TX packets 4969  bytes 1123356 (1.0 MiB)
              TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
      eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
              inet 10.0.1.120  netmask 255.255.255.0  broadcast 10.0.1.255
              inet6 fe80::f816:3eff:fe72:73ea  prefixlen 64  scopeid 0x20<link>
              ether fa:16:3e:72:73:ea  txqueuelen 1000  (Ethernet)
              RX packets 21  bytes 3190 (3.1 KiB)
              RX errors 0  dropped 0  overruns 0  frame 0
              TX packets 26  bytes 2934 (2.8 KiB)
              TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
      ...
      ```
      
   
   3. 执行以下步骤，编辑主网卡的ifcfg文件。
      1. 执行以下命令，打开主网卡的ifcfg文件。 **vi /etc/sysconfig/network-scripts/ifcfg-** *主网卡名称*
         其中，主网卡名称为[3.b]中查询到的名称。
         命令示例：
         **vi /etc/sysconfig/network-scripts/ifcfg-eth0**
         
      
      2. 按i进入编辑模式。
      
      3. 在文件末尾添加以下配置。
         ```
         IPV6INIT="yes"
         DHCPV6C="yes"
         ```
         
      
      4. 按ESC退出，并输入:wq!保存配置。
       
   
   4. 执行以下步骤，编辑扩展网卡的ifcfg文件。
      1. 执行以下命令，打开扩展网卡的ifcfg文件。 **vi /etc/sysconfig/network-scripts/ifcfg-** *扩展网卡名称*
         其中，扩展网卡名称为[3.b]中查询到的名称。
         命令示例：
         **vi /etc/sysconfig/network-scripts/ifcfg-eth1**
         
      
      2. 按i进入编辑模式。
      
      3. 在文件末尾添加以下配置。
         ```
         IPV6INIT="yes"
         DHCPV6C="yes"
         ```
         
      
      4. 按ESC退出，并输入:wq!保存配置。
       
   
   5. 执行以下步骤，编辑"/etc/sysconfig/network"文件。
      1. 执行以下命令，打开"/etc/sysconfig/network"文件。 **vi /etc/sysconfig/network**
         
      
      2. 按i进入编辑模式。
      
      3. 在文件末尾添加以下配置。
         ```
         NETWORKING_IPV6="yes"
         ```
         
      
      4. 按ESC退出，并输入:wq!保存配置。
       
   
   6. 执行以下命令，重启网络服务使配置生效。 systemctl restart NetworkManager
      
   
   7. 执行以下命令，检查云服务器是否可以获取到IPv6地址。
      ip addr
      回显类似如下信息，eth0和eth1网卡有两行inet6地址，新增一行2407开头的地址，表示配置成功。
      ```
      [root@ecs-resource ~]# ip addr
      ...
      2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
          link/ether fa:16:3e:72:72:f7 brd ff:ff:ff:ff:ff:ff
          inet 10.0.0.133/24 brd 10.0.0.255 scope global dynamic noprefixroute eth0
             valid_lft 315359994sec preferred_lft 315359994sec
          inet6 2407:c080:802:1f85:918b:9039:41b2:24a8/128 scope global dynamic noprefixroute 
             valid_lft 7194sec preferred_lft 7194sec
          inet6 fe80::f816:3eff:fe72:72f7/64 scope link noprefixroute 
             valid_lft forever preferred_lft forever
      3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
          link/ether fa:16:3e:72:73:ea brd ff:ff:ff:ff:ff:ff
          inet 10.0.1.120/24 brd 10.0.1.255 scope global dynamic noprefixroute eth1
             valid_lft 315359994sec preferred_lft 315359994sec
          inet6 2407:c080:802:2107:ab85:4a27:d20:2119/128 scope global dynamic noprefixroute 
             valid_lft 7195sec preferred_lft 7195sec
          inet6 fe80::f816:3eff:fe72:73ea/64 scope link noprefixroute 
             valid_lft forever preferred_lft forever
      ```
      
   
   8. 登录目的端云服务器，参考[3.a]\~[3.g]，配置目的云服务器获取IPv6地址。
    
4. 登录源端云服务器，执行以下命令，检查源端云服务器主网卡和目的端云服务器通信情况。 **配置多网卡策略路由前，请务必确保源端主网卡和目的端通信正常。**
   **ping6 -I** *源端云服务器主网卡IPv6地址* *目的端云服务器网卡IPv6地址*
   命令示例：
   **ping6 -I 2407:c080:802:1f85:918b:9039:41b2:24a8 2407:c080:802:2108:96ec:3c49:391a:5ebc**
   回显类似如下信息，表示可以正常通信。
   ```
   [root@ecs-resource ~]# ping6 -I 2407:c080:802:1f85:918b:9039:41b2:24a8 2407:c080:802:2108:96ec:3c49:391a:5ebc
   PING 2407:c080:802:2108:96ec:3c49:391a:5ebc(2407:c080:802:2108:96ec:3c49:391a:5ebc) from 2407:c080:802:1f85:918b:9039:41b2:24a8 : 56 data bytes
   64 bytes from 2407:c080:802:2108:96ec:3c49:391a:5ebc: icmp_seq=1 ttl=64 time=0.283 ms
   64 bytes from 2407:c080:802:2108:96ec:3c49:391a:5ebc: icmp_seq=2 ttl=64 time=0.212 ms
   64 bytes from 2407:c080:802:2108:96ec:3c49:391a:5ebc: icmp_seq=3 ttl=64 time=0.122 ms
   ^C
   --- 2407:c080:802:2108:96ec:3c49:391a:5ebc ping statistics ---
   3 packets transmitted, 3 received, 0% packet loss, time 2050ms
   rtt min/avg/max/mdev = 0.122/0.205/0.283/0.065 ms
   ```
   
5. 执行以下步骤，创建自动化脚本配置IPv6路由。
   1. 执行以下命令，创建自动化配置脚本文件**15-policy-route.sh** 。
      **vi /etc/NetworkManager/dispatcher.d/15-policy-route.sh**
      
   
   2. 按i进入编辑模式。
   
   3. 在文件中添加自动化脚本配置文件。
      ```
      #!/bin/bash
      if [ "$2" != "up" ]; then
          exit 0
      fi
      interface=$1
      check_route_table() {
          local route_table_id=$1
          local ip_version=$2
          local max_attempts=100
          local attempts=0
          while [ $attempts -lt $max_attempts ]; do
              output=$(ip -$ip_version route show table $route_table_id &>/dev/null)
              if [ $? -ne 0 ] || [ -z "$output" ]; then
                  break
              else
                  route_table_id=$((route_table_id + 1))
                  attempts=$((attempts + 1))
              fi
          done
          echo $route_table_id
      }
      add_ipv6_route_table() {
          local DEFAULT_IPV6_ROUTE_TABLE_ID=1100
          v6_route_table_id=$(ip -6 route show table all | grep -F "default via $v6_gateway dev $interface table" | grep -oP "table \K\d+")
          if [ -z $v6_route_table_id ]; then
              interface_number=$(echo $interface | grep -o '[0-9]*$')
              if [ -z "$interface_number" ]; then
                  v6_route_table_id=$DEFAULT_IPV6_ROUTE_TABLE_ID
              else
                  v6_route_table_id=$((DEFAULT_IPV6_ROUTE_TABLE_ID + interface_number))
              fi
              v6_route_table_id=$(check_route_table $v6_route_table_id 6)
              echo "add policy route for dev: $interface table: $v6_route_table_id v6_subnet: $v6_subnet v6_gateway: $v6_gateway"
              ip -6 route add default via $v6_gateway dev $interface table $v6_route_table_id
              ip -6 route add $v6_subnet dev $interface table $v6_route_table_id
          fi
      }
      generate_ipv6_policy_route() {
          IPV6INIT=$(awk -F= '/^IPV6INIT=/{gsub(/"/, ""); print $2}' "/etc/sysconfig/network-scripts/ifcfg-$interface" | tr -d ' ' | tail -n 1)
          if [ "$IPV6INIT" != "yes" ]; then
              echo "$interface IPV6INIT is not set to yes, skip IPv6 policy route configurate."
              return 0
          fi
          for ((x=0; x<10; x++)); do
              if (ip address show $interface | grep -F "inet6" | grep -F "dynamic"); then
                  v6_subnet=$(nmcli device show $interface | grep -F 'IP6.ROUTE' | grep -F 'nh = ::'| grep -v 'dst = fe80' | grep -v '/128' | cut -d'=' -f2 | cut -d',' -f1 | tr -d ' ' | head -n 1)
                  v6_gateway=$(ipcalc -6 -i $v6_subnet | awk '/HostMin/ {print $2}')1
                  add_ipv6_route_table
                  nmcli device show $interface | grep -F 'IP6.ADDRESS' | grep -v "/64" | while read -r line; do
                      IP=$(echo $line | awk '{print $2}' | cut -d'/' -f1)
                      if ip -6 rule list | grep -F "$v6_route_table_id" | grep -q "$IP"; then
                          echo "ip rule already exists for $IP with table $v6_route_table_id"
                          continue
                      fi
                      echo "Adding rule for $IP on $interface with table $v6_route_table_id"
                      ip -6 rule add from $IP table $v6_route_table_id
                  done
                  break
              fi
                sleep 1
          done
      }
      generate_ipv6_policy_route
      ```
      
   
   4. 按ESC退出，并输入:wq!保存配置。
   
   5. 执行以下命令，查看自动化配置脚本文件**15-policy-route.sh** 的权限。
      **ll /etc/NetworkManager/dispatcher.d/**
      回显类似如下信息，**15-policy-route.sh** 权限为**-rw-r--r--** ，和其他系统文件（比如**10-ifcfg-rh-routes.sh** ）的权限（**-rwxr-xr-x** ）不一样。
      ```
      [root@ecs-resource ~]# ll /etc/NetworkManager/dispatcher.d/
      total 36
      -rwxr-xr-x. 1 root root 3840 Feb 26 17:45 10-ifcfg-rh-routes.sh
      -rwxr-xr-x. 1 root root 1062 Feb 26 17:45 11-dhclient
      -rw-r--r--  1 root root 2515 Jun 18 15:13 15-policy-route.sh
      -rwxr-xr-x. 1 root root 1412 Feb 26 17:45 20-chrony-dhcp
      -rwxr-xr-x. 1 root root  455 Feb 26 17:45 20-chrony-onoffline
      -rwxrwxr-x  1 root root  719 May 10  2019 hook-network-manager
      drwxr-xr-x. 2 root root 4096 Apr 18 17:12 no-wait.d
      drwxr-xr-x. 2 root root 4096 Feb 26 17:45 pre-down.d
      drwxr-xr-x. 2 root root 4096 Apr 18 17:12 pre-up.d
      ```
      
   
   6. 执行以下命令，为自动化配置脚本文件**15-policy-route.sh** 添加权限。
      **sudo chown root:root /etc/NetworkManager/dispatcher.d/15-policy-route.sh**
      **sudo chmod 755 /etc/NetworkManager/dispatcher.d/15-policy-route.sh**
      
   
   7. 执行以下命令，再次查看自动化配置脚本文件**15-policy-route.sh** 的权限。
      **ll /etc/NetworkManager/dispatcher.d/**
      回显类似如下信息，**15-policy-route.sh** 权限为**-rwxr-xr-x。**
      ```
      [root@ecs-resource ~]# ll /etc/NetworkManager/dispatcher.d/
      total 36
      -rwxr-xr-x. 1 root root 3840 Feb 26 17:45 10-ifcfg-rh-routes.sh
      -rwxr-xr-x. 1 root root 1062 Feb 26 17:45 11-dhclient
      -rwxr-xr-x  1 root root 2019 Jun 18 12:21 15-policy-route.sh
      -rwxr-xr-x. 1 root root 1412 Feb 26 17:45 20-chrony-dhcp
      -rwxr-xr-x. 1 root root  455 Feb 26 17:45 20-chrony-onoffline
      -rwxrwxr-x  1 root root  719 May 10  2019 hook-network-manager
      drwxr-xr-x. 2 root root 4096 Apr 18 17:12 no-wait.d
      drwxr-xr-x. 2 root root 4096 Feb 26 17:45 pre-down.d
      drwxr-xr-x. 2 root root 4096 Apr 18 17:12 pre-up.d
      ```
      
   
   8. 执行以下命令，重启网络服务以触发脚本**15-policy-route.sh** 运行。
      **systemctl restart NetworkManager**
      ![](https://support.huaweicloud.com/usermanual-vpc/public_sys-resources/caution_3.0-zh-cn.png)
      重启网络服务时，此处请确保不影响业务再重启。
      
    
6. 依次执行以下命令，确认网卡IPv6策略路由是否添加成功。
   **ip -6 rule**
   **ip -6 route show table 1100**
   **ip -6 route show table 1101**
   其中，**table 1100** 为主网卡的路由表名称，**table** **1101**为扩展网卡的路由表名称。
   回显类似如下信息，表示IPv6策略路由添加成功。
   ```
   [root@ecs-resource ~]# ip -6 rule
   0:      from all lookup local
   32764:  from 2407:c080:802:2107:ab85:4a27:d20:2119 lookup 1101
   32765:  from 2407:c080:802:1f85:918b:9039:41b2:24a8 lookup 1100
   32766:  from all lookup main
   [root@ecs-resource ~]# ip -6 route show table 1100
   2407:c080:802:1f85::/64 dev eth0 metric 1024 pref medium
   default via 2407:c080:802:1f85::1 dev eth0 metric 1024 pref medium
   [root@ecs-resource ~]# ip -6 route show table 1101
   2407:c080:802:2107::/64 dev eth1 metric 1024 pref medium
   default via 2407:c080:802:2107::1 dev eth1 metric 1024 pref medium
   ```
   
7. 执行以下命令，验证源端云服务器和目的端云服务器可以通过IPv6地址正常通信。 **ping -6 -I** *源端云服务器主网卡IPv6地址 目的端云服务器网卡IPv6地址*
   **ping -6 -I** *源端云服务器扩展网卡IPv6地址 目的端云服务器网卡IPv6地址*
   命令示例：
   **ping -6 -I 2407:c080:802:1f85:918b:9039:41b2:24a8 2407:c080:802:2108:96ec:3c49:391a:5ebc**
   **ping -6 -I 2407:c080:802:2107:ab85:4a27:d20:2119 2407:c080:802:2108:96ec:3c49:391a:5ebc**
   回显类似如下信息，源端两个IPv6地址均可以和目的端正常通信，表示IPv6策略路由配置成功。
   ```
   [root@ecs-resource ~]# ping -6 -I 2407:c080:802:1f85:918b:9039:41b2:24a8 2407:c080:802:2108:96ec:3c49:391a:5ebc
   PING 2407:c080:802:2108:96ec:3c49:391a:5ebc(2407:c080:802:2108:96ec:3c49:391a:5ebc) from 2407:c080:802:1f85:918b:9039:41b2:24a8 : 56 data bytes
   64 bytes from 2407:c080:802:2108:96ec:3c49:391a:5ebc: icmp_seq=1 ttl=64 time=0.328 ms
   64 bytes from 2407:c080:802:2108:96ec:3c49:391a:5ebc: icmp_seq=2 ttl=64 time=0.209 ms
   ^C
   --- 2407:c080:802:2108:96ec:3c49:391a:5ebc ping statistics ---
   2 packets transmitted, 2 received, 0% packet loss, time 1016ms
   rtt min/avg/max/mdev = 0.209/0.268/0.328/0.059 ms
   [root@ecs-resource ~]# ping -6 -I 2407:c080:802:2107:ab85:4a27:d20:2119 2407:c080:802:2108:96ec:3c49:391a:5ebc
   PING 2407:c080:802:2108:96ec:3c49:391a:5ebc(2407:c080:802:2108:96ec:3c49:391a:5ebc) from 2407:c080:802:2107:ab85:4a27:d20:2119 : 56 data bytes
   64 bytes from 2407:c080:802:2108:96ec:3c49:391a:5ebc: icmp_seq=1 ttl=64 time=0.345 ms
   64 bytes from 2407:c080:802:2108:96ec:3c49:391a:5ebc: icmp_seq=2 ttl=64 time=0.203 ms
   ^C
   --- 2407:c080:802:2108:96ec:3c49:391a:5ebc ping statistics ---
   2 packets transmitted, 2 received, 0% packet loss, time 1051ms
   rtt min/avg/max/mdev = 0.203/0.274/0.345/0.071 ms
   ```
   
 
 #### Linux IPv4/IPv6双栈操作步骤
1. 收集配置策略路由需要的云服务器网卡IPv4和IPv6地址等信息。 具体操作请参见[收集云服务器网络信息](https://support.huaweicloud.com/usermanual-vpc/vpc_nic_0015.html#vpc_nic_0015)。
   本示例中，云服务器的网络信息如[表3]所示。
    表3Linux IPv4和IPv6信息说明 
   | 类型   | 主网卡                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           | 扩展网卡                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
   |:---|:---|:---|
   | 源端 | - 网卡IPv4地址：10.0.0.133  - 网卡IPv6地址：2407:c080:802:1f85:918b:9039:41b2:24a8  - 子网IPv6网段：2407:c080:802:1f85::/64  - 子网IPv6网关：2407:c080:802:1f85::1   | - 网卡IPv4地址：10.0.1.120  - 网卡IPv6地址：2407:c080:802:2107:ab85:4a27:d20:2119  - 子网IPv6网段：2407:c080:802:2107::/64  - 子网IPv6网关：2407:c080:802:2107::1   |
   | 目的端  | - 网卡IPv4地址：10.0.2.3  - 网卡IPv6地址：2407:c080:802:2108:96ec:3c49:391a:5ebc                                                                                                                                                                                                                                                                                                                                                                                                                                              | 不涉及                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
      
   
2. 登录源端云服务器。 ECS有多种登录方法，具体请参见[登录弹性云服务器](https://support.huaweicloud.com/ecs_faq/ecs_faq_0632.html)。
   
3. 执行以下命令，检查源端云服务器主网卡和目的端云服务器IPv4网络通信情况。 **配置多网卡策略路由前，请务必确保源端主网卡和目的端通信正常。**
   **ping -I** *源端云服务器主网卡IPv4地址* *目的端云服务器IPv4地址*
   命令示例：
   ping -I 10.0.0.115 10.0.2.12
   回显类似如下信息，表示可以正常通信。
   ```
   [root@ecs-resource ~]# ping -I 10.0.0.133 10.0.2.3
   PING 10.0.2.3 (10.0.2.3) from 10.0.0.133 : 56(84) bytes of data.
   64 bytes from 10.0.2.3: icmp_seq=1 ttl=64 time=0.261 ms
   64 bytes from 10.0.2.3: icmp_seq=2 ttl=64 time=0.219 ms
   ^C
   --- 10.0.2.3 ping statistics ---
   2 packets transmitted, 2 received, 0% packet loss, time 1032ms
   rtt min/avg/max/mdev = 0.219/0.240/0.261/0.021 ms
   ```
   
4. 执行以下步骤，确保云服务器已开启IPv6协议栈，并且正常获取到IPv6地址。
   ![](https://support.huaweicloud.com/usermanual-vpc/public_sys-resources/caution_3.0-zh-cn.png)
   对于源端和目的端的IPv6云服务器，均需要执行该操作，确保云服务器已获取到IPv6地址，否则云服务器无法通过IPv6地址进行通信。
   本章节云服务器使用的操作系统适用**于CentOS 8.0 64bit** 和**Huawei Cloud EulerOS 2.0 标准版 64位** 公共镜像，以下针对该操作系统举例，更多操作系统配置指导，请参见[动态获取IPv6地址](https://support.huaweicloud.com/usermanual-ecs/ecs_03_0508.html#ecs_03_0508__zh-cn_topic_0129883696_section7426172116710)的"Linux操作系统（手动配置启用IPv6）" 小节。
   1. 执行以下命令，检查云服务器是否可以获取到IPv6地址。
      ip addr
      回显类似如下信息，eth0和eth1为云服务器的网卡，只有一行inet6地址，为fe80开头，表示该云服务器已开启IPv6协议栈，但是未获取到IPv6地址，需要继续执行[4.b]\~[4.g]，获取IPv6地址。
      ```
      [root@ecs-resource ~]# ip addr
      ...
      2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
          link/ether fa:16:3e:72:72:f7 brd ff:ff:ff:ff:ff:ff
          inet 10.0.0.133/24 brd 10.0.0.255 scope global dynamic noprefixroute eth0
             valid_lft 315359994sec preferred_lft 315359994sec
          inet6 fe80::f816:3eff:fe72:72f7/64 scope link noprefixroute 
             valid_lft forever preferred_lft forever
      3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
          link/ether fa:16:3e:72:73:ea brd ff:ff:ff:ff:ff:ff
          inet 10.0.1.120/24 brd 10.0.1.255 scope global dynamic noprefixroute eth1
             valid_lft 315359994sec preferred_lft 315359994sec
          inet6 fe80::f816:3eff:fe72:73ea/64 scope link noprefixroute 
             valid_lft forever preferred_lft forever
      ```
      
   
   2. 执行以下命令，查看云服务器网卡名称。
      ifconfig
      回显类似如下信息，通过网卡地址查找对应的网卡名称，本示例中：
      - 10.0.0.133为主网卡IPv4地址，对应的名称为eth0。
      
      - 10.0.1.120为扩展网卡IPv4地址，对应的名称为eth1。
      
      
      ```
      [root@ecs-resource ~]# ifconfig
      eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
              inet 10.0.0.133  netmask 255.255.255.0  broadcast 10.0.0.255
              inet6 fe80::f816:3eff:fe72:72f7  prefixlen 64  scopeid 0x20<link>
              ether fa:16:3e:72:72:f7  txqueuelen 1000  (Ethernet)
              RX packets 50917  bytes 71068144 (67.7 MiB)
              RX errors 0  dropped 0  overruns 0  frame 0
              TX packets 4969  bytes 1123356 (1.0 MiB)
              TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
      eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
              inet 10.0.1.120  netmask 255.255.255.0  broadcast 10.0.1.255
              inet6 fe80::f816:3eff:fe72:73ea  prefixlen 64  scopeid 0x20<link>
              ether fa:16:3e:72:73:ea  txqueuelen 1000  (Ethernet)
              RX packets 21  bytes 3190 (3.1 KiB)
              RX errors 0  dropped 0  overruns 0  frame 0
              TX packets 26  bytes 2934 (2.8 KiB)
              TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
      ...
      ```
      
   
   3. 执行以下步骤，编辑主网卡的ifcfg文件。
      1. 执行以下命令，打开主网卡的ifcfg文件。 **vi /etc/sysconfig/network-scripts/ifcfg-** *主网卡名称*
         其中，主网卡名称为[4.b]中查询到的名称。
         命令示例：
         **vi /etc/sysconfig/network-scripts/ifcfg-eth0**
         
      
      2. 按i进入编辑模式。
      
      3. 在文件末尾添加以下配置。
         ```
         IPV6INIT="yes"
         DHCPV6C="yes"
         ```
         
      
      4. 按ESC退出，并输入:wq!保存配置。
       
   
   4. 执行以下步骤，编辑扩展网卡的ifcfg文件。
      1. 执行以下命令，打开扩展网卡的ifcfg文件。 **vi /etc/sysconfig/network-scripts/ifcfg-** *扩展网卡名称*
         其中，扩展网卡名称为[4.b]中查询到的名称。
         命令示例：
         **vi /etc/sysconfig/network-scripts/ifcfg-eth1**
         
      
      2. 按i进入编辑模式。
      
      3. 在文件末尾添加以下配置。
         ```
         IPV6INIT="yes"
         DHCPV6C="yes"
         ```
         
      
      4. 按ESC退出，并输入:wq!保存配置。
       
   
   5. 执行以下步骤，编辑"/etc/sysconfig/network"文件。
      1. 执行以下命令，打开"/etc/sysconfig/network"文件。 **vi /etc/sysconfig/network**
         
      
      2. 按i进入编辑模式。
      
      3. 在文件末尾添加以下配置。
         ```
         NETWORKING_IPV6="yes"
         ```
         
      
      4. 按ESC退出，并输入:wq!保存配置。
       
   
   6. 执行以下命令，重启网络服务使配置生效。 systemctl restart NetworkManager
      
   
   7. 执行以下命令，检查云服务器是否可以获取到IPv6地址。
      ip addr
      回显类似如下信息，eth0和eth1网卡有两行inet6地址，新增一行2407开头的地址，表示配置成功。
      ```
      [root@ecs-resource ~]# ip addr
      ...
      2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
          link/ether fa:16:3e:72:72:f7 brd ff:ff:ff:ff:ff:ff
          inet 10.0.0.133/24 brd 10.0.0.255 scope global dynamic noprefixroute eth0
             valid_lft 315359994sec preferred_lft 315359994sec
          inet6 2407:c080:802:1f85:918b:9039:41b2:24a8/128 scope global dynamic noprefixroute 
             valid_lft 7194sec preferred_lft 7194sec
          inet6 fe80::f816:3eff:fe72:72f7/64 scope link noprefixroute 
             valid_lft forever preferred_lft forever
      3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
          link/ether fa:16:3e:72:73:ea brd ff:ff:ff:ff:ff:ff
          inet 10.0.1.120/24 brd 10.0.1.255 scope global dynamic noprefixroute eth1
             valid_lft 315359994sec preferred_lft 315359994sec
          inet6 2407:c080:802:2107:ab85:4a27:d20:2119/128 scope global dynamic noprefixroute 
             valid_lft 7195sec preferred_lft 7195sec
          inet6 fe80::f816:3eff:fe72:73ea/64 scope link noprefixroute 
             valid_lft forever preferred_lft forever
      ```
      
   
   8. 登录目的端云服务器，参考[4.a]\~[4.g]，配置目的云服务器获取IPv6地址。
    
5. 登录源端云服务器，执行以下命令，检查源端云服务器主网卡和目的端云服务器通信情况。 **配置多网卡策略路由前，请务必确保源端主网卡和目的端通信正常。**
   **ping6 -I** *源端云服务器主网卡IPv6地址* *目的端云服务器网卡IPv6地址*
   命令示例：
   **ping6 -I 2407:c080:802:1f85:918b:9039:41b2:24a8 2407:c080:802:2108:96ec:3c49:391a:5ebc**
   回显类似如下信息，表示可以正常通信。
   ```
   [root@ecs-resource ~]# ping6 -I 2407:c080:802:1f85:918b:9039:41b2:24a8 2407:c080:802:2108:96ec:3c49:391a:5ebc
   PING 2407:c080:802:2108:96ec:3c49:391a:5ebc(2407:c080:802:2108:96ec:3c49:391a:5ebc) from 2407:c080:802:1f85:918b:9039:41b2:24a8 : 56 data bytes
   64 bytes from 2407:c080:802:2108:96ec:3c49:391a:5ebc: icmp_seq=1 ttl=64 time=0.283 ms
   64 bytes from 2407:c080:802:2108:96ec:3c49:391a:5ebc: icmp_seq=2 ttl=64 time=0.212 ms
   64 bytes from 2407:c080:802:2108:96ec:3c49:391a:5ebc: icmp_seq=3 ttl=64 time=0.122 ms
   ^C
   --- 2407:c080:802:2108:96ec:3c49:391a:5ebc ping statistics ---
   3 packets transmitted, 3 received, 0% packet loss, time 2050ms
   rtt min/avg/max/mdev = 0.122/0.205/0.283/0.065 ms
   ```
   
6. 执行以下步骤，创建自动化脚本配置IPv4和IPv6路由。
   1. 执行以下命令，创建自动化配置脚本文件**15-policy-route.sh** 。
      **vi /etc/NetworkManager/dispatcher.d/15-policy-route.sh**
      
   
   2. 按i进入编辑模式。
   
   3. 在文件中添加自动化脚本配置文件。
      ```
      #!/bin/bash
      if [ "$2" != "up" ]; then
          exit 0
      fi
      interface=$1
      check_route_table() {
          local route_table_id=$1
          local ip_version=$2
          local max_attempts=100
          local attempts=0
          while [ $attempts -lt $max_attempts ]; do
              output=$(ip -$ip_version route show table $route_table_id &>/dev/null)
              if [ $? -ne 0 ] || [ -z "$output" ]; then
                  break
              else
                  route_table_id=$((route_table_id + 1))
                  attempts=$((attempts + 1))
              fi
          done
          echo $route_table_id
      }
      add_ipv4_route_table() {
          local DEFAULT_IPV4_ROUTE_TABLE_ID=1000
          v4_route_table_id=$(ip route show table all | grep -F "default via $gateway dev $interface table" | awk '{print $NF}')
          if [ -z $v4_route_table_id ]; then
              interface_number=$(echo $interface | grep -o '[0-9]*$')
              if [ -z "$interface_number" ]; then
                  v4_route_table_id="$DEFAULT_IPV4_ROUTE_TABLE_ID"
              else
                  v4_route_table_id=$((DEFAULT_IPV4_ROUTE_TABLE_ID + interface_number))
              fi
              v4_route_table_id=$(check_route_table $v4_route_table_id 4)
              echo "add policy route for dev: $interface table: $v4_route_table_id subnet: $subnet gateway: $gateway"
              ip route add default via $gateway dev $interface table $v4_route_table_id
              ip route add $subnet dev $interface table $v4_route_table_id
          fi
      }
      generate_ipv4_policy_route() {
          subnet=$(nmcli device show $interface | grep -F 'IP4.ROUTE' | grep -F 'nh = 0.0.0.0' | cut -d'=' -f2 | cut -d',' -f1 | tr -d ' ' | head -n 1)
          gateway=$(ipcalc -i $subnet | awk '/HostMin/ {print $2}')
          add_ipv4_route_table
          nmcli device show $interface | grep -F 'IP4.ADDRESS' | while read -r line; do
              IP=$(echo $line | awk '{print $2}' | cut -d'/' -f1)
              if ip rule list | grep -F "$v4_route_table_id" | grep -q "$IP"; then
                  echo "ip rule already exists for $IP with table $v4_route_table_id"
                  continue
              fi
              echo "Adding rule for $IP on $interface with table $v4_route_table_id"
              ip rule add from $IP table $v4_route_table_id
          done
      }
      generate_ipv4_policy_route
      add_ipv6_route_table() {
          local DEFAULT_IPV6_ROUTE_TABLE_ID=1100
          v6_route_table_id=$(ip -6 route show table all | grep -F "default via $v6_gateway dev $interface table" | grep -oP "table \K\d+")
          if [ -z $v6_route_table_id ]; then
              interface_number=$(echo $interface | grep -o '[0-9]*$')
              if [ -z "$interface_number" ]; then
                  v6_route_table_id=$DEFAULT_IPV6_ROUTE_TABLE_ID
              else
                  v6_route_table_id=$((DEFAULT_IPV6_ROUTE_TABLE_ID + interface_number))
              fi
              v6_route_table_id=$(check_route_table $v6_route_table_id 6)
              echo "add policy route for dev: $interface table: $v6_route_table_id v6_subnet: $v6_subnet v6_gateway: $v6_gateway"
              ip -6 route add default via $v6_gateway dev $interface table $v6_route_table_id
              ip -6 route add $v6_subnet dev $interface table $v6_route_table_id
          fi
      }
      generate_ipv6_policy_route() {
          IPV6INIT=$(awk -F= '/^IPV6INIT=/{gsub(/"/, ""); print $2}' "/etc/sysconfig/network-scripts/ifcfg-$interface" | tr -d ' ' | tail -n 1)
          if [ "$IPV6INIT" != "yes" ]; then
              echo "$interface IPV6INIT is not set to yes, skip IPv6 policy route configurate."
              return 0
          fi
          for ((x=0; x<10; x++)); do
              if (ip address show $interface | grep -F "inet6" | grep -F "dynamic"); then
                  v6_subnet=$(nmcli device show $interface | grep -F 'IP6.ROUTE' | grep -F 'nh = ::'| grep -v 'dst = fe80' | grep -v '/128' | cut -d'=' -f2 | cut -d',' -f1 | tr -d ' ' | head -n 1)
                  v6_gateway=$(ipcalc -6 -i $v6_subnet | awk '/HostMin/ {print $2}')1
                  add_ipv6_route_table
                  nmcli device show $interface | grep -F 'IP6.ADDRESS' | grep -v "/64" | while read -r line; do
                      IP=$(echo $line | awk '{print $2}' | cut -d'/' -f1)
                      if ip -6 rule list | grep -F "$v6_route_table_id" | grep -q "$IP"; then
                          echo "ip rule already exists for $IP with table $v6_route_table_id"
                          continue
                      fi
                      echo "Adding rule for $IP on $interface with table $v6_route_table_id"
                      ip -6 rule add from $IP table $v6_route_table_id
                  done
                  break
              fi
                sleep 1
          done
      }
      generate_ipv6_policy_route
      ```
      
   
   4. 按ESC退出，并输入:wq!保存配置。
   
   5. 执行以下命令，查看自动化配置脚本文件**15-policy-route.sh** 的权限。
      **ll /etc/NetworkManager/dispatcher.d/**
      回显类似如下信息，**15-policy-route.sh** 权限为**-rw-r--r--** ，和其他系统文件（比如**10-ifcfg-rh-routes.sh** ）的权限（**-rwxr-xr-x** ）不一样。
      ```
      [root@ecs-resource ~]# ll /etc/NetworkManager/dispatcher.d/
      total 36
      -rwxr-xr-x. 1 root root 3840 Feb 26 17:45 10-ifcfg-rh-routes.sh
      -rwxr-xr-x. 1 root root 1062 Feb 26 17:45 11-dhclient
      -rw-r--r--  1 root root 2515 Jun 18 15:13 15-policy-route.sh
      -rwxr-xr-x. 1 root root 1412 Feb 26 17:45 20-chrony-dhcp
      -rwxr-xr-x. 1 root root  455 Feb 26 17:45 20-chrony-onoffline
      -rwxrwxr-x  1 root root  719 May 10  2019 hook-network-manager
      drwxr-xr-x. 2 root root 4096 Apr 18 17:12 no-wait.d
      drwxr-xr-x. 2 root root 4096 Feb 26 17:45 pre-down.d
      drwxr-xr-x. 2 root root 4096 Apr 18 17:12 pre-up.d
      ```
      
   
   6. 执行以下命令，为自动化配置脚本文件**15-policy-route.sh** 添加权限。
      **sudo chown root:root /etc/NetworkManager/dispatcher.d/15-policy-route.sh**
      **sudo chmod 755 /etc/NetworkManager/dispatcher.d/15-policy-route.sh**
      
   
   7. 执行以下命令，再次查看自动化配置脚本文件**15-policy-route.sh** 的权限。
      **ll /etc/NetworkManager/dispatcher.d/**
      回显类似如下信息，**15-policy-route.sh** 权限为**-rwxr-xr-x。**
      ```
      [root@ecs-resource ~]# ll /etc/NetworkManager/dispatcher.d/
      total 36
      -rwxr-xr-x. 1 root root 3840 Feb 26 17:45 10-ifcfg-rh-routes.sh
      -rwxr-xr-x. 1 root root 1062 Feb 26 17:45 11-dhclient
      -rwxr-xr-x  1 root root 2019 Jun 18 12:21 15-policy-route.sh
      -rwxr-xr-x. 1 root root 1412 Feb 26 17:45 20-chrony-dhcp
      -rwxr-xr-x. 1 root root  455 Feb 26 17:45 20-chrony-onoffline
      -rwxrwxr-x  1 root root  719 May 10  2019 hook-network-manager
      drwxr-xr-x. 2 root root 4096 Apr 18 17:12 no-wait.d
      drwxr-xr-x. 2 root root 4096 Feb 26 17:45 pre-down.d
      drwxr-xr-x. 2 root root 4096 Apr 18 17:12 pre-up.d
      ```
      
   
   8. 执行以下命令，重启网络服务以触发脚本**15-policy-route.sh** 运行。
      **systemctl restart NetworkManager**
      ![](https://support.huaweicloud.com/usermanual-vpc/public_sys-resources/caution_3.0-zh-cn.png)
      重启网络服务时，此处请确保不影响业务再重启。
      
    
7. 依次执行以下命令，确认IPv4策略路由是否添加成功。 **ip rule**
   **ip route show table 1000**
   **ip route show table** **1001**
   其中，**table** **1000** 为主网卡的路由表名称，**table** **1001**为扩展网卡的路由表名称。
   回显类似如下信息，表示IPv4策略路由添加成功。
   ```
   [root@ecs-resource ~]# ip rule
   0:      from all lookup local
   32764:  from 10.0.1.120 lookup 1001
   32765:  from 10.0.0.133 lookup 1000
   32766:  from all lookup main
   32767:  from all lookup default
   [root@ecs-resource ~]# ip route show table 1000
   default via 10.0.0.1 dev eth0 
   10.0.0.0/24 dev eth0 scope link 
   [root@ecs-resource ~]# ip route show table 1001
   default via 10.0.1.1 dev eth1 
   10.0.1.0/24 dev eth1 scope link
   ```
   
8. 执行以下命令，验证源端云服务器和目的端云服务器是否可以通过IPv4地址正常通信。 **ping -I** *源端云服务器主网卡IPv4地址 目的端云服务器网卡IPv4地址*
   **ping -I** *源端云服务器扩展网卡IPv4地址 目的端云服务器网卡IPv4地址*
   命令示例：
   **ping -I 10.0.0.133 10.0.2.3**
   **ping -I 10.0.1.120 10.0.2.3**
   回显类似如下信息，源端两个IPv4地址均可以和目的端正常通信，表示IPv4策略路由配置成功。
   ```
   [root@ecs-resource ~]# ping -I 10.0.0.133 10.0.2.3
   PING 10.0.2.3 (10.0.2.3) from 10.0.0.133 : 56(84) bytes of data.
   64 bytes from 10.0.2.3: icmp_seq=1 ttl=64 time=0.241 ms
   64 bytes from 10.0.2.3: icmp_seq=2 ttl=64 time=0.198 ms
   ^C
   --- 10.0.2.3 ping statistics ---
   2 packets transmitted, 2 received, 0% packet loss, time 1064ms
   rtt min/avg/max/mdev = 0.198/0.219/0.241/0.021 ms
   [root@ecs-resource ~]# ping -I 10.0.1.120 10.0.2.3
   PING 10.0.2.3 (10.0.2.3) from 10.0.1.120 : 56(84) bytes of data.
   64 bytes from 10.0.2.3: icmp_seq=1 ttl=64 time=0.242 ms
   64 bytes from 10.0.2.3: icmp_seq=2 ttl=64 time=0.184 ms
   ^C
   --- 10.0.2.3 ping statistics ---
   2 packets transmitted, 2 received, 0% packet loss, time 1062ms
   rtt min/avg/max/mdev = 0.184/0.213/0.242/0.029 ms
   ```
   
9. 依次执行以下命令，确认IPv6策略路由是否添加成功。
   **ip -6 rule**
   **ip -6 route show table 1100**
   **ip -6 route show table 1101**
   其中，**table 1100** 为主网卡的路由表名称，**table** **1101**为扩展网卡的路由表名称。
   回显类似如下信息，表示IPv6策略路由添加成功。
   ```
   [root@ecs-resource ~]# ip -6 rule
   0:      from all lookup local
   32764:  from 2407:c080:802:2107:ab85:4a27:d20:2119 lookup 1101
   32765:  from 2407:c080:802:1f85:918b:9039:41b2:24a8 lookup 1100
   32766:  from all lookup main
   [root@ecs-resource ~]# ip -6 route show table 1100
   2407:c080:802:1f85::/64 dev eth0 metric 1024 pref medium
   default via 2407:c080:802:1f85::1 dev eth0 metric 1024 pref medium
   [root@ecs-resource ~]# ip -6 route show table 1101
   2407:c080:802:2107::/64 dev eth1 metric 1024 pref medium
   default via 2407:c080:802:2107::1 dev eth1 metric 1024 pref medium
   ```
   
10. 执行以下命令，验证源端云服务器和目的端云服务器是否可以通过IPv6地址正常通信。 **ping -6 -I** *源端云服务器主网卡IPv6地址 目的端云服务器网卡IPv6地址*
    **ping -6 -I** *源端云服务器扩展网卡IPv6地址 目的端云服务器网卡IPv6地址*
    命令示例：
    **ping -6 -I 2407:c080:802:1f85:918b:9039:41b2:24a8 2407:c080:802:2108:96ec:3c49:391a:5ebc**
    **ping -6 -I 2407:c080:802:2107:ab85:4a27:d20:2119 2407:c080:802:2108:96ec:3c49:391a:5ebc**
    回显类似如下信息，源端两个IPv6地址均可以和目的端正常通信，表示IPv6策略路由配置成功。
    ```
    [root@ecs-resource ~]# ping -6 -I 2407:c080:802:1f85:918b:9039:41b2:24a8 2407:c080:802:2108:96ec:3c49:391a:5ebc
    PING 2407:c080:802:2108:96ec:3c49:391a:5ebc(2407:c080:802:2108:96ec:3c49:391a:5ebc) from 2407:c080:802:1f85:918b:9039:41b2:24a8 : 56 data bytes
    64 bytes from 2407:c080:802:2108:96ec:3c49:391a:5ebc: icmp_seq=1 ttl=64 time=0.328 ms
    64 bytes from 2407:c080:802:2108:96ec:3c49:391a:5ebc: icmp_seq=2 ttl=64 time=0.209 ms
    ^C
    --- 2407:c080:802:2108:96ec:3c49:391a:5ebc ping statistics ---
    2 packets transmitted, 2 received, 0% packet loss, time 1016ms
    rtt min/avg/max/mdev = 0.209/0.268/0.328/0.059 ms
    [root@ecs-resource ~]# ping -6 -I 2407:c080:802:2107:ab85:4a27:d20:2119 2407:c080:802:2108:96ec:3c49:391a:5ebc
    PING 2407:c080:802:2108:96ec:3c49:391a:5ebc(2407:c080:802:2108:96ec:3c49:391a:5ebc) from 2407:c080:802:2107:ab85:4a27:d20:2119 : 56 data bytes
    64 bytes from 2407:c080:802:2108:96ec:3c49:391a:5ebc: icmp_seq=1 ttl=64 time=0.345 ms
    64 bytes from 2407:c080:802:2108:96ec:3c49:391a:5ebc: icmp_seq=2 ttl=64 time=0.203 ms
    ^C
    --- 2407:c080:802:2108:96ec:3c49:391a:5ebc ping statistics ---
    2 packets transmitted, 2 received, 0% packet loss, time 1051ms
    rtt min/avg/max/mdev = 0.203/0.274/0.345/0.071 ms
    ```
    
 
