Amazon-Web-Services

AWS VPC:網際網路網關與 NAT

  • July 24, 2019

這個這個這個和 我的問題很相關。雖然它似乎回答了很多人的疑問,但我仍然很難理解這種設置是特定於 AWS 還是一般網路。如果是後者,那麼我需要重新審視我的基礎知識。我懷疑這已經是問題了。

我的理解

如果專用網路連接到 Internet,則其主機需要具有公共 IP 才能在 Internet 上唯一標識。到 Internet 的所有流量(入站或出站)都使用此公共 IP 地址進行。來自該網路的主機在連接到 Internet 時會獲得一個公共 IP。來自該主機的數據包說 www.google.com 將在數據包中包含主機的私有地址,該地址最終將被 NAT 設備(安裝在路由器/預設網關上)替換為其公共 IP 地址,即如此所示。這就是大多數 Internet(IPV6 除外)的執行方式。

現在,在 AWS

  • 當您創建公共子網並啟用自動分配公共 IP時,您實際上是在通知 Internet 網關在路由時將 EC2 實例的私有地址與來自該 EC2 實例的請求數據包中的 EC2 實例的公共 IP 地址進行切換它在網際網路上的請求,反之亦然。我的理解正確嗎?
  • 當您創建私有子網不將其連接到 Internet 網關)時,您將其保持為私有。然後,我們有意識地確保禁用自動分配公共 IP 。因此,當我們在這個私有子網中啟動 EC2 實例時,我們不會看到 EC2 控制台上的公共 IP。這也意味著此子網中的實例對 Internet 不可見。現在,如果我將此私有子網連接到 NAT 設備(當然,它位於公共子網中)(請不要將我與 NAT 網關目前做得更好的東西混淆),然後,我本質上是讓 NAT 設備找出公共 IP,以便從請求與 Internet 通信的私有子網中為特定主機 X 分配,因為需要公共 IP才能與 Internet 通信。

現在,

  • 這不是路由器/(網際網路)網關已經在 AWS 和一般網路中所做的事情嗎?將公共 IP 分配給網路上的主機,並在數據包(來自該網路上的主機)傳出到 Internet 的過程中不斷用公共 IP 地址替換私有 IP 地址,這難道不是嗎?通過路由器出去?
  • 假設 NAT 設備計算出要分配給該私有子網主機的 IP 1.2.3.4。如果,“不知何故”,這個 IP 在 Internet 上變得已知,那麼私有子網上的這個主機也應該可以從 Internet 訪問,除非 NAT 設備採取了一些技巧(參見後續問題)。***我的理解對嗎?***現在,AWS 表示 NAT 設備不允許入站通信。這是否與即使公共 IP 1.2.3.4(NAT 設備分配給該私有子網的主機)已知,入站連接也受到強制限制的事實相反?或者,NAT 設備是否只是代表來自私有網路的主機使用自己的 IP 地址(這不是 NAT 設備理想情況下應該做的事情;NAT 設備獲取分配的私有 IP 並將其替換為數據包上的公共 IP )?
  • 此外,AWS 還允許您在私有子網上啟用自動分配公共 IP。而且我可以確認我可以在具有公共 IP 的私有子網上看到 EC2 實例。因此,現在您有一個私有子網(因為它們未連接到路由表中的 Internet 網關),其中的實例具有公共 IP(因為您在私有子網上啟用了自動分配公共 IP)。這應該怎麼解釋?

我認為您誤解了*NAT 網關的功能,*這導致了所有其他混淆。

  • NAT 不會將地址隨機分配給內部/私有主機。
  • NAT 設備通常有兩個介面-內部有一個私有 IP,例如 10.0.0.1。和外部具有公共 IP,例如 1.2.3.4。
  • 來自內部網路的主機,例如具有某個10.0.0.x地址(並且沒有公共地址)將所有出站流量發送到NAT 網關,並且該 NAT 網關將數據包中的源 IP(例如10.0.0.123)替換為其自己的公共 IP(即1.2.3.4)。然後它將數據包發送到 Internet 上的目的地,例如 Google。
  • TCP 數據包不僅有源地址和目的地址,還有源埠和目的。源埠也可以被 NAT 網關替換,以避免在多個主機嘗試與同一源埠通信時發生衝突。

NAT解釋:

一個內部主機10.0.0.123想要通過 HTTPS 從 google.com 下載一些東西,即port216.58.203.110``443

  1. 它向 NAT 網關發送一個包含源10.0.0.123:12345(地址:隨機本地埠)和目標(地址: https216.58.203.110:443埠)的數據包,因為對於所有. 10.0.0.x
  2. NAT 網關將源替換10.0.0.123:12345為它自己的公共 IP 和一些隨機埠1.2.3.4:54321
  3. 它在其連接跟踪表中記錄從10.0.0.123:12345to的連接216.58.203.110:443已轉換為。1.2.3.4:54321
  4. 當來自 google 的返回數據包到達帶有目的地的 NAT 網關時1.2.3.4:54321,網關會查找該記錄(地址:埠)並看到它應該將其轉換回10.0.0.123:12345並將其發送到該埠上的該主機。

如果同時來自本地網路的另一台主機(例如10.0.0.99)嘗試從 Google 下載某些內容,則會發生以下情況:

  1. NAT 網關再次將源 IP 轉換為其自己的公共 IP 1.2.3.4 ,但源埠將與以前不同,例如56789.
  2. 現在 Google 看到來自我們的 NAT 網關的兩個連接
  • 1.2.3.4:54321- 到 - 216.58.203.110:443(NAT 網關知道原始來源實際上是10.0.0.123:12345
  • 1.2.3.4:56789- 到 - 216.58.203.110:443(NAT GW 知道原始來源是10.0.0.99:12345)。

這兩個連接看似來自 NAT 網關,但實際上它們是從內部網路中的*不同主機發起的。*只有 NAT 網關知道映射。

簡而言之就是這樣。


現在有幾點注意事項:

  • 您無法啟動**從外部到 NAT 後面的主機的連接。您只能對從內部發起的數據包發送回复。

這是因為當內部主機發送第一個數據包時,內部IP:port和 NAT 網關之間的映射就完成了。IP:port

如果你想10.0.0.123:22從外部通過 SSH 連接你會怎麼做?您可以將 SSH 數據包發送到 NAT 網關 IP 1.2.3.4,但是**什麼埠?**看,沒有映射,所以不可能從外部啟動連接。

  • 另一方面,**路由器不會更改任何 IP 或埠(與 NAT 網關相反)。**他們通過幾乎沒有變化的數據包。
  • 在 AWS 上下文中RouterIGW = Internet Gateway。NAT 可以是NAT GatewayNAT Instance,它們做同樣的事情。

希望能解釋它:)

引用自:https://serverfault.com/questions/959750