我有以下情况:
ipvs-Loadbalancer - direct routing: 123.123.123.117
Realserver 1: eth0: 123.123.123.123 eth1: 10.10.0.1
Realserver 2: eth0: 123.123.123.124 eth1: 10.10.0.2
Random server on internal network: eth0: 10.10.0.44
负载平衡在外部 IP 上工作得很好。如果我连接到 123.123.123.117,我会收到来自 123.123.123.123 或 123.123.123.124 的响应。但如果我尝试从我网络内的随机服务器连接,它就不会起作用。
tcpdump 告诉我,请求通过负载均衡器到达 realserver,但没有响应。该设置在 Debian Squeeze 上确实有效,但自从我切换到 Ubuntu Trusty 后,它就不起作用了。
realserver 上的 route -n 告诉我:
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 123.123.123.113 0.0.0.0 UG 0 0 0 eth1
10.10.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
123.123.123.112 0.0.0.0 255.255.255.240 U 0 0 0 eth1
有任何想法吗?
谢谢!
答案1
无法通过本地网络完成。我浪费了不少时间尝试 :)
问题是没有发生源 NAT,因此当客户端 123.123.123.99 连接到 123.123.123.117 时,它将被发送到 123.123.123.123 或 123.123.123.124。这些系统看到源 IP 是 123.123.123.99,并将响应直接发送到 123.123.123.99。然而,那里的客户端不期望来自 123.123.123.123 或 123.123.123.124 的任何流量,并发送 TCP RESET。同时它仍在等待来自 123.123.123.117 的响应,但该响应永远不会到来。
或者,将真实服务器(ipvs 进行负载平衡的地方)放在私有子网上,但是您需要一个单独的 (V)LAN。
答案2
好的,问题是内核会检查数据包是否可以通过其所来自的接口路由。如果不可以,则不会接受该数据包。
禁用真实服务器上的反向路径过滤器可以达到此目的:
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.eth1.rp_filter = 0