具有 Internet 閘道器和 NAT 閘道的 AWS VPC 路由表

具有 Internet 閘道器和 NAT 閘道的 AWS VPC 路由表

我在 Amazon Web Services 中有一個子網路為 172.31.0.0/16 的 VPC。我已在此子網路中建立了一個 EC2 實例,並為其指定了一個公共彈性 IP。此 VPC 上有一個 Internet 閘道。所以,我的路由表如下:

172.31.0.0/16   local
0.0.0.0/0       igw-b4ac67d0    

為了解決我無法控制的外部服務上的一些 IP 存取問題,我向此 VPC 新增了 NAT 網關,以便所有流向單一外部位址 ABCD 的流量都將透過 NAT 網關路由。也就是說,我希望路由表看起來像這樣:

# GOAL
172.31.0.0/16   local
A.B.C.D/32      nat-451b3be9
0.0.0.0/0       igw-b4ac67d0    

然而,盡我所能,當我單擊“保存”時,AWS 介面會切換順序,這樣我總是會得到

# What AWS gives me
172.31.0.0/16   local
0.0.0.0/0       igw-b4ac67d0    
A.B.C.D/32      nat-451b3be9

這個路由表看起來很愚蠢:NAT 網關永遠不會被使用,而我的流量似乎A.B.C.D仍然來自 EC2 執行個體的彈性 IP。

如何取得路由表 GOAL?

注意:外部服務將允許我添加單身的它將允許存取的 IP 位址。如果我只有一個 EC2 實例,我可以簡單地向他們提供 EC2 執行個體的彈性 IP 位址。但是,我想添加更多以相同方式設定的 EC2 執行個體。因此,NAT 網關。此外,我不能簡單地放棄 Internet 網關而僅使用 NAT 網關,因為我需要外部世界可以存取 EC2 執行個體上的服務。

答案1

這個路由表看起來很愚蠢

是的,按照你的解釋......但你的解釋不正確。 VPC 中的路由表條目實際上沒有順序。

始終選擇最具體的路線。

表中的每條路由都指定一個目的地 CIDR 和一個目標(例如,發送到外部公司網路 172.16.0.0/12 的流量將作為虛擬專用網關的目標)。我們使用與流量相符的最具體的路由來確定如何路由流量。

http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_Route_Tables.html

但是,如果 NAT 閘道實際上位於使用此路由表的子網路上,您的設定仍然不起作用。 NAT 閘道必須位於其路由表中沒有的子網路中任何指向回 NAT 網關的路由-否則,這是一個路由循環。對於 Internet,NAT 網關使用其實際連接的子網路的 VPC 路由表來存取 Internet 網關...因此它必須位於與要存取的實例不同的子網路中使用它,因為該/32路由不能放置在會影響NAT 網關出站流量的位置。

對於那些沒有意識到 VPC 網路不是帶有路由器的傳統乙太網路的人來說,這是違反直覺的。整個網路是軟體定義的,而不是實體的,因此當流量穿過可用區域內的子網路邊界時,不會出現效能損失,例如一個子網路上的EC2 實例使用另一台電腦上的NAT 閘道(或NAT 執行個體)。事實上,在這些情況下,從一個子網路穿越到另一個子網路的流量是標準配置,將NAT 網關和ELB 放置在公共子網路上(預設路由是IGW),將EC2 實例放置在私有子網路上(預設路由是NAT 設備)。

進一步請注意,您嘗試的設定將允許出站,但絕不允許從該A.B.C.D位址到此子網路上任何內容的入站連線(從外部發起),因為回傳路由通過 NAT 閘道是不對稱的。

相關內容