ECS弹性网卡+弹性公网IP配置最佳实践之策略路由-阿里云开发者社区

开发者社区> 霄翎> 正文

ECS弹性网卡+弹性公网IP配置最佳实践之策略路由

简介: 目前阿里云ECS部分机型可以配置多张网卡(一张原生网卡+若干张弹性网卡),用来实现业务上对于系统内多网卡的需求,详细可以参考 【新功能】弹性公网IP绑定弹性网卡新功能及最佳实践 。在使用过程中,可能会遇到多个弹性公网IP绑定到一个ECS上的原生网卡、弹性网卡上后无法通信的问题,这个时候需要检查系统内的路由配置和策略(policy rules)。
+关注继续查看

概述

目前阿里云ECS部分机型可以配置多张网卡(一张原生网卡+若干张弹性网卡),用来实现业务上对于系统内多网卡的需求,详细可以参考 [【新功能】弹性公网IP绑定弹性网卡新功能及最佳实践
](https://yq.aliyun.com/articles/629383?spm=a2c4e.11163080.searchblog.9.30812ec15GS8P5 )。在使用过程中,可能会遇到多个弹性公网IP绑定到一个ECS上的原生网卡、弹性网卡上后无法通信的问题,这个时候需要检查系统内的路由配置和策略(policy rules)。

从route路由表说起

默认情况下,linux系统中都会有一张路由表,使用routeip route就可以进行查看,如

default via 172.16.127.253 dev eth0
169.254.0.0/16 dev eth0 scope link metric 1002
172.16.112.0/20 dev eth0 proto kernel scope link src 172.16.115.242

以上起到关键作用的是第一行路由,它声明了一条默认路由,从eth0网卡中出去,目标是网关172.16.127.253。在只有一张网卡的实例中,这样的配置是没有问题的,但如果有多张网卡的情况下,入流量会从不同的网卡中进入实例,但出流量都会从eth0网卡中出去(譬如从外部ping 绑定在弹性网卡上的弹性公网IP,ICMP request包会从实例的弹性网卡中进入实例,而实例回复的ICMP reply包会从eth0中流出),导致出入路径不一致,会造成一系列的问题,如单网卡流量瓶颈、负载不均衡等问题。

真实的路由表

在linux系统中,实际上是有255张路由表的,默认使用的是254这张路由表,使用route命令展示的即是这张表中的路由条目。除此之外的路由表我们可以对它进行适当的配置,以实现自定义或高级需求。

我们可以使用ip route list table [table index]来查看系统内的路由表条目,如

[root@xiaoling-hz-test ~]# ip route list table 254
default via 172.16.127.253 dev eth0
169.254.0.0/16 dev eth0 scope link metric 1002
172.16.112.0/20 dev eth0 proto kernel scope link src 172.16.115.242

以上条目可以看到系统内默认的254号路由表内的条目,另外,还可以将index置为0来查看系统内所有的路由条目,这在需要循环遍历系统内自定义路由表时非常有用。

PS. table==253这张路由表被系统默认为是default表,建议使用1-252号路由表来添加自定义的路由条目。被linux预先定义的路由表详情可以查看系统内/etc/iproute2/rt_tables,以下是一个示例,可以看到253 - 255已经被系统定义:

#
# reserved values
#
255     local
254     main
253     default
0       unspec
#
# local
#
#1      inr.ruhep

策略路由

为什么会需要多张路由表呢?这不得不提到策略路由,目前我们需要实现的功能是同进同出,保证从eth0口进来的包从eth0口出去,eth1进从eth1出,但弹性公网IP需要有一条默认路由来让ECS可以正常访问公网,但却又不能直接在默认路由表里添加两个目标网段是0.0.0.0,分别从eth0、eth1中出去的路由,这个时候策略路由就派上用场了,我们需要根据源地址进行策略选择。

简单来说就是配置两张路由表,路由表中分别有从eth0、eth1中出去的默认路由,在系统需要发包时,根据包的源IP进行选择,eth0的源IP就从包含eth0的路由表出去,eth1的源IP就从eth1的路由表走,从而实现同进同出。

linux系统内关于策略的索引是一个无符号的32位整型数值,所以理论上策略索引的数值可以达到4294967295之多,当然通常我们只需要使用个位数的索引条目即可。

具体的一个配置

以上说的都是理论,可能会有一些虚,下面我们来实际进行一个配置。我们特意选取阿里云官方尚未支持自动配置的镜像Ubuntu 16.04 64位来进行配置,以下是这个场景中相关参数:

ECS实例网关地址:172.16.127.253

==原生网卡信息==
名称:eth0
IP地址:172.16.116.38
绑定的弹性公网IP:47.99.42.x

==弹性网卡信息==
名称:eth1
IP地址:172.16.116.39
绑定的弹性公网IP:116.62.163.x

如何获得ECS实例完整的网卡信息

阿里云ECS控制台对于实例的网卡信息展示的不是很完全,建议通过API方法 DescribeNetworkInterfaces 来获取,若没有API调试环境,可以使用阿里云的API Explorer来调试,非常方便,以下是一个示例 URL ,点击后可以直接进入在线调试页面。

检查系统的默认配置

依次查看网卡、默认路由,可以看到系统内的配置残缺不全:

root@iZbp14bxrlofsqs3d5dw43Z:~# 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
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:16:3e:0c:72:5d brd ff:ff:ff:ff:ff:ff
    inet 172.16.116.38/20 brd 172.16.127.255 scope global eth0
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 00:16:3e:10:aa:7e brd ff:ff:ff:ff:ff:ff
root@iZbp14bxrlofsqs3d5dw43Z:~# ip route list table 254
default via 172.16.127.253 dev eth0
172.16.112.0/20 dev eth0  proto kernel  scope link  src 172.16.116.38

首先编辑/etc/network/interfaces文件,在最后加上关于eth1的定义,新添加的两行分别告诉系统在启动时自动拉起eth1、eth1的参数配置使用DHCP协议,详细的配置说明可以参考man interfaces

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp

auto eth1
iface eth1 inet dhcp

保存后执行systemctl restart networking重启网络服务,可以看到eth1网卡已经配置上IP地址了:

root@iZbp14bxrlofsqs3d5dw43Z:~# ip address
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
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:16:3e:0c:72:5d brd ff:ff:ff:ff:ff:ff
    inet 172.16.116.38/20 brd 172.16.127.255 scope global eth0
       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:10:aa:7e brd ff:ff:ff:ff:ff:ff
    inet 172.16.116.39/20 brd 172.16.127.255 scope global eth1
       valid_lft forever preferred_lft forever

接下去就需要配置策略路由了,针对这个场景,我们定义了以下信息:

==原生网卡==
使用路由表100,策略路由优先级索引为200
添加路由的命令(网关地址根据实际情况而定):ip route add default via 172.16.127.253 dev eth0 tab 100
添加策略的命令(源IP根据实际情况而定):ip rule add from 172.16.116.38 tab 100 priority 200

==弹性网卡==
使用路由表101,策略路由优先级索引为300
添加路由的命令(网关地址根据实际情况而定):ip route add default via 172.16.127.253 dev eth1 tab 101
添加策略的命令(源IP根据实际情况而定):ip rule add from 172.16.116.39 tab 101 priority 300

执行以上命令后,系统内策略路由就已经配好了,通过相关命令查看的结果如下(已经略去无关信息):

root@iZbp14bxrlofsqs3d5dw43Z:~# ip route list table 0
default via 172.16.127.253 dev eth0  table 100
default via 172.16.127.253 dev eth1  table 101
default via 172.16.127.253 dev eth0
172.16.112.0/20 dev eth0  proto kernel  scope link  src 172.16.116.38
172.16.112.0/20 dev eth1  proto kernel  scope link  src 172.16.116.39
root@iZbp14bxrlofsqs3d5dw43Z:~# ip rule list
0:      from all lookup local
200:    from 172.16.116.38 lookup 100
300:    from 172.16.116.39 lookup 101
32766:  from all lookup main
32767:  from all lookup default

可以看到系统中增加了table==100、101的两张路由表,增加了200、300两个优先级的策略,分别指定eth0、eth1出入的规则,这样就可以做到一张网卡同进同出了。

持久化配置

以上的配置,除了网卡的IP信息可以持久化,其他的配置如路由、策略都会在重启后失效,可以把以上命令写到系统的配置文件中。理论上更优雅的方法是在/etc/sysconfig/network-scripts/ (CentOS) 、 /etc/network/ (Ubuntu)目录下将命令写到特定的文件中来解决这个问题,但无奈无法测试所有的场景,我采取了比较“暴力”的方法来统一的解决:将命令写到/etc/rc.local文件中,可以无视发行版。

比如本文中的场景,就可以将四条ip route/ip rule命令添加到rc.local中:

root@iZabcdeZ:~# vim /etc/rc.local

ip route add default via 172.16.127.253 dev eth0 tab 100
ip rule add from 172.16.116.38 tab 100 priority 200
ip route add default via 172.16.127.253 dev eth1 tab 101
ip rule add from 172.16.116.39 tab 101 priority 300

阿里云原生的做法

查看阿里云官方关于配置 ECS 实例的弹性网卡的说明,以下几种镜像是可以直接支持不需要手工配置:

CentOS 7.3 64 位
CentOS 6.8 64 位
Windows Server 2016 数据中心版 64 位
Windows Server 2012 R2 数据中心版 64 位

实际上CentOS系统内部也是采用了类似的策略来实现的,使用ip route和ip rule命令可以查看到响应的策略,只是路由表索引和策略路由的优先级序号有些许不同,各位可以实际验证一下。

参考文献

  1. https://www.linuxjournal.com/article/7291

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
【ECS】好消息,弹性网卡支持添加辅助私网IP啦
背景 阿里云的ECS服务器,很早就支持了多网卡的挂载,卸载。近日我们又推出了新功能,每块弹性网卡又支持分配和回收多辅助私网IP地址啦。 实例列表页以及详情页支持管理主网卡的辅助私网IP 在实例列表页,在每一个实例的操作栏里点击 更多 -> 网络和安全组 -> 管理辅助私网IP,可看到,弹出了相应的...
4406 0
安全管理最佳实践系列:给ECS实例配置一个RAM角色身份(使用动态STS-Token访问云服务API)
如果你的应用程序部署在ECS实例中,你可能会苦恼于应用程序的AK配置安全问题及管理难的问题。为此阿里云提供了给ECS实例配置RAM角色的解决方案,使得运行ECS实例中的应用程序将不再需要配置AK,而只需要从ECS Metadata服务中获取StsToken就可以访问阿里云服务API,让你不再担心应用程序的AK配置安全问题和难管理的问题。
6704 0
64位win7运行锐捷后弹出不能识别网卡的问题
复制锐捷安装根目录下的 PCAMp50a64.sys、PCASp50a64.sys 两个文件 到C:\windows\system32\driver下 再勾选 RuijieSupplicant.
611 0
Cassandra最佳实践(3)配置篇
cassandra最佳实践之cassandra的配置
2032 0
Nacos配置安全最佳实践
本文讨论了自建Nacos和阿里云MSE的配置安全原理。并提出配置安全最佳实践。
2391 0
Lua+OpenResty+nginx+redis+canal实现缓存策略
Lua+OpenResty+nginx+redis+canal实现缓存策略
10 0
最佳实践:WAF在重保场景下的防护策略
本文档主要是针对重保场景,通过对阿里云Web应用防火墙在过去参与过的众多重点活动保障总结,形成的一个具有实操价值的手册,希望对大家有所帮助。需要注意的是WAF只是整个防护体系中非常重要和有效的一环,并不能完全抵御住攻击者的所有攻击方式,如物理攻击、邮件欺诈、暴力破解远程登录等。
2501 0
+关注
霄翎
玩过单片机,折腾过C、Java,现在觉得Python也不错
10
文章
0
问答
来源圈子
更多
作为全球云计算的领先者,阿里云为全球230万企业提供着云计算服务,服务范围覆盖200多个国家和地区。我们致力于为企业、政府等组织机构提供安全可靠的云计算服务,给用户带来极速愉悦的服务体验。
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载