RRSet do tipo CNAME com o nome DNS foo.com. não é permitido no apex na zona bar.com

101

Eu possuo foo.come bar.com. Estou gerenciando ambos no Route53. foo.comhospeda meu site e gostaria de direcionar o tráfego de bar.compara foo.com. Tentei configurar um CNAMEregistro para bar.comapontar foo.com, mas recebi a mensagem de erro:

RRSet of type CNAME with DNS name foo.com. is not permitted at apex in zone bar.com.

Por que isso não funciona e o que posso fazer em vez disso?

Fredley
fonte

Respostas:

90

Conforme RFC1912 seção 2.4:

 A CNAME record is not allowed to coexist with any other data.  In
 other words, if suzy.podunk.xx is an alias for sue.podunk.xx, you
 can't also have an MX record for suzy.podunk.edu, or an A record, or
 even a TXT record.  Especially do not try to combine CNAMEs and NS 
 records like this!:

           podunk.xx.      IN      NS      ns1
                           IN      NS      ns2
                           IN      CNAME   mary
           mary            IN      A

O RFC faz todo o sentido, pois o servidor de nomes não saberia se precisa seguir o CNAME ou responder com o registro real com o qual o CNAME se sobrepõe. bar.comé uma zona, portanto, tem implicitamente um registro SOA para o bar.comnome. Você não pode ter um registro SOA e um CNAME com o mesmo nome.

No entanto, como os registros SOA geralmente são usados ​​apenas para manutenção de zona, essas situações em que você deseja fornecer um CNAME no ápice da zona são bastante comuns. Mesmo que o RFC proíba, muitos engenheiros gostariam de um comportamento como: "siga o CNAME, a menos que a consulta solicite explicitamente o registro SOA". É por isso que a Route 53 fornecealias records . Trata-se de um recurso específico do Route 53 que oferece a funcionalidade exata de que você precisa. Dê uma olhada em http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/CreatingAliasRRSets.html

Ioan Alexandru Cucu
fonte
8
Ao criar um registro no Route 53 para que um ápice de domínio seja direcionado a um ELB clássico, você cria um alias para um registro A em vez de para um CNAME. As instruções detalhadas podem ser encontradas aqui: docs.aws.amazon.com/elasticloadbalancing/latest/classic/…
ewalshe
@ewalshe talvez faça disso uma resposta para dar mais visibilidade?
Jonathan
Mas CNAMES não deveriam mascarar outros domínios? ou seja, foo.com para bar.com, mas o navegador do usuário ainda mostraria foo.com? O que eu pesquisaria para essa funcionalidade?
Ben A. Hilleli,
meu certificado SSL expirou e a AWS me enviou um e-mail para criar CNAME para os hosts que tenho, mas já tenho Aregistro, o que fazer agora?
Eugene
@eugene Presumo que você esteja se referindo à verificação de propriedade de domínio baseada em DNS da AWS: docs.aws.amazon.com/acm/latest/userguide/… Se for esse o caso, a Amazon pede que você adicione um CNAME para um SUBDOMÍNIO do domínio que você afirma possuir. O primeiro rótulo no CNAME que eles pedem para você criar é gerado aleatoriamente, portanto, não deve haver um problema de sobreposição com qualquer outro registro.
Ioan Alexandru Cucu
58
  1. Crie um Bucket S3 chamado bar.com . (O nome deve ser igual ao domínio do qual você deseja redirecionar para que isso funcione!)
  2. No bar.comS3 Bucket, vá para Properties> Static Website Hosting, selecione Redirect all requests to another host namee insira foo.comna caixa de texto.
  3. De volta à Route 53, em seu Hosted Zonefor bar.com, clique em Create Record Set. Selecione A - IPv4 addresspara o tipo. CliqueYes para Alias. Clique na caixa de texto para Alias Target. bar.comdeve estar listado em -- S3 Website Endpoints --. Salve o registro. Aguarde alguns minutos e você deverá ter uma configuração de redirecionamento para redirecionar solicitações de bar.com para foo.com.

Você pode usar esse mesmo método para redirecionar um domínio sem www para um subdomínio (como www). Eu uso isso nos casos em que www.foo.com precisa ser um CNAME, então redireciono de foo.com para www.foo.com com o mesmo método. Se foo.com for um registro A, você pode usar essa técnica para redirecionar de www.foo.com para foo.com.

NOTA: este método irá encaminhar com o caminho completo. ou seja, http://bar.com/test será encaminhado para http://foo.com/test .

Rob Eroh
fonte
1
Descobri que o nome do meu intervalo s3 não está carregando quando o AWS Route 53 mostra os disponíveis para link. Eu li em algum lugar que pode importar com qual usuário do console AWS você criou e talvez em qual região ...
bjm88
foo.com/test funciona para mim, mas acessar bar.com/test me dá um erro AccessDenied. Alguém tem sugestões? Não consegui alterar a política de balde na conta shell bar.com.
Sean
10

No Route53, você precisa criar um registro A, NÃO um registro CNAME , e criar um alias sob ele.

Do comentário de @ewalshe sobre a resposta de Alexandru Cucu, se você veio aqui tentando configurar o API Gateway com um nome de domínio personalizado e tem um url de distribuição Cloudfront.

Jonathan
fonte
Eu tenho um Aregistro e a renovação do certificado falhou e aws me enviou um e-mail sugerindo criar CNAME... o que fazer?
Eugene
1

tldr; Você deve passar um FQDN como o nome ResourceRecordSet.

Eu tive o mesmo problema ao usar esta declaração c # recorte:

 private static void RegisterHostWithDns(IAmazonRoute53 ec2,SynoviaImage image)
        {
            var changeBatch = new ChangeBatch();
            var rRs = new ResourceRecordSet(image.Name, RRType.CNAME) {TTL=60,ResourceRecords = new List<ResourceRecord>() { new ResourceRecord(image.PublicDns)} };
            var change = new Change(ChangeAction.UPSERT, rRs);
            changeBatch.Changes.Add(change);
            var request = new ChangeResourceRecordSetsRequest(ConfigurationManager.AppSettings["DnsZoneId"], changeBatch);
            var response = ec2.ChangeResourceRecordSets(request);
            Console.WriteLine("Updated CNAME For {0} setting {1}",image.Name,image.PublicDns);
        }

Neste caso, image.Name == "Listener"

Depois que mudei para:

 private static void RegisterHostWithDns(IAmazonRoute53 ec2,SynoviaImage image)
        {
            var changeBatch = new ChangeBatch();
            var rRs = new ResourceRecordSet(string.Format("{0}.{1}",image.Name, "testing.foo.bar.com"), RRType.CNAME) {TTL=60,ResourceRecords = new List<ResourceRecord>() { new ResourceRecord(image.PublicDns)} };
            var change = new Change(ChangeAction.UPSERT, rRs);
            changeBatch.Changes.Add(change);
            var request = new ChangeResourceRecordSetsRequest(ConfigurationManager.AppSettings["DnsZoneId"], changeBatch);
            var response = ec2.ChangeResourceRecordSets(request);
            Console.WriteLine("Updated CNAME For {0} setting {1}",image.Name,image.PublicDns);
        }

agora o valor que está sendo passado é: "Listener.fully.qualified.com"

Funciona agora.

Wjdavis5
fonte
0

Você deve usar o DNAME em vez de um CNAME. Um registro CNAME só pode redirecionar o rótulo para outro rótulo.

Ao falar sobre redirecionar nomes de domínio em vez de rótulos, você deve usar DNAME

$ORIGIN bar.com
           IN      DNAME   foo.com

Isso também significa que todos os A, NS e quaisquer outros registros devem ser excluídos. Isso deve ser configurado no domínio foo.com.

BlahBlah
fonte
1
DNAMEé definido no RFC 2672 . Você poderia explicar como isso se relaciona com o OP? O Route53 não permite a exclusão de registros SOA ou NS, pelo menos da interface padrão e DNAME não é uma opção disponível.
Josh Habdas