AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1089114
Accepted
MoWo
MoWo
Asked: 2022-01-06 14:58:02 +0800 CST2022-01-06 14:58:02 +0800 CST 2022-01-06 14:58:02 +0800 CST

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

  • 772

我们有一堆 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 之外,所有用户都可以与世界通信。

我究竟做错了什么?是否有一些微不足道的东西我错过了,或者我的整个方法注定要失败?我非常愿意接受有关使此设置正常工作以及替代方法的建议...

提前非常感谢!

routing amazon-ec2 ssh-tunnel linux-networking outboundrules
  • 2 2 个回答
  • 122 Views

2 个回答

  • Voted
  1. John Mahowald
    2022-01-06T15:41:03+08:002022-01-06T15:41:03+08:00

    联系运行 API 的组织,并说明情况。建立业务关系是解决问题的良好开端。

    实施 IPv6 以降低技术复杂性。AWS 将为您提供每个公共​​空间子网 /64,允许您的实例和 API 之间直接通信。每个实例的唯一地址表明您确实在向外扩展。要求您的网络获得更高的配额变得更容易,因为所有这些都在您的 VPC 的 /56 中。

    • 3
  2. Best Answer
    MoWo
    2022-01-09T13:50:10+08:002022-01-09T13:50:10+08:00

    毕竟我自己确实找到了一个解决方案并在此处记录了它:Best way to route traffic based on logged in user via specific冗余路由?

    以防万一smeone在未来绊倒这个。

    • 0

相关问题

  • 无法通过 Ubuntu VPN 访问外部网络

  • 将路由永久添加到 Solaris 10

  • Quagga 套件中的 ./configure --disable-zebra 代表什么?

  • 使用特定接口进行出站连接(Ubuntu 9.04)

  • Linux TC/策略路由工具

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve