在VPC内部以及与其他网络之间传输数据时,需要使用路由表来指导数据包的路径选择。对于弹性网卡来说,正确的路由配置是保证其能够正确发送和接收数据的关键。ECS在附加网卡时,通常情况下会自动为附加的网卡配置默认路由。如果现有的路由不满足您的需求,您可以按照本章节的指引通过配置路由表和规则来自行配置路由。
为网卡配置策略路由
策略路由是一种网络技术,允许根据特定的规则来决定数据包的传输路径,而不是仅仅依赖于路由表中的默认路由。通过配置路由表和规则,您可以实现不同的路由策略,将特定的网络流量通过指定的网卡进行转发,以便更加精确地控制和管理网络流量的转发路径。
适用场景
多网卡网络通信问题:在使用辅助弹性网卡配合弹性公网IP或NAT网关时,由于其默认路由优先级低于主网卡,出站流量默认优先通过主网卡发送,可能导致流量经辅助网卡流入后由主网卡返回,引发弹性公网IP通信异常。此时可以通过配置策略路由,强制流量从接收数据的网卡原路返回,确保进出路径一致。
流量负载均衡:多网卡环境下,每个网络接口可能连接到不同的网络或者服务于不同的目的,使用默认路由可能无法满足所有的需求。例如,您可以将出站流量按照一定规则分配给不同的网络接口,从而实现流量的负载均衡。
访问控制:基于源地址、目的地址或其他参数定义路由规则,限制某些类型的流量只能通过指定的接口或路径传输,实现一定程度上的网络隔离。
前提条件
网卡已绑定到实例。
具体操作,请参见绑定弹性网卡到实例。
网卡已在实例操作系统内部生效。
具体操作,请参见配置弹性网卡在实例内部生效。
操作示例
以下以辅助弹性网卡为例,您需要根据实际情况替换命令中的网卡标识、IP地址等信息:
执行如下命令,为网卡添加路由表并配置路由策略。
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
系统返回查询结果如下图,表示创建的路由表和策略路由成功。
执行如下命令,为网卡配置策略路由。
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
命令查看:接口索引:网络接口的索引值。您可以通过
netsh interface ipv4 show interfaces
命令查看:路由优先级:metric n,数字越小优先级越高。
执行
route print
,查看新增加的路由是否已经出现在列表中。
场景示例
本示例以Alibaba Cloud Linux 3.2为例,说明多网卡场景下,数据包从eth1进入,从eth0离开的场景。如果您对数据流向有严格要求,比如在安全策略中设置了源IP白名单,仅授权特定网络接口对应的IP地址,但由于未正确绑定流量路径,可能导致合法请求因源IP与接口不匹配而被拒绝,引发网络不通。您可以通过配置策略路由解决。
环境准备。
购买一台ECS实例。
具体操作,请参见自定义购买实例。
为ECS实例绑定一张辅助弹性网卡。
具体操作,请参见绑定辅助弹性网卡。
申请EIP,并以普通模式绑定到辅助弹性网卡eth1。
具体操作,请参见将EIP绑定至辅助弹性网卡。
准备测试端。
您可以以另一台开通了公网的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)。
通过查看ECS实例的默认路由,可以看到eth0的默认路由优先级为100(数值越小,优先级越高),高于eth1的优先级,因此数据包默认从eth0发出。
参照为网卡配置策略路由的操作示例,为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),保持了源进源出的特性。
为网卡配置默认路由
目前ECS在附加网卡时,通常情况下会自动为附加的网卡配置默认路由。部分操作系统如Ubuntu 16不会为辅助弹性网卡配置默认路由(Ubuntu 18及以上会自动配置),默认路由的缺失可能导致您在指定网卡进行外部通信时,出现网络连通问题。您可以参考如下步骤为网卡配置默认路由。
以下以Ubuntu16为例,为辅助弹性网卡eth1配置默认路由:
执行如下命令,查看网卡信息。
ip a
可以看到,辅助弹性网卡eth1已经在实例内部生效。
执行如下命令,查看路由信息。
route -n
可以看到,系统只为eth1配置了用于内部通信的路由,没有配置处理外部通信的路由,即从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 -n