Amazon-Ec2

在 EC2 上使用多個公共 IP 地址的出站代理

  • January 8, 2022

我們有一堆 EC2 實例形式的後端伺服器,它們位於 AWS VPC 的私有子網中,需要與第 3 方 API 通信。此 API 限制了我們可以根據原始 IP 地址發送的請求,並且在擴展我們的設置時,我們已經開始達到用於所有出站流量的 NAT 網關 IP 的限制。

因此,我想為連接了多個 EIP 的出站流量設置代理。為了進行測試,我目前正在使用帶有 2 個 ENI 的 Amazon Linux 2 實例,每個 ENI 附加了 2 個 EIP。後端伺服器打開一個到出站代理的 SSH 隧道並將第 3 方 API 映射到本地埠,伺服器主機文件中的一個條目將所有流量重定向到該主機名到 localhost,並且此設置通常工作正常,但來自proxy 總是只使用第一個關聯的 EIP。

所以我的設置如下所示:

ENI1: eth0
private IP1: 10.0.11.81
private IP2: 10.0.11.82

ENI2: eth1
private IP3: 10.0.11.52
private IP4: 10.0.11.53

original route table:
default via 10.0.11.1 dev eth0
default via 10.0.11.1 dev eth1 metric 10001
10.0.11.0/24 dev eth0 proto kernel scope link src 10.0.11.81
10.0.11.0/24 dev eth1 proto kernel scope link src 10.0.11.52
169.254.169.254 dev eth0

我現在希望能夠在通過出站代理呼叫 API 時指定哪個後端伺服器使用哪個 EIP。我的第一次嘗試如下:

  • 在代理主機上設置 4 個不同的使用者
  • 像這樣為每個使用者添加 iptable 規則:iptables -t nat -m owner --uid-owner user1 -A POSTROUTING -j SNAT --to IP1等等。
  • 這適用於連接到主 ENI(即機器中的 eth0)的 2 個 IP,但不適用於與第二個 ENI(eth1)關聯的 2 個 IP
  • 添加-o eth1到語句中也不起作用

我的下一個嘗試是為每個 IP 地址創建自定義路由表並將它們與策略規則匹配:

  • 創建自定義路由表,即為 IP3:
default via 10.0.11.1 dev eth1
10.0.11.0/24 dev eth1 proto static scope link src 10.0.11.52
169.254.169.254 dev eth1 scope link
  • 創建 iptables 規則以標記來自 user3 的流量:-A OUTPUT -m owner --uid-owner 1003 -j MARK --set-xmark 0x3/0xffffffff
  • 創建規則以對標記為 3 的所有數據包使用自定義路由表:32763: from all fwmark 0x3 lookup ip3
  • 這又不起作用。數據包確實會得到不同的處理。除了上面範例中的 user3 之外,所有使用者都可以與世界通信。

我究竟做錯了什麼?是否有一些微不足道的東西我錯過了,或者我的整個方法注定要失敗?我非常願意接受有關使此設置正常工作以及替代方法的建議…

提前非常感謝!

畢竟我自己確實找到了一個解決方案並在此處記錄了它:Best way to route traffic based on logged in user via specific冗餘路由?

以防萬一smeone在未來絆倒這個。

聯繫執行 API 的組織,並說明情況。建立業務關係是解決問題的良好開端。

實施 IPv6 以降低技術複雜性。AWS 將為您提供每個公共空間子網 /64,允許您的實例和 API 之間直接通信。每個實例的唯一地址表明您確實在向外擴展。要求您的網路獲得更高的配額變得更容易,因為所有這些都在您的 VPC 的 /56 中。

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