![任播 DNS——如何处理 TCP DNS 请求?](https://linux22.com/image/800601/%E4%BB%BB%E6%92%AD%20DNS%E2%80%94%E2%80%94%E5%A6%82%E4%BD%95%E5%A4%84%E7%90%86%20TCP%20DNS%20%E8%AF%B7%E6%B1%82%EF%BC%9F.png)
假设我使用 bird 在内部网络上设置了一对任播 DNS 服务器,它们只是通过 OSPF 与我的核心路由器通信。我发现这在互联网上并实现了这一目标。
如果我设置一个比另一个具有更高成本路径,那么太好了,我刚刚做了一个可爱的方法来进行故障转移,而不导致我的客户端在从他们的 resolv.conf 中的一个主机切换到他们的 resolv.conf 中的另一个解析器时出现任何超时。
但这对我来说还不够好。我想在我的 DNS 服务器之间分配负载。因此我将两者的成本设置为相同,这样路由器现在应该执行 ECMP,并将 50% 的请求发送给一个,将 50% 的请求发送给另一个。
但事实证明,我的企业很大一部分 DNS 都使用 TCP——假设我们有大量的 SRV 记录,而且我们使用 DNSSEC,因为我们很棒。
现在,我该如何设置我的智能任播设置来应对这样的事实:TCP 请求需要 3 或 4 个数据包才能完成请求,而现在这 3 个数据包中的一个总是会发送到错误的路由器并重置 TCP 连接。
答案1
好吧,在这样的方案中,你可以阻止无效会话的 RST 响应,不是吗?:) 或者(更好的是),不要将其传递到服务中:
— 无效状态?
— 不行,试试其他!
PS:是的,我真的很喜欢演示”TCP 任播 - 不要相信 FUD - nanog“通过我在评论中给你的链接。;)
答案2
只需使用每个流的 OSPF ECMP 而不是每个数据包,就可以了,就像 NANOG 演示所说的那样。
TCP 的任播仅对长寿命 TCP 会话而言是一个潜在问题,而且我所知道的几乎每个 DNS 实现都仅使用非常短暂的 TCP 会话。