如何為 AWS 中的傳出流量設置靜態 IP 地址?
我在 3 個可用區中有許多 EC2 實例。我在這些實例上執行的應用程序正在與多個具有白名單機制的第三方應用程序進行通信。我知道我可以通過使用 NAT 網關使用靜態 IP 地址(彈性 IP)與這些第三方應用程序進行通信。如果我這樣做,那麼我需要為每個第三方應用程序指定一個特定的路由以使其工作。我想要實現的是一個靜態傳出 IP,而不定義所有這些路由。所以基本上預設情況下通過 NAT 網關路由所有流量。我嘗試了以下操作,但我無法再訪問我的應用程序了。(順便說一下,所有這些 EC2 實例都在應用程序 LoadBalancer 後面)
子網路由表:
10.0.0.0/16 -> local 0.0.0.0/0 -> NAT Gateway
NAT 網關子網路由表
10.0.0.0/16 -> local 0.0.0.0/0 -> Internet Gateway
如果我設置以下路由表,它將起作用,但是我必須為我的應用程序與之通信的每個第三方應用程序設置特定的路由。
子網路由表:
10.0.0.0/16 -> local 0.0.0.0/0 -> Internet Gateway ThirdPartyApplicationIp/32 -> NAT Gateway
NAT 網關子網路由表
10.0.0.0/16 -> local 0.0.0.0/0 -> Internet Gateway
通過專門定義這些路由,我們可能會在 DNS 記錄更新和 IP 地址更改時遇到問題。我知道這會發生,因為我知道一些第三方應用程序也將 AWS 與 ELB 一起使用,並且 ELB 的 IP 會隨著時間而變化。此外,當我們必須像這樣管理所有這些第三方應用程序時,這不是很方便。
有沒有辦法解決這個問題,所以我不必為每個第三方應用程序定義特定的路由,並且仍然能夠通過 Application LoadBalancer 訪問我的應用程序並尊重 DNS 更改?
附加問題:
解決這個問題還可以解決以下我還沒有但在不久的將來會遇到的問題:將來當我們的應用程序與第三方應用程序通信並且該應用程序也連接我們的應用程序時,然後流量通過 NAT 網關路由。因為這是我設置的路由,但是一旦第三方應用程序嘗試通過應用程序 LoadBalancer 連接到我們的應用程序,它就不起作用,因為這樣流量應該直接通過 Internet 網關路由,而不是通過 NAT 網關路由. 但如果我這樣做,我將失去我的靜態 IP。有沒有辦法解決這個問題?
馬特建議的結果: 馬特的建議有效,但我真的不明白為什麼。因此,我開始使用該設置來嘗試找出不同之處。因為路由表和我之前做的一樣,這對我來說似乎很奇怪。事實證明,如果我將一個 EC2 實例添加到具有分配公共 ip 的私有子網(再次使其成為公共子網),整個路由將失敗,我的 ELB 將不再響應請求。刪除那個新的 EC2 實例(具有分配的公共 IP)後,它仍然失敗。只有在我的 ELB 中刪除可用區並再次添加我的私有子網後,它才能工作。現在我不明白的是,為什麼只是簡單地添加一個具有公共 IP 的新 EC2 實例會破壞所有路由?(那個新的 EC2 實例不在 ELB 的目標組中,只是在子網中閒置)
為了有效地使用 NAT 網關/實例,您的 EC2 實例應位於私有子網中。這樣,您只需為所有出站流量通過 NAT 提供預設路由。
將您的 EC2 實例從公有子網移動到私有子網。由於 ELB 位於您的 VPC 中,因此您的負載均衡器仍然可以訪問它們。
此外,通過將您的 EC2 實例移動到私有子網中,您將提高安全性,因為外部世界無法直接訪問它們。如果您需要訪問它們,請設置一個堡壘 EC2 實例,您可以:
- 使用 SSH 通過隧道訪問您的內部 EC2 實例,或者
- SSH 兩次以訪問您的內部 EC2 實例。
我不是 Ansible 無所不知的人,但我確信有一種方法可以使用 Ansible 並使您的 EC2 實例保持私有。