Passer au contenu

Comment attribuer un serveur DNS statique à une instance EC2 qui persiste lors du redémarrage ?

Lecture de 8 minute(s)
0

Je souhaite configurer une instance Amazon Elastic Compute Cloud (Amazon EC2) avec un serveur DNS statique qui persiste lors du redémarrage.

Résolution

Par défaut, les instances EC2 que vous associez à un Amazon Virtual Private Cloud (Amazon VPC) demandent une adresse de serveur DNS au démarrage. Le protocole DHCP (Dynamic Host Configuration Protocol) envoie la requête, puis Amazon écrit la réponse DHCP avec les adresses du serveur DNS dans le fichier /etc/resolv.conf local.

Lorsque vous redémarrez l'instance, vous perdez les modifications manuelles apportées au fichier resolv.conf qui contient des adresses de serveur DNS personnalisées. Pour conserver votre serveur DNS statique lorsque vous redémarrez votre instance, mettez à jour votre configuration en fonction de votre distribution Linux.

Important : Avant de modifier votre instance, utilisez une Amazon Machine Image (AMI) pour créer une sauvegarde. Vous pouvez également utiliser un instantané Amazon Elastic Block Store (Amazon EBS) pour créer une sauvegarde. Lorsque vous modifiez les configurations réseau d'une instance, celle-ci peut devenir inaccessible.

AL2023

Amazon Linux 2023 (AL2023) utilise systemd-resolved. Pour plus d'informations, consultez systemd-resolved sur le site web d'Archlinux.

Configuration du résolveur

Modifiez le fichier /etc/systemd/resolved.conf, puis modifiez les options DNS et Domaine.

Exemple de fichier de configuration :

# /etc/systemd/resolved.conf
[Resolve]
DNS=8.8.8.8
Domains=~.

Vous pouvez également créer une adresse de dépôt. Par exemple, utilisez le fichier /etc/systemd/resolved.conf.d/dns_servers.conf.

Exemple de fichier de configuration :

#/etc/systemd/resolved.conf.d/dns_servers.conf
[Resolve]
DNS=8.8.8.8 8.8.4.4
Domains=~.

Remarque : Définissez l’option Domains=~. de manière que systemd-resolved n’utilise pas les serveurs DNS par lien définis dans la configuration par lien. L’option Domains=~. n’affecte pas les requêtes de noms de domaine qui correspondent aux domaines de recherche les plus spécifiques que vous spécifiez dans les configurations par lien. Lorsque les noms de domaine sont résolus, ils utilisent leurs serveurs DNS par lien.

Modification de l’emplacement vers lequel /etc/resolv.conf pointe

Par défaut, /etc/resolv.conf pointe vers le résolveur stub de l’hôte local. Pour changer le résolveur, recréez le fichier avec les champs mis à jour ou pointez à un autre emplacement que le résolveur stub de l’hôte local. Par exemple, pointez vers le fichier /run/systemd/resolve/resolv.conf qui contient une liste plate des serveurs utilisés par systemd-resolved.

Exemple de statut du fichier de configuration lorsque vous utilisez le cache DNS local :

### Default Symbolic link status : point to stub-resolv.conf
### Flow: DNS query => Local Cache DNS 127.0.0.53 ( systemd-resolved ) => External DNS

# ls -al /etc/resolv.conf
lrwxrwxrwx 1 root root 39 Mar  5 02:28 /etc/resolv.conf -> ../run/systemd/resolve/stub-resolv.conf

# cat /etc/resolv.conf
nameserver 127.0.0.53      
options edns0 trust-ad
search .

### 127.0.0.53 is used for systemd-resolved ( local cache dns )
# lsof -nP -p `pidof systemd-resolved` |grep TCP
systemd-r 339 systemd-resolve   14u     IPv4               2753      0t0  TCP 127.0.0.53:53 (LISTEN)

Exemple de statut du fichier de configuration lorsque vous n'utilisez pas le cache DNS local :

### Changed Symbolic link status : point to /run/systemd/resolve/resolv.conf
# cat  /run/systemd/resolve/resolv.conf
nameserver 1.1.1.1
nameserver 1.0.0.1
search .

# ln -sf ../run/systemd/resolve/resolv.conf /etc/resolv.conf

# ls -al /etc/resolv.conf
lrwxrwxrwx 1 root root 34 Apr  1 16:05 /etc/resolv.conf -> ../run/systemd/resolve/resolv.conf

Pour tester votre configuration, exécutez les commandes suivantes :

# resolvectl status
# resolvectl query amazonaws.com

Exemples de sortie :

# resolvectl status

Global
       Protocols: -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
resolv.conf mode: uplink
      DNS Servers 8.8.8.8 8.8.4.4
       DNS Domain ~.

Link 2 (ens5)
Current Scopes: DNS
     Protocols: +DefaultRoute -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
   DNS Servers: 10.2.0.2
    DNS Domain: ap-northeast-2.compute.internal
# resolvectl query amazonaws.com
amazonaws.com: 207.171.166.22                               -- link: ens5
               72.21.206.80                                 -- link: ens5
               72.21.210.29                                 -- link: ens5

-- Information acquired via protocol DNS in 3.0ms.
-- Data is authenticated: no; Data was acquired via local or encrypted transport: no
-- Data from: cache

AL1 ou AL2

Pour configurer vos instances Amazon Linux 1 (AL1) ou Amazon Linux 2 (AL2), mettez à jour le fichier etc/dhcp/dhclient.conf ou le fichier ifcfg-eth0.conf. Si vous configurez les deux fichiers, les serveurs DNS que vous spécifiez dans le fichier ifcfg-eth0.conf sont prioritaires.

Prérequis : Définissez la valeur du paramètre PEERDNS dans le fichier ifcfg-eth0.conf sur oui. Lorsque vous définissez le paramètre PEERDNS sur non, Amazon EC2 ignore les serveurs DNS spécifiés dans les fichiers ifcfg-* ou fournis par DHCP.

Mettre à jour le fichier etc/dhcp/dhclient.conf

Procédez comme suit :

  1. Ouvrez le fichier /etc/dhcp/dhclient.conf existant. Vous pouvez également en créer un.
    Remarque : Vous devez disposer des privilèges d'utilisateur racine pour modifier ce fichier. Utilisez sudo -i pour devenir l’utilisateur racine ou bien sudo pour implémenter toutes les commandes.
  2. Pour remplacer les serveurs de noms de domaine, ajoutez la commande supersede au fichier :
    supersede domain-name-servers 000.000.000.000, 000.000.000.000;
    Remarque : Remplacez 000.000.000.000 par l'adresse IP du ou des serveurs DNS que vous souhaitez que l'instance utilise.
  3. Définissez le paramètre PEERDNS sur oui dans votre fichier de configuration par interface, tel que /etc/sysconfig/network-scripts/ifcfg-*.
  4. Redémarrez l’instance EC2. Le fichier resolv.conf est mis à jour au redémarrage de l’instance pour ne contenir que les serveurs DNS que vous avez spécifiés dans le fichier dhclient.

Mettre à jour le fichier ifcfj-eth0

Procédez comme suit :

  1. Pour remplacer les valeurs des serveurs DNS dans le fichier /etc/dhcp/dhclient.conf, spécifiez les serveurs DNS personnalisés dans les fichiers de configuration par interface.
    L’exemple suivant montre le fichier /etc/sysconfig/network-scripts/ifcfg-eth0 provenant d’une instance Amazon Linux qui inclut deux serveurs DNS personnalisés :

    DEVICE=eth0
    BOOTPROTO=dhcp
    ONBOOT=yes
    TYPE=Ethernet
    USERCTL=yes
    PEERDNS=yes
    IPV6INIT=no
    PERSISTENT_DHCLIENT=yes
    RES_OPTIONS="timeout:2 attempts:5"
    DHCP_ARP_CHECK=no
    MTU="9001"
    DNS1=8.8.8.8
    DNS2=8.8.4.4
  2. Définissez le paramètre PEERDNS sur oui dans votre fichier de configuration par interface, tel que /etc/sysconfig/network-scripts/ifcfg-*.

Remarque : Si votre instance exécute Ubuntu 16.04 ou Red Hat Enterprise Linux (RHEL) 7.5, vous pouvez également utiliser les étapes de résolution précédentes.

Ubuntu 18.04, 20.04 et 22.04

Sur Ubuntu 18.04, le package netplan.io gère la configuration de l'interface réseau et le service systemd-resolved utilise un résolveur de stub pour gérer les requêtes DNS. L'adresse IP du résolveur stub se trouve dans le fichier /etc/resolv.conf qui est un lien symbolique vers le fichier /run/systemd/resolve/stub-resolv.conf. Si le fichier /etc/resolv.conf présente les configurations suivantes, l’instruction supersede dans /etc/dhcp/dhclient.conf risque de ne pas fonctionner comme prévu :

  • Le fichier n’est pas un lien symbolique sur votre instance.
  • Le fichier est un lien symbolique pointant vers un autre fichier, tel que /run/systemd/resolve/resolv.conf.

Exécutez les étapes suivantes pour remplacer les valeurs du serveur DNS :

  1. Créez un fichier nommé /etc/netplan/99-custom-dns.yaml avec les données suivantes :

    ### Create Customer DNS config
    # cat << 'EOF' | sudo tee /etc/netplan/99-custom-dns.yaml
    network:
      version: 2
      ethernets:
        ens5:
          nameservers:
            addresses: [1.1.1.1, 1.0.0.1]
          dhcp4-overrides:
            use-dns: false
            use-domains: false
    EOF
    
    ### Required File Permission
    # chmod 600 /etc/netplan/99-custom-dns.yaml
    
    ### Checking Netplan Configuration status
    # netplan get
    network:
      version: 2
      ethernets:
        ens5:
          match:
            macaddress: "0a:e5:a1:40:a2:f5"
          nameservers:
            addresses:
            - 1.1.1.1
            - 1.0.0.1
          dhcp4: true
          dhcp4-overrides:
            use-dns: false
            use-domains: false
          dhcp6: false
          set-name: "ens5"

    Remarque : Remplacez 1.1.1.1, 1.0.0.1 par l'adresse IP de votre serveur DNS. Netplan stocke généralement les fichiers de configuration dans le répertoire /etc/netplan. L'exemple précédent utilise l'interface ens5. Assurez-vous que le nom de l'interface correspond à votre interface. Pour afficher le nom de votre interface, exécutez la commande suivante :

    # ip a

    Exemple de sortie :

    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host
           valid_lft forever preferred_lft forever
    2: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
        link/ether 0a:e5:a1:40:a2:f5 brd ff:ff:ff:ff:ff:ff
        inet 172.31.35.233/20 metric 100 brd 172.31.47.255 scope global dynamic ens5
           valid_lft 2828sec preferred_lft 2828sec
        inet6 fe80::8e5:a1ff:fe40:a2f5/64 scope link
           valid_lft forever preferred_lft forever
  2. Pour convertir le fichier YAML Netplan en fichiers de configuration, exécutez les commandes netplan suivantes :

    # netplan generate
    # netplan try
    # netplan apply

    Remarque : Le message « WARNING:root:Cannot call Open vSwitch: ovsdb-server.service is not running » peut s'afficher. Vous pouvez ignorer ce message et passer à l'étape suivante. Si vous ne souhaitez pas voir le message AVERTISSEMENT, installez le package Open vSwitch avec DPDK. L’adresse IP du résolveur stub se trouve maintenant dans /etc/resolv.conf. Il s’agit d’un comportement normal car l'adresse IP du résolveur stub est locale à votre système d'exploitation (OS). En arrière-plan, le résolveur stub utilise les serveurs DNS que vous avez spécifiés dans le fichier 99-custom-dns.yaml.

  3. Redémarrez l'instance.

  4. Pour vérifier que le système utilise correctement les adresses IP de serveur DNS prévues, exécutez la commande suivante en fonction de votre version d'Ubuntu :
    Ubuntu 18.04 :

    systemd-resolve --status

    Ubuntu 20.04 et 22.04 :

    resolvectl status

RHEL 7.5

Par défaut, le service NetworkManager gère le fichier resolv.conf pour les distributions RHEL. Le service remplit ensuite le fichier avec des serveurs DNS fournis par DHCP. Pour utiliser des serveurs DNS personnalisés, bloquez NetworkManager dans le fichier resolv.conf afin que celui-ci ignore les serveurs DNS fournis par DHCP.

Suivez les étapes décrites à la section Mettre à jour le fichier etc/dhcp/dhclient.conf sous AL1 ou AL2. Ou bien, créez le fichier /etc/NetworkManager/conf.d/90-dns-none.conf avec le contenu suivant :

[main]
dns=none

Redémarrez l’instance, puis créez le fichier /etc/resolv.conf manuellement.

Informations connexes

Ensembles d'options DHCP dans Amazon VPC

fichiers réseau sur le site Web d’Archlinux

resolved.conf(5) sur le site Web d’Archlinux

dhclient.conf(5) sur le site Web d’Archlinux

networkmanager.conf(5) sur le site Web d’Archlinux

AWS OFFICIELA mis à jour il y a un an