0

我正在 Linux 上开发某种透明代理的概念验证。

透明代理拦截 TCP 流量并将其转发到后端。我使用https://www.kernel.org/doc/Documentation/networking/tproxy.txt和欺骗套接字进行传出 TCP 连接。

在我的开发 PC 上,我能够使用 Docker 模拟网络并且一切正常。

但是我需要在 AWS 上部署测试环境。

建议设计:

同一子网内的三个虚拟机:

  • 客户端,192.168.0.2
  • 代理,192.168.0.3
  • 后端,192.168.0.4

在客户端上,我将路由添加到 192.168.0.4 到 192.168.0.3

在代理上,我将 TPROXY 配置为拦截 TCP 数据包并将其转发到具有 192.168.0.2 IP 源地址的后端。我们的透明代理在这里工作。

在后端,我运行简单的 Web 服务器。我还添加了到 192.168.0.2 到 192.168.0.3 的路由,否则数据包将直接返回到 192.168.0.2

问题:

提议的网络设计会按预期工作吗?

AWS 使用某种软件定义的网络,我不知道它的工作方式是否与将 3 个 Linux 机器连接到一个以太网交换机的方式相同。

4

1 回答 1

1

提议的网络设计会按预期工作吗?

不大可能。

实例可以访问的 VPC 中的 IP 网络从表面上看是IP网络(第 3 层),而不是以太网(第 2 层),即使它呈现给实例就像它是以太网一样。

对以太网交换机“感兴趣”的从/到地址是 MAC 地址。EC2 网络感兴趣的从/到地址是 IP 地址。如果您通过欺骗地址和操纵路由表来调整实例的 IP 堆栈,则仅有的两种可能结果应该是其中之一:根据基础架构对 IP 地址应该存在的位置的了解,数据包实际上会到达正确的实例。 .. 否则数据包将被网络丢弃。最有可能的是后者。

每个 EC2 实例上都有一个IP 源/目标检查标志,它禁用了网络的一些内置数据包阻止,否则网络会认为是欺骗,但这应该只适用于 IP 地址在 VPC 超网 CIDR 块之外的流量 - - 每个实例的 IP 地址是基础设施已知的,不受您正在考虑的那种调整的影响。

您可以使用通用路由封装 (GRE) 协议、OpenVPN 或其他一些隧道解决方案在实例之间构建隧道,然后这些实例将在不同的 IP 子网中具有额外的网络接口,它们可以使用不同的子网直接交换流量以及它们构成的规则,因为网络不会看到封装在隧道中的数据包上的地址,并且不会对内部有效负载施加任何限制。

可能相关:在 AWS 以外的某个云提供商中,一个网络设计远不如 VPC 明智的提供商,我使用实例间隧道(使用 OpenVPN 构建)来构建我自己的虚拟私有子网,这比什么更有意义其他云提供商提供的,所以我会说这可能是一个完全可行的替代方案——我的解决方案增加的延迟是亚毫秒级的。

但这一切都假设您有充分的理由选择涉及数据包修改的解决方案。应该有一种更好、更直接的方法来解决您要解决的确切问题。

于 2017-05-05T10:33:44.950 回答