Ubuntu

來自 Hetzner 的故障轉移 IP 的 DNS 問題

  • April 6, 2018

假設我們有兩台伺服器 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 

現在讓我們假設 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

當我啟動本地 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
  • 正如所承諾的,這是我的答案:
  • 完全披露:我不是在 Hetzner 工作,而是在過去和現在為不同的公司工作,這些公司過去和現在都在 Hetzner 託管硬體。
  • 如果您的個人資料中的位置正確,並且您需要支持:我在同一個城市,可以提供一兩個幫助。
  • 對於所有從未與 Hetzner 打過交道的人:他們正在過濾網路訪問等,這意味著,尤其是關於他們的故障轉移 IP(可在不同機器上使用以提供某種高可用性的 IP),他們正在發送流量指向特定 IP 到特定 MAC。
  • 如果想要更改流量指向的目標(機器),則必須向APIPOST發送請求,該API通過. 然後 API 驗證身份驗證(即使用者名和相應的密碼)和請求,如果有效,則將此新配置傳播到網路中的各種路由器。這種技術類似於法國的大型供應商 OVH 使用的技術。HTTPS
  • 警告:儘管人們使用這些 IP 為他們的機器/服務提供某種高可用性(如所寫),但新路由配置的傳播需要一些時間,有時長達 60 秒。這意味著,例如,如果使用某種自動故障轉移,如果流量目前被路由到的機器停機一段時間,人們會注意到這一點,流量就會被丟棄,因為機器停機,直到新路由配置到位的時間點。
  • 介紹到此為止,我們來看看你的具體問題:
  • 正如評論/聊天中所指出的,使用auto eth0:0, 將在介面設置您的故障轉移 IP eth0:0,一旦網路啟動,通常在啟動時。您有兩台機器,具有相同的配置,因此這會導致相同的 IP 在兩台不同的機器上處於活動狀態(這不是不行,但會導致您目前正在處理的情況)。請注意:您使用的語法多次為同一個介面起別名,已被棄用(但仍然有效)。Debian wiki(此連結)中也描述了“新方式”,它只是將多個 IP 分配給一個介面。
  • 所以:您已經同時在本地為兩台機器分配了 IP。curl在您的測試案例中執行以下操作:它將給定的域名解析為一個 IP,然後嘗試在埠 443 連接到該 IP。由於此 IP 在任何情況下都是本地分配的,因此可以訪問,因此數據包永遠不會發送到網路。如果nginx(就像在您的測試案例中)此時沒有在本地執行,您只是被拒絕連接,這完全沒問題且有效:“IP 是本地的,所以讓我們在那裡發送流量”。它永遠不會將數據包發送到某些路由器,該路由器可能具有以下資訊:“定向到此 IP 的流量應該流向此機器”。
  • 現在……實際上我不完全確定你在追求什麼。你只想了解發生了什麼嗎?如果是這樣,我試圖描述這一點。你想找到/實施一種“解決”這種情況的方法嗎?如果是後者,這裡有一些想法:
  • 解決方案 1 auto eth0:0eth0:0/etc/network/interfaces. 這樣做不會將 IP 分配給機器。這樣做將是您的任務(腳本的任務),它確實ifup eth0:0(並且可能再次與 API 對話以確保流量被路由到正確的機器)。
  • 解決方案 2,又稱“使所有事情自動化”:不要進行手動故障轉移,而是通過兩台機器之間的心跳(檢查執行狀況)實現一個自動執行此操作的系統:為此存在多種解決方案,例如虛擬路由器冗餘協議和(完全公開:我個人的最愛,多年來我一直在使用它來執行此類任務):corosync 和起搏器,這是在 Linux 下設置集群提供高可用性的事實標準。(另外,看看這個。)如果你想嘗試後一種方式,Kumina 的優秀人員開發(並發布)了一個資源代理幾年前,正是因為在 Hetzner 處理了這種情況。資源代理負責通過與 API 對話來更新路由資訊。
  • 結束(暫時):我不完全確定你在追求什麼。我試圖描述您現在面臨的問題的根本原因。此外,我試圖提出一些可能的解決方案的想法。如果我沒有得到您想要做的事情,有些事情尚不清楚或您還有其他問題:請提供回饋,我很樂意提供幫助(或至少嘗試提供幫助)。
  • (此外:您能否將您的配置等移動到您的文章中,以將所有東西保存在一個地方,所以這個問題將來可能對其他人有所幫助?)

引用自:https://serverfault.com/questions/783194