轉載請注明出處:http://blog.csdn.net/dongdong9223/article/details/47667627
本文出自【我是干勾魚的博客】
之前在《亞馬遜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”狀態,“附加”button就不能再點擊。
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。。
。