博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
亚马逊AWS学习——多网络接口下配置EC2实例连接公网的一个“bug”
阅读量:4113 次
发布时间:2019-05-25

本文共 1856 字,大约阅读时间需要 6 分钟。

之前在《亚马逊AWS学习——EC2的自定义VPC配置》这篇文章中讲述了如何设置自定义VPC并使自己的EC2实例能够连接公网。本篇说一下连接公网时会出现的一个小问题。

如题所示,在一个EC2实例具有多个网络接口的环境下,如果为其配置公网连接会有一个“bug”。其实也不能说是“bug”,而是AWS网络环境的限制。

1. 主网络接口

我们知道,很多时候我们的一台主机需要有多个网络接口,以使其同时架设在不同的网络中。EC2实例创建时会有一个主网络接口,默认描述为“Primary network interface”,每台EC2实例至少有一个网络接口,就是这个主网络接口。主网络接口,对应一个默认的子网,不能与EC2实例进行分离操作,当然也就不能被删除。

2. 弹性网络接口(ENI)

“Elastic Network Interface”即弹性网络接口,简称ENI。AWS的官网上对弹性网络接口(ENI)是这样解释的:弹性网络接口 (ENI) 是可以包含以下属性的虚拟网络接口:

主要私有 IP 地址

一个或多个次要私有 IP 地址

每个私有 IP 地址一个弹性 IP 地址

一个公有 IP 地址,可在您启动实例时自动分配给 eth0 的网络接口,但是仅当您为 eth0 创建网络接口而不是使用现有的网络接口时才能实现此自动分配

一个或多个安全组

MAC 地址

源/目标检查标记

描述

说得太正规了啊,小鱼也有些望而生畏。不过世间一切奇怪之物的第一特点不是奇怪,而是看起来奇怪。大的是看起来好大,小的是看起来很小。否则《冰河世纪》里的猛犸象妹妹也不用躲在小树后面以为自己是只鼹鼠,蚂蚁看到自己的写真照片也要代替螳螂去做劫匪了。这ENI再具有弹性,也还是个网络接口而已,说白了就是一块网卡。由于EC2是虚拟设备,网卡的环境也被虚拟了出来。当我们需要自己的EC2实例同时处于多个子网中时,就需要为其增加ENI。增加了ENI之后还要将其附加到EC2实例上,选择“EC2”服务,点击左导航“网络接口”,在列表中选中一项,再点击“附加”,如图:

如果该网络接口是“in-use”状态,“附加”按钮就不能再点击。

3. EC2实例连接公网的必要条件

要让EC2实例连接公网有一些必要的条件:

所在子网必须选择了”自动分配公有IP“ 

设置步骤是这样的: 
1.打开 Amazon VPC 控制台。 
2.在导航窗格中,单击 Subnets (子网)。 
3.选择您的子网,单击 Subnet Actions,并选择 Modify Auto-Assign Public IP(修改自动分配公有IP)。 
4.如果选中,则 Enable Auto-assign Public IP (启用自动分配公有 IP) 复选框会为在所选子网中启动的所有实例都请求公有 IP 地址。选中复选框,然后单击 Save (保存)。 
如图: 

必须创建了公网网关(igw)并且关联到VPC的路由表 
选中对应的路由表项,可以看到如图: 

4. 多网络接口的限制

好了,卖关子卖了这么久,现在该说重点了。如果你为自己的一台EC2实例事先设置好了多个网络接口,又把什么”自动分配公有IP“啊,igw啊都设置好了,实例一启动,呀!竟然还是没有公有IP,当然也就不能上网,这是为嘛呢?

因为这是AWS EC2的一个限制,正常情况下一个实例只会分配一个公网IP,除非使用EIP。 

对于多个网卡的实例,启动的时候,一个公网IP不能分配给两个网卡ENI,因此分配IP失败。

有的同学说,我虽然有两块网卡,但只有一个设置了公网IP,但实例启动之后发现还是没有成功。是的,这也是不行的,由于虚拟化和底层架构的设计,AWS EC2会限制只要网络接口有多个就不去分配公网IP,而不管你是不是只有一个网络接口设置了公网IP。

5. 解决办法

很多时候我们就是需要一台实例对应多个网络接口(要不然要ENI干嘛),这该怎么办呢?

方法一——投机取巧法 

有一个稍稍取巧的办法,在EC2实例启动之前,先只保留一个网络接口,并保证其设置了公有IP,然后启动实例,这时候你会发现实例公有IP设置成功!这时候再将其他ENI附加上去,就可以啦! 
不过这个方法还有一个限制,如果你停止,然后启动了实例,这时候AWS会尝试重新分配公有IP,但是检测到多个ENI,所以仍然不能分配公有IP。公有IP分配又会失败。

方法二——土豪法 

配置EIP。是的就这么简单。不过停机是要付费的。哎,这让我又爱又恨的AWS。。。
 

转载地址:http://rmesi.baihongyu.com/

你可能感兴趣的文章
如果你还不了解 RTC,那我强烈建议你看看这个!
查看>>
沙雕程序员在无聊的时候,都搞出了哪些好玩的小玩意...
查看>>
Mysql复制表以及复制数据库
查看>>
Kafka
查看>>
9.1 为我们的角色划分权限
查看>>
维吉尼亚之加解密及破解
查看>>
TCP/IP协议三次握手与四次握手流程解析
查看>>
PHP 扩展开发 : 编写一个hello world !
查看>>
inet_ntoa、 inet_aton、inet_addr
查看>>
用模板写单链表
查看>>
链表各类操作详解
查看>>
C++实现 简单 单链表
查看>>
Linux的SOCKET编程 简单演示
查看>>
Linux并发服务器编程之多线程并发服务器
查看>>
C语言内存检测
查看>>
Linux epoll模型
查看>>
Linux系统编程——线程池
查看>>
Linux C++线程池实例
查看>>
shared_ptr的一些尴尬
查看>>
C++总结8——shared_ptr和weak_ptr智能指针
查看>>