为什么我无法通过本地网络上的负载平衡器访问网络服务器?

为什么我无法通过本地网络上的负载平衡器访问网络服务器?

当我尝试使用 curl(或 wget、lynx 等)从本地网络上的服务器连接到我们的网站(该网站位于 CoyotePoint 负载平衡器后面的本地服务器上)时,curl 会失败。Ping 没有这个问题。

当我卷曲直接地到该负载均衡器后面的任何服务器(来自和到同一个本地网络),我也没有问题。无论我使用的本地服务器是否位于负载均衡器后面,都没有关系。

有人知道为什么我无法通过本地网络上的负载均衡器访问我的网络服务器吗?

编辑:附加信息:

curl 的错误信息:

*   Trying [ip address]... connected
* Connected to [web address] ([ip address]) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.12.6.2 zlib/1.2.3 libidn/1.9 libssh2/1.2.4
> Host: [web address]
> Accept: */*
> 
* Closing connection #0
* Failure when receiving data from the peer
curl: (56) Failure when receiving data from the peer

该IP地址是正确的外部地址,而不是内网IP。

我尝试使用网址(而不是 IP 地址)来执行 curl。该网址解析为正确的 IP 地址,以便通过我们的负载均衡器(外部)连接到站点。

据我了解,我们的网络(我显然不是这方面的专家)我们所有的服务器和负载均衡器都在同一个网络上。

答案1

哪种负载平衡?(您是在网络层、应用层等进行负载平衡吗);还定义“不起作用”

我要冒险猜测一下,您的后端服务器的 NAT 或路由对于您的本地子网配置不正确。即:您可以访问负载均衡器,并且负载均衡器会将流量转发到您的一台服务器,但该服务器无法将数据包发回给您。

打开 wireshark 并查看 TCP 连接失败/停止的位置。

此外,PING(ICMP)和 TCP 是完全不同的。

答案2

如果我理解您的网络正确的话,您的客户端和原始服务器都在网络 A 上,而负载均衡器 VIP 位于网络 B 上?

这意味着 LB 必须首先将其请求转发到网络 B,然后后退到网络 A。一些负载平衡器可以做到这一点(至少 F5 和 Foundry 是这样设置的)但这是一种非标准配置、依赖于供应商并且通常默认不启用。

答案3

遗憾的是,您的问题有点模糊,无法给出具体的答案,如果您能回答以下问题,我们也许可以提供更多帮助。

  • 网络设置是怎样的?例如,所有服务器是否都在网络 A 中,包括负载平衡器后面的服务器,而负载平衡 VIP 则位于单独的网络上。

    如果是这种情况,那么我认为负载均衡器不会回复 VIP 上的任何请求,因为这些请求是从内部网络传入的,因此就它而言,它们不应该使用 VIP 并且会忽略流量。

    我曾在防火墙上看到过这种情况,当内部网络上的服务器尝试使用其外部地址访问同一网络上的另一台服务器时,防火墙会丢弃该数据包,因为它不在该接口上列出的范围,而另一台服务器会忽略它,因为它对外部 IP 一无所知。我并不是 100% 确定,但我希望同样的情况也适用于负载平衡器,但我从未真正尝试过。

  • 您尝试如何连接?您使用的是 URL 还是 IP 地址?如果您使用的是 URL 地址,则 ping 时返回的地址是什么?您可能需要编辑本地 hosts 文件或域的 DNS

根据您的更新,我是否可以假设外部地址是通过防火墙上的 NAT 提供的,因此我相信 curl 请求如下,

  1. 查询域穿过防火墙并从 DNS 服务器获取外部 IP。
  2. 然后将此外部 IP 反馈给服务器,服务器尝试连接并最终失败。

您可以尝试更新服务器主机文件以将域解析为 VIP 的内部 IP,然后再次测试,如果此操作有效,您可能需要检查防火墙是否支持 DNS 修改(更多信息这里)。

答案4

听起来您的负载均衡器处于 NAT 模式。如果您尝试通过负载均衡器连接到 Web 服务器,它们将看到您位于本地子网上并尝试直接回复您(这将失败,因为负载均衡器已对流量进行了 NAT。避免这种情况的方法是更改​​负载平衡服务器上的路由:

为了解决 Linux 服务器的这个问题,我们需要通过更改为更高的指标来修改本地网络路由:

route del -net 192.168.1.0 netmask 255.255.255.0 dev eth0 
route add -net 192.168.1.0 netmask 255.255.255.0 metric 2000 dev eth0

注意:将 192.168.1.0 替换为您的本地子网地址。然后我们需要确保本地网络访问使用负载均衡器作为其默认路由:

route add -net 192.168.1.0 netmask 255.255.255.0 gateway 192.168.1.21 metric 0 dev eth0

注意:将 192.168.1.21 替换为您的负载均衡器网关

更详细的解释见单臂(单子网)NAT模式,Loadbalancer.org 手册第 83 页。

相关内容