Dns

執行我自己的動態 DNS 記錄託管

  • September 1, 2018

我打算在家裡執行一個 debian 伺服器,它將託管各種網站、SSH 伺服器和電子郵件。

我有一個動態 IP 地址,我不願意為靜態 IP 支付額外費用。

我在想,如果我執行自己的名稱伺服器並使用 no-ip 之類的東西為我的註冊域設置自動更新的名稱伺服器地址,我可能會繞過 DNS 問題,例如:

在註冊商上:

john-hunt.com (and my other domains) nameservers = johnns1.noip.com & johnns2.noip.com

johnns1.noip.com, johnns2.noip.com -> my dynamic IP

這將確保我的域的名稱伺服器始終指向我家中的機器。

我將在家用機器上執行 BIND 或類似的東西來實際提供 DNS 記錄。

我遇到的真正問題是我不太清楚如何配置 BIND(或 tinydns 或其他)以在我的 IP 地址更改時接受並應用更新。我可以想辦法避免它(poll & ping johnns1.noip.com 獲取我的 IP 地址,然後在 zonefiles 上 grep 並每 5 分鐘重新載入一次..) 但這感覺不太可靠。

有沒有人有這方面的經驗?我查看了 no-ip 的增強服務,但他們想要 25 美元用於託管每個域的記錄(我有很多)。

我做了以下工作,這在過去 10 多年裡對我來說效果很好。我在諸如DynDNS(今年之前是免費的)或其他類似提供商之類的服務上設置了一個動態 DNS 名稱。這給了我一個立足點,以便我不斷變化的 IP 將始終植根於一個靜態名稱,例如 sam.dyndns.org。

然後我在綁定中創建指向這個靜態名稱的 CNAME,瞧我有永久名稱。

雖然 BIND 確實支持 DDNS,但設置起來有點繁瑣,因為您需要創建身份驗證密鑰,因為更新似乎是通過 DNS 協議本身處理的,以允許更新來自執行 BIND 的不同機器伺服器,所以這當然需要一個安全的身份驗證機制。

我本來打算自己走這條路,但最終將我的域託管在亞馬遜的 Route53 服務上。他們有一個 API 來更新可用於動態 IP 的記錄。我為那個條目設置了一個較低的 TTL,並在我的機器上安裝了一個 cronjob,用於查找我目前的 IP 地址並在我的 IP 發生變化時更新 Route53 記錄。

撰寫本文時的成本約為 0.90 美元/月,因此它不是免費的,但考慮到服務內置的冗餘和故障轉移,這對於我的案例來說似乎相當合理。我的其餘 DNS 條目也在其中,因為成本是按區域計算的,無論您實際在該區域中放置了多少條目。

我使用aws命令行工具和這樣的腳本(每小時從 cron 執行一次)在我的 IP 更改時更新 Route53 記錄:

#!/bin/sh

function updateDNS
{
       TARGET_ZONEID="$1"
       TARGET_FQDN="$2"
       IP="$3"
       CUR_IP="$4"
       TYPE="$5"

       if [ "$IP" != "$CUR_IP" ]; then
               echo '{ "Comment": "DDNS update", "Changes":[ { "Action":"UPSERT", "ResourceRecordSet":{ "ResourceRecords": [ { "Value":"'"$IP"'" } ], "Name": "'"$TARGET_FQDN"'", "Type": "'"$TYPE"'", "TTL": 60} } ] }' |
                       aws route53 change-resource-record-sets --hosted-zone-id "$TARGET_ZONEID" --change-batch file:///dev/stdin > /dev/null
       fi
}

TARGET_ZONEID="ABC123"
TARGET_FQDN="homeip.example.com."
IP=`dig +short myip.opendns.com @resolver1.opendns.com`
CUR_IP=`dig +short "$TARGET_FQDN"`
TYPE="A"

updateDNS "$TARGET_ZONEID" "$TARGET_FQDN" "$IP" "$CUR_IP" "$TYPE"
# Can add more updateDNS calls to do other hosts, AAAA records, etc.

我從網路上的幾台主機上執行這個腳本,這樣如果其中一台出現故障,IP 仍然會更新。

引用自:https://unix.stackexchange.com/questions/145093