我们有一堆后端服务器,它们以 EC2 实例的形式存在于 AWS VPC 中的私有子网中,需要与第三方 API 通信。此 API 根据源 IP 地址限制了我们可以发送的请求,并且在扩展设置时,我们已开始达到用于所有出站流量的 NAT 网关的 IP 限制。
因此,我想为出站流量设置一个代理,并附加多个 EIP。为了进行测试,我目前使用一个 Amazon Linux 2 实例,该实例有 2 个 ENI,每个 ENI 附加 2 个 EIP。后端服务器打开到出站代理的 SSH 隧道并将第三方 API 映射到本地端口,服务器主机文件中的条目将发往该主机名的所有流量重定向到本地主机,这种设置通常运行良好,但来自代理的出站流量始终仅使用第一个关联的 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 规则来标记来自用户 3 的流量:
-A OUTPUT -m owner --uid-owner 1003 -j MARK --set-xmark 0x3/0xffffffff
- 创建规则以对标记为 3 的所有数据包使用自定义路由表:
32763: from all fwmark 0x3 lookup ip3
- 这再次不起作用。数据包确实得到了不同的处理。除了上面例子中的用户 3 之外,所有用户都可以与世界通信。
我做错了什么?我是否遗漏了一些琐碎的事情,或者我的整个方法注定要失败?我非常乐意接受建议,无论是关于如何使此设置正常工作还是关于替代方法的建议...
提前谢谢您!
答案1
联系运行 API 的组织,并说明情况。建立业务关系是解决问题的一个良好开端。
实施 IPv6 以降低技术复杂性。AWS 将为您提供公共空间的每个子网的 /64,从而允许您的实例和 API 之间直接通信。每个实例的唯一地址使您确实在扩展。要求您的网络被允许更高的配额变得更容易,因为所有网络都在您的 VPC 的 /56 中。
答案2
最终我自己找到了解决方案并在这里记录下来:通过特定冗余路由根据登录用户路由流量的最佳方式?
以防将来有人偶然发现这一点。