你好,我有一个问题陈述,我正在尝试解决它很长一段时间了。
问题陈述(这是一个网络场景):机器 A 和机器 B 想要连接到机器 D,机器 C 是它们之间的负载均衡器。在机器 D 上,想要确定哪个连接来自机器 A,哪个连接来自机器 B。
因为负载均衡器将使用单个 IP 对来自机器 A 和机器 B 的所有连接进行 SNAT。
为什么我要解决这个问题? 假设有一台恶意机器 Z,它试图连接到机器 D,我想控制这台机器的所有传入连接。
本质上,从 A 到 D 的每个请求都会发生两个连接。
- 机器A至机器C
- 机器C至机器D
这两个连接的 tcp/ip 数据包中是否有一些共同点可以用作标识符?
答案1
如果您有一个第 7 层负载均衡器,并且网络流量支持它,则负载均衡器可以向流量插入有关源地址的线索(例如,HTTP 反向代理通常会添加标头X-Forwarded-For
,其中包含原始调用者地址)。
在较低级别上,您不知道所收到的包的来源,因为任何类型的 NAT 都会修改 IP 标头。
值得一提的是,在类似您的场景中,所有过滤都应在负载均衡器上或之前完成,而不是在后端服务器上完成。后端服务器不应该关心数据包过滤和源识别(除了应用程序级目的之外)。
答案2
您可以通过检查 IP 数据包字段来实现这一点。例如,您可以在源机器上更改 TTL 或设置 DSCP,然后在目标机器上检查它。不过,这里有一些限制 - 如果您知道“有效”机器的距离(以跳数为单位),则 TTL 更改会起作用。