Direkt zum Inhalt

Wie weise ich einer EC2-Instance einen statischen DNS-Server zu, der beim Reboot bestehen bleibt?

Lesedauer: 8 Minute
0

Ich möchte eine Amazon Elastic Compute Cloud (Amazon EC2)-Instance mit einem statischen DNS-Server konfigurieren, der beim Reboot bestehen bleibt.

Lösung

Standardmäßig fordern EC2-Instances, die du Amazon Virtual Private Cloud (Amazon VPC) zuordnest, beim Start eine DNS-Serveradresse an. Das Dynamic Host Configuration Protocol (DHCP) sendet die Anforderung, und dann schreibt Amazon die DHCP-Antwort mit den DNS-Serveradressen in die lokale Datei /etc/resolv.conf.

Wenn du die Instance neu startest, gehen die manuellen Änderungen an der Datei resolv.conf verloren, die benutzerdefinierte DNS-Server-Adressen enthält. Um den statischen DNS-Server beim Reboot der Instance beizubehalten, aktualisiere die Konfiguration auf der Grundlage der Linux-Verteilung.

Wichtig: Bevor du deine Instance änderst, verwende ein Amazon Machine Image (AMI), um eine Sicherungskopie zu erstellen. Oder verwende einen Amazon Elastic Block Store (Amazon EBS)-Snapshot, um eine Sicherungskopie zu erstellen. Wenn du die Netzwerkkonfigurationen für eine Instance änderst, ist die Instance möglicherweise nicht mehr erreichbar.

AL2023

Amazon Linux 2023 (AL2023) verwendet systemd-resolved. Weitere Informationen findest du unter systemd-resolved auf der Archlinux-Website.

Resolver konfigurieren

Bearbeite die Datei /etc/systemd/resolved.conf und ändere die Optionen für DNS und Domäne.

Beispiel für eine Konfigurationsdatei:

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

Oder erstelle ein Drop-in. Verwende beispielsweise die Datei /etc/systemd/resolved.conf.d/dns_servers.conf.

Beispiel für eine Konfigurationsdatei:

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

Hinweis: Stelle die Option Domains=~. ein, damit systemd-resolved nicht die in der linkspezifischen Konfiguration festgelegten linkspezifischen DNS-Server verwendet. Die Option Domains=~. wirkt sich nicht auf Abfragen von Domainnamen aus, die bestimmten Suchdomains entsprechen, die du in linkspezifischen Konfigurationen angibst. Wenn Domainnamen aufgelöst werden, verwenden sie ihre linkspezifischen DNS-Server.

Ändere den Ort, auf den /etc/resolv.conf verweist

Standardmäßig verweist /etc/resolv.conf auf den lokalen Host-Stub-Resolver. Um den Resolver zu ändern, erstelle die Datei mit aktualisierten Feldern neu oder verweise auf einen anderen Ort als den lokalen Host-Stub-Resolver. Verweise beispielsweise auf die Datei /run/systemd/resolve/resolv.conf, die eine vereinfachte Liste von Servern enthält, die systemd-resolved verwendet.

Beispiel für den Status der Konfigurationsdatei, wenn du den lokalen DNS-Cache verwendest:

### 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)

Beispiel für den Status der Konfigurationsdatei, wenn du den lokalen DNS-Cache nicht verwendest:

### 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

Führe die folgenden Befehle aus, um die Konfiguration zu testen:

# resolvectl status
# resolvectl query amazonaws.com

Beispielausgaben:

# 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 oder AL2

Um die Amazon Linux 1 (AL1)- oder Amazon Linux 2 (AL2)-Instances zu konfigurieren, aktualisiere die Datei etc/dhcp/dhclient.conf oder die Datei ifcfg-eth0.conf. Wenn du beide Dateien konfigurierst, haben die DNS-Server, die du in der Datei ifcfg-eth0.conf angibst, Vorrang.

Voraussetzungen: Setze den ParameterPEERDNS in der Datei ifcfg-eth0.conf auf ja. Wenn du den Parameter PEERDNS auf nein setzt, ignoriert Amazon EC2 die DNS-Server, die in ifcfg-*-Dateien angegeben sind oder von DHCP bereitgestellt werden.

Aktualisieren der Datei etc/dhcp/dhclient.conf

Führe die folgenden Schritte aus:

  1. Öffne die bestehende Datei /etc/dhcp/dhclient.conf. Oder erstelle eine neue.
    Hinweis: Du musst über Root-Benutzerrechte verfügen, um diese Datei bearbeiten zu können. Verwende entweder sudo -i, um der Root-Benutzer zu werden, oder verwende sudo, um alle Befehle zu implementieren.
  2. Um domain-name-servers zu überschreiben, füge der Datei den folgenden supersede-Befehl hinzu:
    supersede domain-name-servers 000.000.000.000, 000.000.000.000;
    Hinweis: Ersetze 000.000.000.000 durch die IP-Adresse des DNS-Servers bzw. der DNS-Server, die die Instance verwenden soll.
  3. Setze den Parameter PEERDNS in deiner schnittstellenspezifischen-Konfigurationsdatei, z. B. /etc/sysconfig/network-scripts/ifcfg-*, auf ja.
  4. Starte die EC2-Instance neu. Die Datei resolv.conf wird beim Reboot der Instance aktualisiert und enthält nur die DNS-Server, die du in der Datei dhclient angegeben hast.

Aktualisieren der Datei ifcfj-eth0

Führe die folgenden Schritte aus:

  1. Um die DNS-Serverwerte in der Datei /etc/dhcp/dhclient.conf zu überschreiben, gib die benutzerdefinierten DNS-Server in den schnittstellenspezifischen Konfigurationsdateien an.
    Die folgende Beispieldatei zeigt die Datei /etc/sysconfig/network-scripts/ifcfg-eth0 von einer Amazon Linux-Instance, die zwei benutzerdefinierte DNS-Server enthält:

    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. Setze den Parameter PEERDNS in deiner schnittstellenspezifischen-Konfigurationsdatei, z. B. /etc/sysconfig/network-scripts/ifcfg-*, auf ja.

Hinweis: Wenn auf der Instance Ubuntu 16.04 oder Red Hat Enterprise Linux (RHEL) 7.5 ausgeführt wird, kannst du auch die vorherigen Lösungsschritte verwenden.

Ubuntu 18.04, 20.04 und 22.04

Unter Ubuntu 18.04 verwaltet das netplan.io-Paket die Konfiguration der Netzwerkschnittstelle, und der Service systemd-resolved verwendet einen Stub-Resolver, um DNS-Abfragen zu verwalten. Die IP-Adresse des Stub-Resolvers befindet sich in der Datei /etc/resolv.conf, die eine symbolische Verknüpfung zur Datei /run/systemd/resolve/stub-resolv.conf ist. Wenn die Datei /etc/resolv.conf die folgenden Konfigurationen hat, funktioniert die Anweisung supersede in /etc/dhcp/dhclient.conf möglicherweise nicht wie erwartet:

  • Die Datei ist keine symbolische Verknüpfung auf deiner Instance.
  • Die Datei ist eine symbolische Verknüpfung, die auf eine andere Datei, z. B. /run/systemd/resolve/resolv.conf, verweist.

Gehe wie folgt vor, um die DNS-Serverwerte zu überschreiben:

  1. Erstelle eine Datei mit dem Namen /etc/netplan/99-custom-dns.yaml mit den folgenden Daten:

    ### 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"

    Hinweis: Ersetze 1.1.1.1, 1.0.0.1 durch deine DNS-Server-IP-Adresse. Netplan speichert Konfigurationsdateien im Verzeichnis /etc/netplan. Das vorherige Beispiel verwendet die ens5-Schnittstelle. Stelle sicher, dass der Schnittstellenname mit der Schnittstelle übereinstimmt. Um den Schnittstellennamen anzuzeigen, führe den folgenden Befehl aus:

    # ip a

    Beispielausgabe:

    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. Um die Netplan-YAML-Datei in Konfigurationsdateien zu konvertieren, führe die folgenden netplan-Befehle aus:

    # netplan generate
    # netplan try
    # netplan apply

    Hinweis: Möglicherweise erhältst du die Meldung „WARNING:root:Cannot call Open vSwitch: ovsdb-server.service is not running“. Du kannst diese Meldung ignorieren und mit dem nächsten Schritt fortfahren. Wenn du die Meldung WARNING (Warnung) nicht anzeigen möchtest, installiere das Paket „Open vSwitch with DPDK“. Die IP-Adresse des Stub-Resolvers befindet sich jetzt in /etc/resolv.conf. Dies ist ein erwartetes Verhalten, da die Stub-Resolver-IP-Adresse lokal für das Betriebssystem (OS) ist. Im Hintergrund verwendet der Stub-Resolver die DNS-Server, die du in der Datei 99-custom-dns.yaml angegeben hast.

  3. Boote die Instance neu.

  4. Um zu bestätigen, dass das System die vorgesehenen DNS-Server-IP-Adressen korrekt verwendet, führe den folgenden Befehl basierend auf der Ubuntu-Version aus:
    Ubuntu 18.04:

    systemd-resolve --status

    Ubuntu 20.04 und 22.04:

    resolvectl status

RHEL 7.5

Standardmäßig verwaltet der NetworkManager-Service die Datei resolv.conf für RHEL-Verteilungen. Der Service befüllt die Datei dann mit DNS-Servern, die DHCP bereitstellt. Um benutzerdefinierte DNS-Server zu verwenden, blockiere NetworkManager in der Datei resolv.conf, sodass die Datei resolv.conf die von DHCP bereitgestellten DNS-Server ignoriert.

Führe die Schritte zum Aktualisieren der Datei etc/dhcp/dhclient.conf unter AL1 oder AL2 aus. Oder erstelle die Datei /etc/NetworkManager/conf.d/90-dns-none.conf mit dem folgenden Inhalt:

[main]
dns=none

Boote die Instance neu und erstelle dann manuell die Datei /etc/resolv.conf.

Ähnliche Informationen

DHCP-Optionssätze in Amazon VPC

network files (Netzwerkdateien) auf der Archlinux-Website

resolved.conf(5) auf der Archlinux-Webseite

dhclient.conf(5) auf der Archlinux-Webseite

networkmanager.conf(5) auf der Archlinux-Webseite

AWS OFFICIALAktualisiert vor 9 Monaten