来自 Hetzner 的故障转移 IP 的 DNS 问题

Kar*_*ell 8 domain-name-system ubuntu failover high-availability hetzner

假设我们有两个服务器 A 和 B,具有“真实”和外部 IP,我们可以切换所谓的“故障转移 ip”(WXYZ)以指向 A 或 B 的特定外部 IP。这从“外部”工作并且是轻松完成。作为背景:故障转移 ip 配置为 /etc/network/interfaces 中的新条目:

auto eth0:0  
iface eth0:0 inet static
  address W.X.Y.Z
  netmask 255.255.255.224 
Run Code Online (Sandbox Code Playgroud)

现在让我们假设 WXYZ 被动态配置为使用硬件 A。现在我从 B 调用'curl domain.com',它使用正确的故障转移 ip WXYZ 但然后以某种方式解析到错误的外部 IP B(或本地主机?)而不是使用配置的一个A:

Trying W.X.Y.Z ...
* connect to W.X.Y.Z port 443 failed: Connection refused
* Failed to connect to domain.com port 443: Connection refused
* Closing connection 0
curl: (7) Failed to connect to domain.com port 443: Connection refused
Run Code Online (Sandbox Code Playgroud)

当我启动本地 nginx 时,它可以成功 curl domain.com

我需要以某种方式在本地配置 DNS 吗?如何了解有关 DNS 链的更多信息?

如果从服务器 B 尝试此操作,则使用mtr只会打印 domain.com

这与这个问题有关吗?

The failover IP is W.X.Y.Z and is also the A record of domain.com

The /etc/hosts file for both nodes serverA and serverB looks like:

    127.0.0.1       localhost
    127.0.1.1       luminarhost            
    xxx    serverA
    xxx    serverB        

The /etc/network/interfaces of serverA

    ### Hetzner Online AG - installimage
    # Loopback device:
    auto lo
    iface lo inet loopback

    # device: eth0
    auto  eth0
    iface eth0 inet static
      address   xxx
      broadcast xxx
      netmask   xxx
      gateway   xxx
      # default route to access subnet
      up route add -net xxx netmask 255.255.255.224 gw xxx eth0

    iface eth0 inet6 static
      address xxx
      netmask xxx
      gateway xxx

    # failover ip
    auto eth0:0
    iface eth0:0 inet static
      address W.X.Y.Z
      netmask 255.255.255.224

and of serverB it is:

    ### Hetzner Online AG - installimage
    # Loopback device:
    auto lo
    iface lo inet loopback

    # device: eth0
    auto  eth0
    iface eth0 inet static
      address   xxx
      broadcast xxx
      netmask   xxx
      gateway   xxx
      # default route to access subnet
      up route add -net xxx netmask 255.255.255.192 gw xxx eth0

    iface eth0 inet6 static
      address xxx
      netmask xxx
      gateway xxx

    # failover ip
    auto eth0:0
    iface eth0:0 inet static
      address W.X.Y.Z
      netmask 255.255.255.224
Run Code Online (Sandbox Code Playgroud)

gf_*_*gf_ 11

  • 正如所承诺的,这是我的答案:

  • 完全披露:我不是为 Hetzner 工作,而是在过去和现在为不同的公司工作,这些公司曾经在 Hetzner 托管硬件。

  • 如果您的个人资料中的位置正确,并且您需要支持:我在同一个城市,可以提供一两个帮助。

  • 对于所有从未与 Hetzner 打交道的人:他们正在过滤网络访问等,这意味着,特别是关于他们的故障转移 IP(可在不同机器上使用以提供某种高可用性的 IP),他们正在发送流量将特定 IP 定向到特定 MAC。

  • 如果一个人想改变目标(机器)流量被定向到,一个已到发送的POST到一个请求API,其经由供应HTTPS。然后 API 验证身份验证(用户名和相应的密码)和请求,如果有效,则将此新配置传播到网络中的各种路由器。这种技术类似于总部位于法国的大型供应商 OVH 使用的技术。

  • 警告:尽管人们使用这些 IP 为其机器/服务提供某种高可用性(如所写),但新路由配置的传播需要一些时间,有时长达约 60 秒。这意味着,例如,如果使用某种自动故障转移,如果流量当前被路由到的机器出现故障,在一段时间内,人们会注意到,流量就会下降,因为机器停机,直到新路由配置就位的时间点。
  • 介绍到此为止,让我们来看看您的具体问题:
  • 正如评论/聊天中所指出的,使用auto eth0:0, 将eth0:0在网络启动后立即在界面上设置您的故障转移 IP ,通常是在启动时。你有两台机器,配置相同,所以这会导致相同的 IP 在两台不同的机器上处于活动状态(这不是不行,但会导致你目前正在处理的情况)。请注意:您正在使用的语法,多次为同一个接口设置别名,已被弃用(但仍然有效)。Debian wiki(此链接)中也描述了“新方式”,它只是将多个 IP 分配给一个接口。
  • 所以:您已经在本地同时为两台机器分配了 IP。curl在您的测试用例中执行以下操作:它将给定的域名解析为一个 IP,然后尝试在端口 443 上连接到该 IP。因为该 IP 在任何情况下都是在本地分配的,因此可以访问,因此数据包永远不会发送到网络。如果nginx(就像在您的测试用例中一样)此时不在本地运行,您只是连接被拒绝,这是完全正确且有效的:“IP 是本地的,所以让我们将流量发送到那里”。它永远不会将数据包发送到某个路由器,该路由器可能包含以下信息:“指向该 IP 的流量应该流向该机器”。
  • 现在......实际上我不完全确定你在追求什么。你只想了解发生了什么?如果是这样,我已经尝试描述了这一点。你想找到/实现一种“解决”这种情况的方法吗?如果是后者,这里有一些想法:
  • 解决方法1:删除指令auto eth0:0(但留下的其余配置eth0:0到位)的/etc/network/interfaces。这样做,不会将 IP 分配给机器。这样做将是您的任务(脚本的任务),它确实ifup eth0:0(并且可能再次与 API 对话以确保流量被路由到正确的机器)。
  • 解决方案 2,又名“自动化所有事情”:不要进行手动故障转移,而是通过两台机器之间的心跳(检查健康状况)实现自动执行此操作的系统:为此存在多种解决方案,例如虚拟路由器冗余协议和(完全公开:我个人最喜欢的,我多年来一直在使用它来完成这样的任务):corosync 和pacmaker,这是在 Linux 下设置提供高可用性的集群的事实标准。(另外,看看这个。)如果你想尝试后一种方式,Kumina 的优秀人员开发(并发布)了一个资源代理几年前在 Hetzner 准确处理这种情况。资源代理负责通过与 API 对话来更新路由信息。
  • 结束(现在):我不完全确定你在追求什么。我已尝试描述您现在面临的问题的根本原因。此外,我试图提出一些可能的解决方案的想法。如果我没有得到您想要做的事情,有些事情不清楚或者您有其他问题:请提供反馈,我很乐意提供帮助(或至少尝试提供)。
  • (此外:您能否将您的配置等移动到您的帖子中,将所有内容放在一个地方,以便这个问题将来对其他人有帮助?)