Ir para o conteúdo

Como evito falhas de resolução de DNS na minha instância Linux do Amazon EC2?

7 minuto de leitura
0

Quero evitar falhas na resolução de DNS nas minhas instâncias de Linux do Amazon Elastic Compute Cloud (Amazon EC2).

Breve descrição

Para evitar falhas na resolução do DNS, aplique um cache DNS.

Se você usar um cache DNS para consultar recursos DNS externos, o cache responderá localmente à maioria das consultas de DNS recorrentes. Quando o cache faz isso, ele não interage com o resolvedor de DNS pela rede. É possível consultar recursos de DNS externos, como os exemplos a seguir:

  • Amazon Relational Database Service (Amazon RDS)
  • Amazon ElastiCache
  • Amazon Simple Storage Service (Amazon S3)

É possível usar as seguintes etapas de resolução para todas as versões do Amazon Linux. Se você usa outra distribuição, consulte a documentação da sua distribuição:

Resolução

Observação: As etapas de resolução a seguir usam 169.254.169.253 como o endereço IP do resolvedor de DNS. Se você usar um resolvedor de DNS diferente, substitua 169.254.169.253 pelo endereço IP do resolvedor de DNS.

Configure um cache DNS local com dnsmasq

Para configurar um cache DNS local, use dnsmasq. Para obter mais informações, consulte dnsmasq no site thekelleys.org.uk.

Conclua as etapas a seguir:

  1. Para instalar o servidor dnsmasq, execute o seguinte comando:

    sudo yum install -y dnsmasq
  2. Se sua instância for executada no Amazon Linux 2023 (AL2023), vá para a etapa 3. Para criar um usuário de sistema dedicado para executar o dnsmasq, execute os comandos a seguir:

    sudo groupadd -r dnsmasq
    sudo useradd -r -g dnsmasq dnsmasq

    Observação: o dnsmasq normalmente é executado como usuário-raiz. No entanto, o usuário muda após a inicialização e elimina as permissões de raiz. Por padrão, o usuário é ninguém.

  3. Para criar um backup do arquivo dnsmasq.conf, execute o comando a seguir:

    sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.ori
  4. Para criar e abrir o arquivo de configuração /etc/dnsmasq.conf com o editor de texto vim, execute o seguinte comando:

    sudo vim /etc/dnsmasq.conf

    Observação: É possível usar qualquer editor de texto, como vi ou nano, para modificar o arquivo /etc/dnsmasq.conf.

  5. No arquivo /etc/dnsmasq.conf, insira o seguinte conteúdo:

    # Server Configuration
    listen-address=127.0.0.1
    port=53
    bind-interfaces
    user=dnsmasq
    group=dnsmasq
    pid-file=/var/run/dnsmasq.pid
    
    # Name resolution options
    resolv-file=/etc/resolv.dnsmasq
    cache-size=500
    neg-ttl=60
    domain-needed
    bogus-priv

    Observação: A opção bogus-priv no dnsmasq faz com que uma pesquisa reversa de DNS falhe para intervalos de endereço IP privados que não estejam em /etc/hosts. Essa opção também pode fazer com que uma pesquisa reversa de DNS falhe para o arquivo de leasing do Protocolo de Configuração Dinâmica de Host (DHCP). Para realizar uma pesquisa reversa bem-sucedida, comente ou remova bogus-priv.

  6. Crie o arquivo /etc/resolv.dnsmasq e defina o servidor de DNS da Amazon ou os servidores de nomes de domínio personalizados que você especificou nos conjuntos de opções DHCP. Execute o seguinte comando:

    sudo bash -c "echo 'nameserver 169.254.169.253' > /etc/resolv.dnsmasq"

    Observação: Para mais informações sobre localizações de servidores DNS, consulte O que é DHCP? Também é possível ajustar a localização do servidor 169.254.169.253 ao criar uma imagem de máquina da Amazon (AMI) de uma instância com o cache dnsmasq para iniciar em outra nuvem privada virtual (VPC) com um CIDR diferente.

  7. Para reiniciar o servidor dnsmasq e configurar o serviço para inicializar no boot, execute um dos seguintes comandos com base na sua distribuição.
    Amazon Linux 1 (AL1):

    sudo service dnsmasq restart
    sudo chkconfig dnsmasq on

    Amazon Linux 2 (AL2) e AL2023:

    sudo systemctl restart dnsmasq.service
    sudo systemctl enable dnsmasq.service
  8. Para verificar se o dnsmasq funciona corretamente, use o seguinte comando:

    dig aws.amazon.com @127.0.0.1

    Se a resposta for semelhante ao exemplo a seguir, o cache do dnsmasq funciona conforme o esperado:

    ; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.amzn2.13.11 <<>> aws.amazon.com @127.0.0.1
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 33958
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 6, AUTHORITY: 0, ADDITIONAL: 1
    
    ;; OPT PSEUDOSECTION:
    ; EDNS: version: 0, flags:; udp: 1232
    ;; QUESTION SECTION:
    ;aws.amazon.com.                        IN      A
    
    ;; ANSWER SECTION:
    aws.amazon.com.         300     IN      CNAME   tp.8e49140c2-frontier.amazon.com.
    tp.8e49140c2-frontier.amazon.com. 9 IN  CNAME   dr49lng3n1n2s.cloudfront.net.
    dr49lng3n1n2s.cloudfront.net. 59 IN     A       108.158.61.67
    dr49lng3n1n2s.cloudfront.net. 59 IN     A       108.158.61.79
    dr49lng3n1n2s.cloudfront.net. 59 IN     A       108.158.61.96
    dr49lng3n1n2s.cloudfront.net. 59 IN     A       108.158.61.102
    
    ;; Query time: 2 msec
    ;; SERVER: 127.0.0.1#53(127.0.0.1)
    ...
  9. Defina o cache DNS dnsmasq como o resolvedor de DNS padrão.
    Observação: Você deve suprimir o resolvedor de DNS padrão fornecido pelo DHCP. Para fazer isso, altere ou crie o arquivo /etc/dhcp/dhclient.conf.
    Para AL2, execute o seguinte comando:

    sudo bash -c "echo 'supersede domain-name-servers 127.0.0.1, 169.254.169.253;' >> /etc/dhcp/dhclient.conf"

    Para AL2023, execute o seguinte comando:

    sudo bash -c 'echo "DNS=127.0.0.1" >> /etc/systemd/resolved.conf'
    sudo bash -c 'echo "DNS=169.254.169.253" >> /etc/systemd/resolved.conf'

    Observação: O AL2023 usa systemd-networkd como o resolvedor de DNS padrão.

  10. Para aplicar a alteração, execute o seguinte comando com base na sua distribuição Linux:
    AL2:

sudo dhclient

AL2023:

sudo systemctl restart systemd-resolved.service

-ou-
Para reiniciar o serviço de rede, execute o seguinte comando:

sudo systemctl restart network

-ou-
Para reinicializar sua instância, execute o seguinte comando:

sudo reboot
  1. Para verificar se sua instância usa o cache DNS, execute o seguinte comando:
dig aws.amazon.com

Se a saída mostrar que o servidor de resposta é 127.0.0.1, o cache DNS funciona conforme o esperado.
Exemplo de saída:

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.amzn2.13.11 <<>> aws.amazon.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 29129
;; flags: qr rd ra; QUERY: 1, ANSWER: 6, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;aws.amazon.com.                        IN      A

;; ANSWER SECTION:
aws.amazon.com.         297     IN      CNAME   tp.8e49140c2-frontier.amazon.com.
tp.8e49140c2-frontier.amazon.com. 25 IN CNAME   dr49lng3n1n2s.cloudfront.net.
dr49lng3n1n2s.cloudfront.net. 41 IN     A       108.158.61.102
dr49lng3n1n2s.cloudfront.net. 41 IN     A       108.158.61.96
dr49lng3n1n2s.cloudfront.net. 41 IN     A       108.158.61.79
dr49lng3n1n2s.cloudfront.net. 41 IN     A       108.158.61.67

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)   <-------------
...

Automatize o dnsmasq para novas instâncias

Para automatizar a instalação e a configuração do dnsmasq como um resolvedor de DNS no Amazon Linux, use uma destas opções:

  • Use o script bash AutomateDnsmasq.sh. Para baixar o arquivo, consulte AutomateDnsmasq.sh no site do GitHub.
  • Use as diretivas AutomateDnsmasq.cloudinit. Para baixar o arquivo, consulte AutomateDnsmasq.cloudinit no site do GitHub.

Para automatizar a instalação do dnsmasq em outras distribuições Linux, use um dos arquivos anteriores para fazer a personalização necessária. Para qualquer um dos arquivos, se você usar o endereço alternativo do servidor de DNS da Amazon 169.254.169.253, os arquivos poderão ser executados em instâncias de VPC.

Para executar qualquer um dos arquivos na inicialização, insira o conteúdo do arquivo em Dados do usuário. É possível usar os comandos de execução do AWS Systems Manager para executar o script bash. É uma prática recomendada usar as diretivas somente para a inicialização no primeiro boot.

Para executar o script Bash como um script autônomo, conclua as seguintes etapas:

  1. Para baixar o script em sua instância e torná-lo executável, execute o seguinte comando:

    wget https://raw.githubusercontent.com/awslabs/aws-support-tools/master/EC2/AutomateDnsmasq/AutomateDnsmasq.sh
    chmod +x AutomateDnsmasq.sh
  2. Para executar o script, execute o seguinte comando como usuário-raiz:

    sudo ./AutomateDnsmasq.sh

Informações relacionadas

Endereçamento IP de instâncias do Amazon EC2

AWS OFICIALAtualizada há 5 meses