让我试着解释一下我的情况。我有一个负载平衡器服务器,它可以在一组预定义的 SMTP 服务器上平衡流量。
主机 A(客户端)连接到平衡器 B,平衡器 B 将请求发送到集群节点 C。由于平衡器 B 使用 IP 伪装,因此对于集群节点 C 来说,它好像请求直接来自主机 A,因此它将答复发送到主机 A。
Host A -> Balancer B: clients makes a request on port 25 to the load balancer
Balancer B -> Cluster-Node C: load balancer connects the client to the actual node
Cluster-Node C -> Host A: the node connects back, directly to the client
集群节点 C 的答案实际上应该回到平衡器 B,而不是主机 A。
这是棘手的部分:所有服务器都位于同一子网中。如果我将 Cluster-Nodes 更改为新子网,我可以为它们提供 Balancer B 的网关,这样它就可以正常工作,因为请求是通过网关发送的。
主机 A:10.0.0.10 平衡器 B:10.0.0.20 集群节点 C:10.0.0.30
有没有办法强制将集群节点 C(10.0.0.30)上的所有传出连接发送到平衡器 B(10.0.0.20),无论原始 IP(在本例中为伪装的)是什么?
答案1
首先,您的初步评估是错误的。伪装实际上是用路由器的 IP 地址替换原始发送者的 IP 地址。这会导致目标主机(在您的情况下是集群节点)将响应该地址的情况。路由器将解除数据包的伪装(即用原始 IP 地址替换其自己的 IP 地址)并将数据包反馈给其路由引擎。这也称为 SNAT,通常用于为 LAN 上的计算机提供对 Internet 的访问。
或者,直接这样说:集群节点 C 执行不是将答复发送回主机 A,它将其答复发送到 Balancer B(也就是说,如果您的 SNAT 或伪装配置正确)。
在所有主机都直接连接到同一子网的子网中(您所描述的情况),没有办法强制所有传出连接从一个主机到特定的其他主机。本质上,这会违反子网的定义(无需路由即可访问子网中的所有主机)。
如果您的特定设置不起作用,那么最可能的原因是您的路由设置不正确。很多人忘记了,他们不仅需要为前向流量提供路由,还需要确保返回流量有一条有效的路由。
但是,您应该能够使用 tcpdump 轻松解决所有这些问题。