在VPC内部以及与其他网络之间传输数据时,需要使用路由表来指导数据包的路径选择。对于弹性网卡来说,正确的路由配置是保证其能够正确发送和接收数据的关键。ECS在附加网卡时,通常情况下会自动为附加的网卡配置默认路由。如果现有的路由不满足您的需求,您可以按照本章节的指引通过配置路由表和规则来自行配置路由。
为网卡配置策略路由
策略路由是一种网络技术,允许根据特定的规则来决定数据包的传输路径,而不是仅仅依赖于路由表中的默认路由。通过配置路由表和规则,您可以实现不同的路由策略,将特定的网络流量通过指定的网卡进行转发,以便更加精确地控制和管理网络流量的转发路径。
适用场景
多网卡网络通信问题:在使用辅助弹性网卡配合弹性公网IP或NAT网关时,由于其默认路由优先级低于主网卡,出站流量默认优先通过主网卡发送,可能导致流量经辅助网卡流入后由主网卡返回,引发弹性公网IP通信异常。此时可以通过配置策略路由,强制流量从接收数据的网卡原路返回,确保进出路径一致。
流量负载均衡:多网卡环境下,每个网络接口可能连接到不同的网络或者服务于不同的目的,使用默认路由可能无法满足所有的需求。例如,您可以将出站流量按照一定规则分配给不同的网络接口,从而实现流量的负载均衡。
访问控制:基于源地址、目的地址或其他参数定义路由规则,限制某些类型的流量只能通过指定的接口或路径传输,实现一定程度上的网络隔离。
前提条件
网卡已绑定到实例。
具体操作,请参见创建并使用弹性网卡。
网卡已在实例操作系统内部生效。
具体操作,请参见配置弹性网卡在实例内部生效。
操作示例
以下以辅助弹性网卡为例,您需要根据实际情况替换命令中的网卡标识、IP地址等信息:
Linux实例
执行如下命令,为网卡添加路由表并配置路由策略。
ip -4 route add default via <eth1的网关地址> dev eth1 table 1001 ip -4 rule add from <eth1的IP地址> 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配置开机时自动更新路由,使配置永久生效。
为eth1配置路由后,需要将上一步执行的命令写入文件,以便在开机时自动更新路由,否则重启实例后该路由配置会失效。如果您是临时测试,可忽略此步骤。
执行如下命令,打开
/etc/rc.local文件。vim /etc/rc.local按
i键进入编辑模式,将您上一步实际执行的命令写入文件,然后按Esc键退出编辑模式,输入:wq保存退出。说明注意替换命令中的网卡标识、网关地址等信息。
执行如下命令,为
/etc/rc.local文件添加执行权限。sudo chmod +x /etc/rc.local
执行如下命令,查看创建的路由表和策略路由。
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实例
执行如下命令,为网卡配置策略路由。
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,数字越小优先级越高。
执行
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与接口不匹配而被拒绝,引发网络不通。您可以通过配置策略路由解决。
环境准备。
购买一台ECS实例。
具体操作,请参见自定义购买实例。
为ECS实例绑定一张辅助弹性网卡。
具体操作,请参见绑定辅助弹性网卡。
申请EIP,并以普通模式绑定到辅助弹性网卡eth1。
具体操作,请参见将EIP绑定至辅助弹性网卡。
绑定成功后,在 ECS 实例详情页单击弹性网卡页签,可查看辅助网卡状态为已绑定,IP 地址列显示已分配的公网 IP(即 EIP)和主私网 IP。
准备测试端。
您可以以另一台开通了公网的ECS实例作为测试端,或者以您本地机器作为客户端进行测试。
实例所在安全组添加入方向的允许访问规则,源IP指定为测试端的公网IP,以允许通过ping EIP访问ECS实例。
具体操作,请参见案例4:只允许特定协议的业务访问。
在测试端执行以下命令,向ECS实例发送数据包。
ping 47.xx.xx.109注意替换IP地址为您为辅助网卡绑定的EIP的地址。
在ECS实例上执行以下命令对两个网络接口eth0、eth1分别进行ICMP数据包监测。
执行以下命令,在网络接口
eth0上捕获 ICMP协议的数据包。tcpdump -i eth0 icmp重新打开一个窗口,执行以下命令,在网络接口
eth1上捕获 ICMP协议的数据包。tcpdump -i eth1 icmp
查看结果。
未配置策略路由
可以看到,默认情况下,数据包从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配置策略路由之后
参照为网卡配置策略路由的操作示例,为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再次在测试端执行
ping EIP。再次在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配置默认路由:
执行如下命令,查看网卡信息。
ip aroot@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已经在实例内部生效。
执行如下命令,查看路由信息。
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执行如下命令,为网卡配置默认路由。
ip -4 route add default via 172.16.20.253 dev eth1 metric 200-4:表示只处理IPv4地址172.16.20.253:eth1的网关地址metric 200:设置了此路由的度量值(优先级)为200。较低的度量值表示更高的优先级。如果存在多条到达同一目的地的不同路由,则会选择度量值最低的一条。
配置开机时自动更新路由,使配置永久生效。
为eth1配置路由后,需要将上一步执行的命令写入文件,以便在开机时自动更新路由,否则重启实例后该路由配置会失效。如果您是临时测试,可忽略此步骤。
执行如下命令,打开
/etc/rc.local文件。vim /etc/rc.local按
i键进入编辑模式,将您上一步实际执行的命令写入文件,然后按Esc键退出编辑模式,输入:wq保存退出。说明注意替换命令中的网卡标识、网关地址等信息。
执行如下命令,为
/etc/rc.local文件添加执行权限。sudo chmod +x /etc/rc.local
再次执行如下命令,可以看到为eth1添加的路由。
route -nroot@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