我正在尝试使用 Solaris 11 的 ILB 在两个后端 DNS 服务器之间创建负载平衡器。这是我的要求:
两个外部 IP:.XXX.YYY、.XXX.ZZZ - 这些是我们的客户端点击的 DNS IP 在这两个外部 IP 上的 HA 配置中的两个 ILB 框 两个后端 DNS 服务器
我想让两个 ILB 框(ilb1 和 ilb2)在两个不同传入 IP 上的两个 DNS 服务器(ns1 和 ns2)之间进行负载平衡。我希望 ilb1 在 .XXX.YYY 上成为主要,在 .XXX.ZZZ 上成为次要,而 ilb 与此相反。这样,如果 DNS 服务器或 ILB 服务器出现故障,DNS 请求应该继续不受影响。但是,我们不能对此进行完整 NAT,因为我们要求后端服务器必须能够看到 DNS 请求的实际 SRC_IP - 进行完整 NAT 会使 DNS 服务器认为所有请求都来自ILB 盒子,而不是客户本身。
采用 HALF-NAT 将正确维护 DNS 请求的 SRC_IP,但这意味着数据包现在必须通过请求其的 ILB 框进行路由,以便数据包到达客户端时正确的 IP ,否则客户端会将其丢弃(“来自意外来源的响应”等)。这是一个棘手的问题 - 由于有两个 IP,我如何通过正确的 ILB 框可靠地将请求路由回? DNS 框上的 /etc/defaultrouter 只允许您使用 1 个 IP,因此大约一半的响应将被丢弃。
这个设置可以吗?我的描述清晰如泥吗?
答案1
听起来您已经拥有了大部分所需的东西,但您缺少一些魔力。
首先,要处理多个 VIP 地址,您需要使用 VRRP(或者可能是选播,但我不认为您正在这样做)。您没有明确声明您的这部分工作正常,但我猜您是这样做的,我将只讨论 ILB 和路由。
好消息,您不需要强制通过 ILB 路由回来。
你想要的叫做直接服务器返回并使用ILB的“无状态”模式。
它的作用如下:
- LB 将目标 L2 以太地址更改为真实服务器 L2 地址。
- RS接收具有真实L3源和真实L3目的地的数据包。
- RS 使用正确的 L3 源和目标进行响应。
Oracle 有关如何设置 DSR 的文档具有正确配置 DSR 的完整示例代码。 (笔记:Oracle 的文档是准确的,但语法很差。需要明确的是,步骤 1、3 和 4 是在 ILB 上执行的,而步骤 2 是在真实服务器上执行的。)
简短地描述一下:
type=DSR
在你的ilbadm create-rule
命令中使用- 将 VIP 地址添加到
lo0
每个真实服务器上
如果您的真实服务器是 Linux,您还需要禁用一些路由和 arp 欺骗保护:
echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce