在 EC2 上使用多個公共 IP 地址的出站代理
我們有一堆 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 中。