我们有一堆 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 之外,所有用户都可以与世界通信。
我究竟做错了什么?是否有一些微不足道的东西我错过了,或者我的整个方法注定要失败?我非常愿意接受有关使此设置正常工作以及替代方法的建议...
提前非常感谢!