Ubuntu
來自 Hetzner 的故障轉移 IP 的 DNS 問題
假設我們有兩台伺服器 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。
- 如果想要更改流量指向的目標(機器),則必須向API
POST
發送請求,該API通過. 然後 API 驗證身份驗證(即使用者名和相應的密碼)和請求,如果有效,則將此新配置傳播到網路中的各種路由器。這種技術類似於法國的大型供應商 OVH 使用的技術。HTTPS
- 警告:儘管人們使用這些 IP 為他們的機器/服務提供某種高可用性(如所寫),但新路由配置的傳播需要一些時間,有時長達 60 秒。這意味著,例如,如果使用某種自動故障轉移,如果流量目前被路由到的機器停機一段時間,人們會注意到這一點,流量就會被丟棄,因為機器停機,直到新路由配置到位的時間點。
- 介紹到此為止,我們來看看你的具體問題:
- 正如評論/聊天中所指出的,使用
auto eth0:0
, 將在介面設置您的故障轉移 IPeth0:0
,一旦網路啟動,通常在啟動時。您有兩台機器,具有相同的配置,因此這會導致相同的 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 和起搏器,這是在 Linux 下設置集群提供高可用性的事實標準。(另外,看看這個。)如果你想嘗試後一種方式,Kumina 的優秀人員開發(並發布)了一個資源代理幾年前,正是因為在 Hetzner 處理了這種情況。資源代理負責通過與 API 對話來更新路由資訊。
- 結束(暫時):我不完全確定你在追求什麼。我試圖描述您現在面臨的問題的根本原因。此外,我試圖提出一些可能的解決方案的想法。如果我沒有得到您想要做的事情,有些事情尚不清楚或您還有其他問題:請提供回饋,我很樂意提供幫助(或至少嘗試提供幫助)。
- (此外:您能否將您的配置等移動到您的文章中,以將所有東西保存在一個地方,所以這個問題將來可能對其他人有所幫助?)