配置网卡路由

更新时间:
复制 MD 格式

VPC内部以及与其他网络之间传输数据时,需要使用路由表来指导数据包的路径选择。对于弹性网卡来说,正确的路由配置是保证其能够正确发送和接收数据的关键。ECS在附加网卡时,通常情况下会自动为附加的网卡配置默认路由。如果现有的路由不满足您的需求,您可以按照本章节的指引通过配置路由表和规则来自行配置路由。

为网卡配置策略路由

策略路由是一种网络技术,允许根据特定的规则来决定数据包的传输路径,而不是仅仅依赖于路由表中的默认路由。通过配置路由表和规则,您可以实现不同的路由策略,将特定的网络流量通过指定的网卡进行转发,以便更加精确地控制和管理网络流量的转发路径。

适用场景

  • 多网卡网络通信问题:在使用辅助弹性网卡配合弹性公网IPNAT网关时,由于其默认路由优先级低于主网卡,出站流量默认优先通过主网卡发送,可能导致流量经辅助网卡流入后由主网卡返回,引发弹性公网IP通信异常。此时可以通过配置策略路由,强制流量从接收数据的网卡原路返回,确保进出路径一致。

  • 流量负载均衡:多网卡环境下,每个网络接口可能连接到不同的网络或者服务于不同的目的,使用默认路由可能无法满足所有的需求。例如,您可以将出站流量按照一定规则分配给不同的网络接口,从而实现流量的负载均衡。

  • 访问控制:基于源地址、目的地址或其他参数定义路由规则,限制某些类型的流量只能通过指定的接口或路径传输,实现一定程度上的网络隔离。

前提条件

操作示例

以下以辅助弹性网卡为例,您需要根据实际情况替换命令中的网卡标识、IP地址等信息:

Linux实例
  1. 执行如下命令,为网卡添加路由表并配置路由策略。

    ip -4 route add default via <eth1的网关地址> dev eth1 table 1001
    ip -4 rule add from <eth1IP地址> lookup 1001

    本示例中以eth1为例,创建一张eth1使用的路由表1001和一条关联至该路由表的路由策略,表示来自172.16.20.193的数据包由路由表1001决定其路径,即将数据包发送至eth1出口。配置如下所示:

    ip -4 route add default via 172.16.20.253 dev eth1 table 1001
    ip -4 rule add from 172.16.20.193 lookup 1001
  2. 配置开机时自动更新路由,使配置永久生效。

    eth1配置路由后,需要将上一步执行的命令写入文件,以便在开机时自动更新路由,否则重启实例后该路由配置会失效。如果您是临时测试,可忽略此步骤。

    1. 执行如下命令,打开/etc/rc.local文件。

      vim /etc/rc.local
    2. i键进入编辑模式,将您上一步实际执行的命令写入文件,然后按Esc键退出编辑模式,输入:wq保存退出。

      说明

      注意替换命令中的网卡标识、网关地址等信息。

    3. 执行如下命令,为/etc/rc.local文件添加执行权限。

      sudo chmod +x /etc/rc.local
  3. 执行如下命令,查看创建的路由表和策略路由。

    ip route list table 1001 && \
    ip rule list

    系统返回查询结果如下,表示创建的路由表和策略路由成功。

    root@xxx:/etc/netplan# ip route list table 1001 && ip rule list
    default via 172.16.20.253 dev eth1
    0:	from all lookup local
    32765:	from 172.16.20.193 lookup 1001
    32766:	from all lookup main
    32767:	from all lookup default

Windows实例

  1. 执行如下命令,为网卡配置策略路由。

    route add -p <目标网络> mask <子网掩码> <网关> if <接口索引> metric <路由优先级>

    本示例中以以太网2为例,设置一条路由,让所有来自172.16.12.76的数据包都通过172.16.12.253这个网关转发。配置如下所示:

    route add -p 0.0.0.0 mask 0.0.0.0 172.16.12.253 if 6 metric 1

    参数说明:

    • -p:使该路由成为永久性路由,重启后仍然有效。默认不加-p为临时生效。

    • 目标网络:使用0.0.0.0通常代表默认路由,即当没有更具体的路由匹配时将使用的路由。

    • 子网掩码和默认网关:网卡的子网掩码和默认网关,您可以通过ipconfig命令查看:

      C:\Users\Administrator>ipconfig
      
      Windows IP 配置
      
      
      以太网适配器 以太网:
      
         连接特定的 DNS 后缀 . . . . . . . : cn-hangzhou.ecs.internal
         本地链接 IPv6 地址. . . . . . . . : fe80::6926:88f5:e002:7443%3
         IPv4 地址 . . . . . . . . . . . . : 172.16.20.241
         子网掩码  . . . . . . . . . . . . : 255.255.255.0
         默认网关. . . . . . . . . . . . . : 172.16.20.253
      
      以太网适配器 以太网 2:
      
         连接特定的 DNS 后缀 . . . . . . . : cn-hangzhou.ecs.internal
         本地链接 IPv6 地址. . . . . . . . : fe80::46bd:a7fb:362e:f79f%6
         IPv4 地址 . . . . . . . . . . . . : 172.16.12.76
         子网掩码  . . . . . . . . . . . . : 255.255.255.0
         默认网关. . . . . . . . . . . . . : 172.16.12.253
    • 接口索引:网络接口的索引值。您可以通过netsh interface ipv4 show interfaces命令查看:

      示例中,以太网 2 对应的接口索引(Idx)为 6。

      C:\Users\Administrator>netsh interface ipv4 show interfaces
      
      Idx     Met         MTU          状态                名称
      ---  ----------  ----------  ------------  ---------------------------
        1          75  4294967295  connected     Loopback Pseudo-Interface 1
        3          15        1500  connected     以太网
        6          15        1500  connected     以太网 2
    • 路由优先级:metric n,数字越小优先级越高。

  2. 执行route print,查看新增加的路由是否已经出现在列表中。

    C:\Users\Administrator>route print
    ===========================================================================
    接口列表
      3...00 16 3e 0a d5 39 ......Red Hat VirtIO Ethernet Adapter
      6...00 16 3e 4c 88 9c ......Red Hat VirtIO Ethernet Adapter #2
      1...........................Software Loopback Interface 1
    ===========================================================================
    
    IPv4 路由表
    ===========================================================================
    活动路由:
    网络目标        网络掩码          网关            接口          跃点数
          0.0.0.0          0.0.0.0    172.16.12.253   172.16.12.76     15
          0.0.0.0          0.0.0.0    172.16.12.253   172.16.20.241     15
        127.0.0.0        255.0.0.0            在链路上       127.0.0.1    331
        127.0.0.1  255.255.255.255            在链路上       127.0.0.1    331
    127.255.255.255  255.255.255.255            在链路上       127.0.0.1    331
       172.16.12.0    255.255.255.0            在链路上    172.16.12.76    271
      172.16.12.76  255.255.255.255            在链路上    172.16.12.76    271
     172.16.12.255  255.255.255.255            在链路上    172.16.12.76    271
       172.16.20.0    255.255.255.0            在链路上   172.16.20.241    271
     172.16.20.241  255.255.255.255            在链路上   172.16.20.241    271
     172.16.20.255  255.255.255.255            在链路上   172.16.20.255    271
        224.0.0.0        240.0.0.0            在链路上       127.0.0.1    331
        224.0.0.0        240.0.0.0            在链路上   172.16.20.241    271
        224.0.0.0        240.0.0.0            在链路上    172.16.12.76    271
    255.255.255.255  255.255.255.255            在链路上       127.0.0.1    331
    255.255.255.255  255.255.255.255            在链路上   172.16.20.241    271
    255.255.255.255  255.255.255.255            在链路上    172.16.12.76    271
    ===========================================================================
    永久路由:
      网络地址          网络掩码  网关地址  跃点数
          0.0.0.0          0.0.0.0    172.16.12.253       1
    ===========================================================================

场景示例

本示例以Alibaba Cloud Linux 3.2为例,说明多网卡场景下,数据包从eth1进入,从eth0离开的场景。如果您对数据流向有严格要求,比如在安全策略中设置了源IP白名单,仅授权特定网络接口对应的IP地址,但由于未正确绑定流量路径,可能导致合法请求因源IP与接口不匹配而被拒绝,引发网络不通。您可以通过配置策略路由解决。

  1. 环境准备。

    1. 购买一台ECS实例。

      具体操作,请参见自定义购买实例

    2. ECS实例绑定一张辅助弹性网卡。

      具体操作,请参见绑定辅助弹性网卡

    3. 申请EIP,并以普通模式绑定到辅助弹性网卡eth1。

      具体操作,请参见EIP绑定至辅助弹性网卡

      绑定成功后,在 ECS 实例详情页单击弹性网卡页签,可查看辅助网卡状态为已绑定,IP 地址列显示已分配的公网 IP(即 EIP)和主私网 IP。

    4. 准备测试端。

      您可以以另一台开通了公网的ECS实例作为测试端,或者以您本地机器作为客户端进行测试。

    5. 实例所在安全组添加入方向的允许访问规则,源IP指定为测试端的公网IP,以允许通过ping EIP访问ECS实例。

      具体操作,请参见案例4:只允许特定协议的业务访问

  2. 在测试端执行以下命令,向ECS实例发送数据包。

    ping 47.xx.xx.109

    注意替换IP地址为您为辅助网卡绑定的EIP的地址。

  3. ECS实例上执行以下命令对两个网络接口eth0、eth1分别进行ICMP数据包监测。

    • 执行以下命令,在网络接口 eth0 上捕获 ICMP协议的数据包。

      tcpdump -i eth0 icmp
    • 重新打开一个窗口,执行以下命令,在网络接口 eth1 上捕获 ICMP协议的数据包。

      tcpdump -i eth1 icmp
  4. 查看结果。

    未配置策略路由

    可以看到,默认情况下,数据包从eth1接口进入,即eth1收到请求(request),但是从eth0返回(reply)。

    在 eth0 上抓包,可以看到 ICMP echo reply:

    [root@xxx ~]# tcpdump -i eth0 icmp
    dropped privs to tcpdump
    tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
    listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
    14:01:55.129356 IP iZxxx > 12.xxx: ICMP echo reply, id 2048, seq 142, length 40
    14:01:56.141993 IP iZxxx > 12.xxx: ICMP echo reply, id 2048, seq 143, length 40
    14:01:57.145388 IP iZxxx > 12.xxx: ICMP echo reply, id 2048, seq 144, length 40
    14:01:58.163042 IP iZxxx > 12.xxx: ICMP echo reply, id 2048, seq 145, length 40

    在 eth1 上抓包,可以看到 ICMP echo request:

    [root@xxx ~]# tcpdump -i eth1 icmp
    dropped privs to tcpdump
    tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
    listening on eth1, link-type EN10MB (Ethernet), capture size 262144 bytes
    14:01:55.129339 IP 12.xxx > iZxxx: ICMP echo request, id 2048, seq 142, length 40
    14:01:56.141980 IP 12.xxx > iZxxx: ICMP echo request, id 2048, seq 143, length 40
    14:01:57.145376 IP 12.xxx > iZxxx: ICMP echo request, id 2048, seq 144, length 40
    14:01:58.163030 IP 12.xxx > iZxxx: ICMP echo request, id 2048, seq 145, length 40

    通过查看ECS实例的默认路由,可以看到eth0的默认路由优先级为100(数值越小,优先级越高),高于eth1的优先级,因此数据包默认从eth0发出。

    [root@i xxx          ~]# route -n
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    0.0.0.0         172.16.20.253   0.0.0.0         UG    100    0        0 eth0
    0.0.0.0         172.16.20.253   0.0.0.0         UG    101    0        0 eth1
    172.16.20.0     0.0.0.0         255.255.255.0   U     100    0        0 eth0
    172.16.20.0     0.0.0.0         255.255.255.0   U     101    0        0 eth1
    配置策略路由之后
    1. 参照为网卡配置策略路由的操作示例,为ECS实例配置策略路由。

      ip -4 route add default via 172.16.20.253 dev eth1 table 1001
      ip -4 rule add from 172.16.20.177 lookup 1001
    2. 再次在测试端执行ping EIP

    3. 再次在ECS实例上监测不同网卡的ICMP数据包。

      可以看到,数据包从eth1接口进入,收到请求(request)。之后,依然从网络接口eth1回复(reply),保持了源进源出的特性。

      [root@xxx ~]# tcpdump -i eth0 icmp
      dropped privs to tcpdump
      tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
      listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
      
      [root@xxx ~]# tcpdump -i eth1 icmp
      dropped privs to tcpdump
      tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
      listening on eth1, link-type EN10MB (Ethernet), capture size 262144 bytes
      14:15:13.249277 IP 123.xxx.xxx.4 > iZbp1gt1xxx          Z: ICMP echo request, id 2050, seq 150, length 40
      14:15:13.249293 IP iZbxxx    lh49gbqovzZ :         4: ICMP echo reply, id 2050, seq 150, length 40
      14:15:14.263769 IP 123.xxx.xxx.4 > iZbp1gt1xxx          Z: ICMP echo request, id 2050, seq 151, length 40
      14:15:14.263783 IP iZbxxx    lh49gbqovzZ :         4: ICMP echo reply, id 2050, seq 151, length 40
      14:15:15.267143 IP 123.xxx.xxx.4 > iZbp1gt1xxx          Z: ICMP echo request, id 2050, seq 152, length 40
      14:15:15.267155 IP iZbxxx    lh49gbqovzZ :         4: ICMP echo reply, id 2050, seq 152, length 40
      14:15:16.275436 IP 123.xxx.xxx.4 > iZbp1gt1xxx          Z: ICMP echo request, id 2050, seq 153, length 40
      14:15:16.275449 IP iZbxxx    lh49gbqovzZ :         4: ICMP echo reply, id 2050, seq 153, length 40

为网卡配置默认路由

目前ECS在附加网卡时,通常情况下会自动为附加的网卡配置默认路由。部分操作系统如Ubuntu 16不会为辅助弹性网卡配置默认路由(Ubuntu 18及以上会自动配置),默认路由的缺失可能导致您在指定网卡进行外部通信时,出现网络连通问题。您可以参考如下步骤为网卡配置默认路由。

以下以Ubuntu16为例,为辅助弹性网卡eth1配置默认路由:

  1. 执行如下命令,查看网卡信息。

    ip a
    root@xxx:/etc/network# ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host
           valid_lft forever preferred_lft forever
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
        link/ether 00:16:3e:15:74:ee brd ff:ff:ff:ff:ff:ff
        inet 172.16.20.231/24 brd 172.16.20.255 scope global eth0
           valid_lft forever preferred_lft forever
        inet6 fe80::216:3eff:fe15:74ee/64 scope link
           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 00:16:3e:46:31:f4 brd ff:ff:ff:ff:ff:ff
        inet 172.16.20.199/24 brd 172.16.20.255 scope global eth1
           valid_lft forever preferred_lft forever
        inet6 fe80::216:3eff:fe46:31f4/64 scope link
           valid_lft forever preferred_lft forever

    可以看到,辅助弹性网卡eth1已经在实例内部生效。

  2. 执行如下命令,查看路由信息。

    route -n

    可以看到,系统只为eth1配置了用于内部通信的路由,没有配置处理外部通信的路由,即从eth1网络接口出去的路由。

    root@xxx:/etc/network# route -n
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    0.0.0.0         172.16.20.253   0.0.0.0         UG    0      0        0 eth0
    172.16.20.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
    172.16.20.0     0.0.0.0         255.255.255.0   U     0      0        0 eth1

    可能的异常情况示例

    这可能会导致您在指定eth1通信时候的异常,比如您为eth1网卡绑定了EIP,希望在实例内部指定通过eth1EIP访问外部公网,可能会发现网络不通,如下所示:

    root@xxx               /etc/network# ping -I eth1 www.xxx.com
    PING www.xxx.com (1xxx12) from 172.16.20.199 eth1: 56(84) bytes of data.
    From 172.16.20.199 icmp_seq=1 Destination Host Unreachable
    From 172.16.20.199 icmp_seq=2 Destination Host Unreachable
    From 172.16.20.199 icmp_seq=3 Destination Host Unreachable
    From 172.16.20.199 icmp_seq=4 Destination Host Unreachable
    From 172.16.20.199 icmp_seq=5 Destination Host Unreachable
    From 172.16.20.199 icmp_seq=6 Destination Host Unreachable
    From 172.16.20.199 icmp_seq=7 Destination Host Unreachable
    From 172.16.20.199 icmp_seq=8 Destination Host Unreachable
    From 172.16.20.199 icmp_seq=9 Destination Host Unreachable
    From 172.16.20.199 icmp_seq=10 Destination Host Unreachable
    From 172.16.20.199 icmp_seq=11 Destination Host Unreachable
    From 172.16.20.199 icmp_seq=12 Destination Host Unreachable
    From 172.16.20.199 icmp_seq=13 Destination Host Unreachable
    From 172.16.20.199 icmp_seq=14 Destination Host Unreachable
  3. 执行如下命令,为网卡配置默认路由。

    ip -4 route add default via 172.16.20.253 dev eth1 metric 200
    • -4:表示只处理IPv4地址

    • 172.16.20.253:eth1的网关地址

    • metric 200:设置了此路由的度量值(优先级)为200。较低的度量值表示更高的优先级。如果存在多条到达同一目的地的不同路由,则会选择度量值最低的一条。

  4. 配置开机时自动更新路由,使配置永久生效。

    eth1配置路由后,需要将上一步执行的命令写入文件,以便在开机时自动更新路由,否则重启实例后该路由配置会失效。如果您是临时测试,可忽略此步骤。

    1. 执行如下命令,打开/etc/rc.local文件。

      vim /etc/rc.local
    2. i键进入编辑模式,将您上一步实际执行的命令写入文件,然后按Esc键退出编辑模式,输入:wq保存退出。

      说明

      注意替换命令中的网卡标识、网关地址等信息。

    3. 执行如下命令,为/etc/rc.local文件添加执行权限。

      sudo chmod +x /etc/rc.local
  5. 再次执行如下命令,可以看到为eth1添加的路由。

    route -n
    root@ixxxxxxxxxx:/etc/network# route -n
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    0.0.0.0         172.16.20.253   0.0.0.0         UG    0      0        0 eth0
    0.0.0.0         172.16.20.253   0.0.0.0         UG    200    0        0 eth1
    172.16.20.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
    172.16.20.0     0.0.0.0         255.255.255.0   U     0      0        0 eth1

    验证异常情况示例

    再次指定eth1网卡访问外部公网,可以正常通信:

    root@xxx:~/etc/network# ping  -I eth1 www.xxx.com
    PING www.xxx.com (xxx) from 172.16.20.199 eth1: 56(84) bytes of data.
    64 bytes from xxx: icmp_seq=1 ttl=51 time=11.6 ms
    64 bytes from xxx: icmp_seq=2 ttl=51 time=11.6 ms
    64 bytes from xxx: icmp_seq=3 ttl=51 time=11.6 ms
    64 bytes from xxx: icmp_seq=4 ttl=51 time=11.6 ms
    ^C