如何设置动态 cname 记录?

如何设置动态 cname 记录?

我正在进行的项目要求我们使用自己的子域名屏蔽 AWS EC2 主机名。


例如:

ec2-176-34-163-40.eu-west-1.compute.amazonaws.com 将映射到 gf53ef.domain.com

ec2-123-31-124-60.eu-west-1.compute.amazonaws.com 将映射到 sdfrh5.domain.com


总会有一个可用的列表来存储域之间的关系。

此列表一直在变化。这意味着在一分钟内我们可能会启动 100 多个新的 ec2 实例,而下一分钟所有实例都可能终止。

我想知道如何设置我们的 Ubuntu 服务器来处理这种情况。

谢谢

答案1

我在 openstack 云上做了类似的事情,例如 DNS 名称更新(可能不像您的要求那样动态;-),基本上我们有一个named接受动态更新的绑定实例。

我使用 webmin 使用 RNDC 配置远程控制,以及基本的绑定配置。

在此处输入图片描述

然后生成一个用于远程访问的密钥,并将其分发给你的控制节点;

dnssec-keygen -a hmac-md5 -b 128 -n HOST remote-key  

区域文件最终如下所示;

zone "mydomain.com" {
  type master;
  file "master/mydomain.com";
  allow-update { key "remote-key"; };
};

allow-update提供许可更新主区域,allow-notify从区域是等效的。

然后您可以执行类似的操作(nsupdate从 bind-utils)来更新来自客户端的记录,我还没有测试过 CNAME 更新,但它应该看起来像这样;

cat <<EOF | nsupdate -d -k "$KEY"
server ns1.mynameserver.com
zone domain.com
update delete gf53ef.domain.com.
update add gf53ef.domain.com.   IN  CNAME   ec2-176-34-163-40.eu-west-1.compute.amazonaws.com.
send
EOF

(您可能需要仔细检查 CNAME 示例的格式……)

这似乎是的配置参考文档named
http://www.zytrax.com/books/dns/ch7/xfer.html

可以从这些教程中获得示例;

http://www.centos.org/docs/5/html/Deployment_Guide-en-US/s1-bind-rndc.html
http://dag.wieers.com/howto/bits/bind-ddns.php
http://linux.yyz.us/nsupdate/
http://www.semicomplete.com/articles/dynamic-dns-with-dhcp/

答案2

感谢@CS3

目前我们的解决方案是 Route53。

以下是我们的设置方法(PHP)。我们使用了这个库:http://www.orderingdisorder.com/aws/route-53/

private function getDomain() {
    $sub = "e-".substr(md5($this->instance->dnsName), 2, 4);
    $domain = $sub.".domain.com";

    $dnsRecords = $this->route53->listResourceRecordSets('/hostedzone/123');

    $exists = false;
    foreach($dnsRecords["ResourceRecordSets"] as $dnsRecord) {
        if($dnsRecord["Name"] == $domain."." 
            AND $dnsRecord["Type"] == "CNAME") {
                $exists = true;
                break;
            }
    }

    if(!$exists) {
        $change = $this->route53->prepareChange('CREATE', $domain.".", 'CNAME', 300, $this->instance->dnsName);
        $this->route53->changeResourceRecordSets('/hostedzone/123', $change);
    }

    return $domain;
}

private function removeDomain() {
    $change = $this->route53->prepareChange('DELETE', $this->domain.".", 'CNAME', 300, $this->instance->dnsName);
    $this->route53->changeResourceRecordSets('/hostedzone/123', $change);
    $this->domain = null;
}

相关内容