我打算在家里运行一个 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 地址更改时接受并应用更新。我可以想出一种方法来避免它(轮询和 ping) johnns1.noip.com 获取我的 IP 地址,然后 grep 区域文件并每 5 分钟重新加载一次..)但这感觉不太可靠。
有没有人有这方面的经验?我看过 no-ip 的增强服务,但他们要为每个域名(我有好几个)托管记录收取 25 美元。
答案1
我做了以下这些在过去 10 多年里对我来说效果很好的事情。我在服务上设置了动态 DNS 名称,例如动态DNS(今年之前都是免费的)或其他类似的提供商。这给了我一个立足点,使我不断变化的 IP 始终植根于静态名称,例如 sam.dyndns.org。
然后,我在绑定中创建指向此静态名称的 CNAME,瞧,我有了永久名称。
答案2
虽然 BIND 确实支持 DDNS,但设置起来有点繁琐,因为您需要创建身份验证密钥,因为更新似乎是通过 DNS 协议本身处理的,以允许更新来自与运行 BIND 的计算机不同的计算机服务器,所以这当然需要安全的认证机制。
我本来打算自己走这条路,但最终我的域名托管在 Amazon 的 Route53 服务上。他们有一个 API 来更新可用于动态 IP 的记录。我为该条目设置了一个较低的 TTL,并在我的计算机上设置了一个 cronjob,用于查找我当前的 IP 地址并在我的 IP 发生更改时更新 Route53 记录。
在撰写本文时,成本约为每月 0.90 美元,因此它不是免费的,但考虑到服务中内置的冗余和故障转移,这对于我的用例来说似乎相当合理。我的其余 DNS 条目也在那里,因为成本是按区域计算的,无论您实际在该区域中放置了多少条目。
当我的 IP 更改时,我使用aws
命令行工具和这样的脚本(每小时从 cron 运行一次)来更新 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 仍然会更新。