AWS EC2對外請求透過NAT Gateway轉譯IP

2020/11/08

需求

很多第三方服務(像是金流、物流、簡訊等)都會要求限制請求的IP

如果Web架構是單台EC2的話還算好處理

把EC2設定好固定IP即可

但如果是比較大型或是高流量的架構通常都會用Auto Scaling

這時候EC2的數量跟IP變成不固定

隨時都可能異動

因此我們需要把所有EC2內對外的請求連線

做出一些處理

讓這些請求到達第三方服務的時候

IP永遠是固定的

 

Nat Gateway

 

About NAT

Network Address Translation

字面上意思就是它可以轉換IP

 

AWS官方提供的架構圖

nat-gateway-diagram.png

 

這邊可以看到

DB Server是設定在Private Subnet裡面

並不能直接連到外網

但透過Route table的設定可以連到Public Subnet的Nat Gateway

再透過Nat Gateway轉換IP並透過Public Subnet的Internet Gateway連到Internet

 

簡易Demo架構

知道原理之後可以設定下列AWS資源

然後EC2對外驗證請求是否正常且IP為Nat Gateway的IP

 

需要的資源

  • Public Subnet
    • Nat Gateway
    • Route table: 設定所有請求導向Internet Gateway(也就是導向外網)
  • Private Subnet
    • Route table: 設定所有請求導向Public Subnet的Nat Gateway
  • EC2一台
    • 設定在Private Subnet
  • 任一可接收請求並且Log請求IP的Web Server: 這邊使用laravel

 

在這些資源下

假設可接收請求的Web Server提供一支簡易API(https://foobar.com/api)

只call這隻API Web Server就會紀錄請求IP寫入log

這樣就可以透過log知道請求的IP是否為Nat Gateway

請求的話就登入Private Subnet的EC2簡單使用curl即可

 

Subnet

設定一個Public Subnet、一個Private Subnet

20.png

 

確認Public Subnet的Route table有連接Internet Gateway(這樣才能接到外網)

30.png

 

設定Nat Gateway

設定一個Nat Gateway

並且配一個固定IP

這個IP就是到時候對外請求的IP

也就是要交給第三方服務設定的允許IP

 

10.png

 

設定Route table

將所有請求(0.0.0.0/0)都導向剛才設定的Nat Gateway

50.png

 

調整Private Subnet的Route table

將Private Subnet的Route Table改為剛才設定的那個Route table(點選Edit route table association即可設定)

這樣Private Subnet內發起的請求

就會經過那組Route table導向Nat Gateway

40.png

 

開啟測試的EC2

將EC2放到Private Subnet中

70.png

 

另外要確認Security Group傳入/傳出請求是否能正常

這邊可以先允許所有的傳出規則

80.png

 

開好EC2後就會看到Private IP

可以先登入同一個VPC內的Public EC2

再跳到這台Demo的EC2

90.png

 

從Private EC2中發測試請求

登入Private EC2後

使用curl發先前說的測試API請求(https://foobar.com/api)

curl https://foobar.com/api

 

接著看這個對外API Server Log到的IP

100.png

 

比對一下前面設定的Nat Gateway

確認都是一樣的IP175.41.154.121

110.png

 

其他參考資源

 

這些影片看完會對架構、操作比較了解

 

 

Troubleshooting