文档首页/ 虚拟私有云 VPC/ 用户指南/ 弹性网卡和辅助弹性网卡/ 弹性网卡配置示例/ 为多网卡ECS配置策略路由/ 自动为多网卡Linux云服务器配置IPv4和IPv6策略路由(HCE 2.0/CentOS 8.0及以上)
更新时间:2025-07-14 GMT+08:00
分享

自动为多网卡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双栈操作步骤

关于云服务器双网卡的背景知识及组网说明,请参见方案概述

Linux IPv4操作步骤

  1. 收集配置策略路由需要的云服务器IPv4网卡地址等信息。

    具体操作请参见收集云服务器网络信息

    本示例中,云服务器的网络信息如表1所示。

    表1 Linux 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有多种登录方法,具体请参见登录弹性云服务器

  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

      重启网络服务时,此处请确保不影响业务再重启。

  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地址等信息。

    具体操作请参见收集云服务器网络信息

    本示例中,云服务器的网络信息如表2所示。

    表2 Linux 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有多种登录方法,具体请参见登录弹性云服务器

  3. 执行以下步骤,确保云服务器已开启IPv6协议栈,并且正常获取到IPv6地址。

    对于源端和目的端的IPv6云服务器,均需要执行该操作,确保云服务器已获取到IPv6地址,否则云服务器无法通过IPv6地址进行通信。

    本章节云服务器使用的操作系统适用于CentOS 8.0 64bitHuawei Cloud EulerOS 2.0 标准版 64位公共镜像,以下针对该操作系统举例,更多操作系统配置指导,请参见动态获取IPv6地址的“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

      重启网络服务时,此处请确保不影响业务再重启。

  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地址等信息。

    具体操作请参见收集云服务器网络信息

    本示例中,云服务器的网络信息如表3所示。

    表3 Linux 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有多种登录方法,具体请参见登录弹性云服务器

  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地址。

    对于源端和目的端的IPv6云服务器,均需要执行该操作,确保云服务器已获取到IPv6地址,否则云服务器无法通过IPv6地址进行通信。

    本章节云服务器使用的操作系统适用于CentOS 8.0 64bitHuawei Cloud EulerOS 2.0 标准版 64位公共镜像,以下针对该操作系统举例,更多操作系统配置指导,请参见动态获取IPv6地址的“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

      重启网络服务时,此处请确保不影响业务再重启。

  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

相关文档