最近項目遇到個需求,需要將後端的服務器出口統一成一個 IP,服務器在 AWS 上,這個可以用 AWS 的 NAT Gateway 實現,調研實施的過程中發現如果對 AWS 相關概念的話不熟悉還是會繞點路的,簡單整理下 NAT Gateway 的使用,希望對需要的小夥伴有幫助。
一. 相關概念簡介
1. NAT Gateway
NAT Gateway(網絡地址轉換網關) 主要用來對一組私有子網內的服務器進行代理,被代理的所有服務器的對外請求都將通過 NAT 網關發出,這樣目標服務所看到的請求 IP 也都是 NAT 網關的 IP。這麼做有兩個好處:
- 應用服務器只能在內網訪問,提高了安全性
- 如果要訪問的服務存在 IP 白名單的話,只需要將 NAT 網關的 IP 加進去即可,不需要挨個添加服務器地址。(自己之前和一家公司對接數據接口,對方就有 IP 白名單,當時沒有統一網關導致添加了 20 幾個 IP,一旦服務器 IP 變了還得重加,都是淚。。。)
下圖是 AWS 官網中給出一個包含 NAT 網關的 VPC 架構圖:
簡單講解一下,在 10.0.0.0 VPC 下有兩個子網:公共子網 10.0.0.0/24
和 私有子網 10.0.1.0/24
。NAT 網關位於公共子網中,因此可以訪問公網。私有子網的三臺機器連接到了 NAT 網關,對公網的訪問全部通過 NAT 網關實現。
公共子網與私有子網
AWS 的 VPC 網絡配置關係是:實例與子網關聯,子網關聯路由表,路由表設置網關。所謂公共子網就是其對應的路由表中配置了規則將請求路由到了 Internet Gateway
,這樣公共子網內的服務器實例、NAT 網關就可以對外訪問。而私有子網就是其關聯的路由表中沒有配置到 Internet Gatway
的路由規則,因此無法對外訪問。
清楚了公共子網、私有子網的概念,就可以進行 NAT 網關的相關設置了。私有子網中的服務器通過 NAT 網關對外訪問需要做下面幾步操作:
- VPC 下創建公共子網和私有子網
- 在私有子網中開通服務器實例
- 在公共子網中開通 NAT 網關和登陸到私有服務器的跳板機
- 修改私有子網的路由表規則,配置路由地址到 NAT 網關
- 執行測試。
下面是具體的操作,
二. NAT 網關設置
1. 設置私有子網
上面提到,AWS 中網絡配置的關係:實例與子網關聯,子網關聯路由表,路由表設置網關
。我在 AWS 香港地區有三個子網如下
所有子網的默認路由表配置一般都是指向了 Internet Gateway
,如圖所示:
圖中 0.0.0.0/0
的規則就表示將所有的請求路由到默認的 Internet Gateway
,從而可以與公網通信。爲了將使得子網變爲私有,我們需要自己新建路由表,並將指向 Internet Gateway
的路由規則給去掉,這樣子網就無法直接訪問公網了。如圖所示:
- 創建路由表
- 修改子網關聯
可以看到新建好的路由表並沒有關聯子網,點擊 編輯子網關聯
將 subnet-1f2a2767
子網關聯上,這樣這個子網下的服務器就無法和公網通信了。
2. 創建私有服務器與跳板機
我選擇第上面關聯到自定義路由表的自我一個子網 subnet-1f2a2767
作爲私有子網,第二個 f500f 作爲公有子網。在私有子網下開了兩臺服務器,在公有子網下設置了一臺服務器作爲跳板機,步驟如下,注意在 「配置示例」模塊選擇對應的子網,並將在私有子網中的服務器禁用公網 IP。
- 選擇服務器
- 選擇子網,啓動實例。
此時子網中的兩臺服務器是無法與公網通信的。跳板機的創建也是上面的步驟,只是要選擇公共子網並設置公網 IP,這裏不再贅述。
3. 創建 NAT 網關
在 AWS 的 VPC 控制面板,選擇 「NAT 網關」,點擊創建,需要選擇子網,這裏一定要選擇公共子網,保證 NAT 網關是可以與公網通信。
- 創建 NAT 網關,選擇公共子網並分配 IP
可以看到創建的 NAT 網關 IP 爲 18.162.217.123
,待 NAT 網關的狀態變爲可用之後就可以修改路由表,將子網中的請求路由到 NAT 網關了。
4. 修改私有子網的路由表
創建完成 NAT 網關之後,修改我們自己創建的私有子網的路由表,將子網中所有的請求路由到 NAT 網關了。如圖:
-
選擇之前新建的路由表,選擇「編輯路由」
-
第一欄目標設置爲
0.0.0.0/0
表示除第一條外所有的請求都路由向設置的網關,第二欄目標選擇 NAT 網關,就會出現可選的 NAT 網關列表
-
選擇上面新建的 NAT 網關
5. 測試網絡
默認情況下,私有網絡內的服務器是無法訪問公網的,可以先用 ping 或者 curl 命令試下。配置完成之後就可以測試我們的私網服務器是否可以與外界通信了,我在騰訊雲開了一臺新的服務器並運行了 Nginx,訪問情況如下:
可以看到私網內的服務器可以訪問其他網絡內的服務器了,然後看下騰訊雲上的 Nginx 日誌,如下:
日誌中請求的源 IP 爲 18.162.217.123
,是我們設置的 NAT 網關的 IP 地址,由此通過 NAT 網關實現私有子網內服務器對外統一訪問的設置就完成了。
老鐵,都看到這了來一波點贊、評論、關注三連可好
我是 AhriJ鄒同學,前後端、小程序、DevOps 都搞的炸棧工程師。博客持續更新,如果覺得寫的不錯,歡迎來一波老鐵三連,不好的話也歡迎指正,互相學習,共同進步。