Direkt zum Inhalt

Wie bringe ich meine sekundäre Netzwerkschnittstelle in meiner Ubuntu Amazon EC2-Instance zum Laufen?

Lesedauer: 9 Minute
0

Ich möchte, dass meine sekundäre Netzwerkschnittstelle in meiner Ubuntu Amazon Elastic Compute Cloud (Amazon EC2)-Instance funktioniert.

Kurzbeschreibung

Wichtig: Die Verwendung einer sekundären elastischen Netzwerkschnittstelle ist für fortgeschrittene Benutzer vorgesehen. Verwende diese Lösung nur, wenn es dir nicht möglich ist, eine einzelne Netzwerkschnittstelle zu verwenden.

Wenn du eine sekundäre Netzwerkschnittstelle zu einer Instance hinzufügst, die keine Amazon Linux EC2-Instance Linux ist, kannst du eventuell Probleme mit dem Datenverkehr beobachten. Diese Probleme treten auf, weil die sekundäre Netzwerkschnittstelle eingehenden Datenverkehr über die primäre Netzwerkschnittstelle weiterleitet. Da die sekundäre IP-Adresse nicht zur MAC-Adresse der primären Netzwerkschnittstelle gehört, funktioniert die sekundäre Schnittstelle nicht.

Hinweis: Für Ubuntu 24.04 sind die folgenden Schritte nicht erforderlich, da die erweiterte Konfiguration automatisch verarbeitet wird.

Gehe wie folgt vor, damit die sekundäre Schnittstelle funktioniert, nachdem du sie erstellt hast:

  1. Konfiguriere die Routing-Tabelle.
  2. Richte Regeln in der Richtliniendatenbank für benutzerdefinierte Routing-Tabellen ein, sodass der Datenverkehr für die sekundäre Schnittstelle die neue Routing-Tabelle verwendet.

Hinweis: Amazon EC2-Instances befinden sich in der AWS Cloud, und nicht alle Instances profitieren von der Verwendung mehrerer Schnittstellen.

Möglicherweise benötigst du keine zweite Netzwerkschnittstelle, um den Netzwerkdurchsatz zu erhöhen. AWS legt Kontingente auf der Grundlage des Typs und der Größe der Instance fest, und diese Konfiguration begrenzt den Netzwerkdurchsatz. Weitere Informationen findest du unter Amazon-EC2-Instance-Typen.

Möglicherweise benötigst du auch keine zweite Netzwerkschnittstelle, um Elastic-IP-Adressen zu erhöhen. Du musst der Instance keine elastische IP-Adressen hinzufügen, da die meisten Anwendungen gut mit dem DNS funktionieren. Apache kann beispielsweise namensbasierte virtuelle Hosts verwenden. Weitere Informationen findest du sie auf der Apache-Website unter Unterstützung namensbasierter virtueller Hosts.

Die Schritte zum Hinzufügen einer sekundären Netzwerkschnittstelle sind für die folgenden Betriebssysteme unterschiedlich:

  • Ubuntu 14.04
  • Ubuntu 16.04
  • Ubuntu 18.04, 20.04 und 22.04
  • Debian 12 (verschiedene Subnetze)

Lösung

Hinweis: Die Schritte in der folgenden Lösung wurden auf den aufgeführten Linux-Versionen getestet. Ändere die benutzerdefinierten Einstellungen deiner Konfiguration, um die folgenden Schritte mit Root-Benutzerberechtigungen auszuführen. Verwende entweder den Root-Benutzer mit sudo -i oder führe alle Befehle mit sudo aus.

Konfigurieren von Ubuntu 14.04 oder 16.04

Du kannst eine einzelne Datei verwenden, um die Konfigurationsdatei für die sekundäre Schnittstelle zu erstellen, die Routingtabelle zu konfigurieren und dann Routing-Richtlinienregeln für Ubuntu festzulegen.

Führe die folgenden Schritte aus:

  1. Führe den folgenden Befehl aus, um den Namen der primären Netzwerkschnittstelle abzurufen:

    ip a | grep ^[[:digit:]]

    Beispielausgabe:

    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc pfifo_fast state UP group default qlen 1000
    3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000

    Wichtig: Im vorangehenden Beispiel heißen die primären Schnittstellen eth0, eth1 usw. Bei Instances, die eine bessere Vernetzung unterstützen, wie z. B. bei den Familientypen m4 und m5, kann es jedoch zu einer Inkonsistenz bei der Benennung kommen. Beispielsweise könnte die primäre Schnittstelle ** ens3** heißen, während die sekundäre Schnittstelle eth0 heißt. Diese Namensinkonsistenz tritt auf, wenn du die sekundäre Schnittstelle hinzufügst, während die Instance ausgeführt wird. Um eine Inkonsistenz bei der Benennung zu vermeiden, füge die Schnittstelle beim Start hinzu oder starte die Instance neu. Wenn die Schnittstelle bereits läuft, verwende den folgenden Befehl, um den Namen zu ändern:

    ip link set eth0 name ens4
    ip link set ens4 up
    ip link show ens4
  2. Erstelle eine Konfigurationsdatei für die sekundäre Schnittstelle:

    vi /etc/network/interfaces.d/51-eth1.cfg

    Hinweis: Ersetze eth1 durch den Namen deiner sekundären Schnittstelle.

    Der folgende Befehl ist ein Beispiel für eine einzelne IP-Adresse von 172.31.21.115 und mit einem Gateway von 172.31.16.1 auf der sekundären Schnittstelle:

    auto eth1
    iface eth1 inet static
    address 172.31.21.115
    netmask 255.255.240.0
    
    
    # Gateway configuration
    up ip route add default via 172.31.16.1 dev eth1 table 1000
    
    
    # Routes and rules
    up ip route add 172.31.21.115 dev eth1 table 1000
    up ip rule add from 172.31.21.115 lookup 1000

    Hinweis: Ersetze 172.31.21.115 durch deine IP-Adresse und 172.31.16.1 durch dein Gateway. Dein Gateway muss die erste gültige IP-Adresse in deinem Subnetz sein.
    Der folgende Befehl ist ein Beispiel für mehrere IP-Adressen:

    auto eth1
    iface eth1 inet static
    address 172.31.21.115
    netmask 255.255.240.0
    
    
    iface eth1 inet static
    address 172.31.18.46
    netmask 255.255.240.0
    
    
    # Default gateway for eth1
    up ip route add default via 172.31.16.1 dev eth1 table 1000
    
    
    # A route for every IP
    up ip route add 172.31.21.115 dev eth1 table 1000
    up ip route add 172.31.18.46 dev eth1 table 1000
    
    
    # A policy rule for every IP
    up ip rule add from 172.31.21.115 lookup 1000
    up ip rule add from 172.31.18.46 lookup 1000

    Hinweis: Ersetze 172.31.21.115 und 172.31.18.46 durch deine IP-Adresse und 172.31.16.1 durch dein Gateway.

  3. Erstelle die Datei restrict-default-gw, um zu verhindern, dass das Standard-Gateway in der Haupttabelle überschrieben wird:

    vi /etc/dhcp/dhclient-enter-hooks.d/restrict-default-gw
  4. Füge der Datei restrict-default-gw die folgenden Zeilen hinzu:

    case ${interface} in
      eth0)
        ;;
      *)
        unset new_routers
        ;;
    esac

    Hinweis: Ersetze eth0 durch den Namen deiner primären Schnittstelle.

  5. Starte das Netzwerk neu.
    Führe für Ubuntu 14.04 den folgenden Befehl aus:

    (ifdown eth1 && ifup eth1)

    Führe für Ubuntu 16.04 den folgenden Befehl aus:

    systemctl restart networking

Konfigurieren von Ubuntu 18.04, 20.04 und 22.04

Ubuntu 18.04, 20.04 und 22.04 verwenden die Netplan-Netzwerkkonfiguration. Netplan verwendet das YAML-Format. Eine korrekte Einrückung ist im YAML-Format von entscheidender Bedeutung. Das folgende Netplan-Beispiel verwendet Einrückungen mit zwei Leerzeichen.

Führe die folgenden Schritte aus:

  1. Erstelle eine Konfigurationsdatei für die sekundäre Schnittstelle:

    vi /etc/netplan/51-eth1.yaml
  2. Füge der Datei 51-eth1.yaml die folgenden Zeilen hinzu:

    network:
      version: 2
      renderer: networkd
      ethernets:
        eth1:
          addresses:
            - 172.31.24.153/20
            - 172.31.28.195/20
          dhcp4: no
          routes:
            - to: 0.0.0.0/0
              via: 172.31.16.1
              table: 1000
            - to: 172.31.24.153
              via: 0.0.0.0
              scope: link
              table: 1000
            - to: 172.31.28.195
              via: 0.0.0.0
              scope: link
              table: 1000
          routing-policy:
            - from: 172.31.24.153
              table: 1000
            - from: 172.31.28.195
              table: 1000

    Hinweis: Ersetze die Informationen im vorherigen Beispiel durch Informationen, die für deinen Anwendungsfall spezifisch sind. Die YAML-Datei im vorherigen Beispiel konfiguriert zwei IP-Adressen auf eth1, der sekundären Schnittstelle.

Gehe wie folgt vor, um den CIDR-Bereich zu finden, der in der YAML-Datei verwendet werden soll:

  1. Öffne die Amazon-EC2-Konsole.
  2. Wähle Instances und dann die Instance aus.
  3. Scrolle auf der Registerkarte Netzwerk zu Netzwerkschnittstellen und notiere die Subnetz-ID deiner sekundären Netzwerkschnittstelle.
  4. Öffne die Amazon VPC-Konsole.
  5. Wähle Subnetze aus und notiere dann den IPv4-CIDR-Bereich, der für die Subnetz-ID aufgeführt ist.
  6. Führe den folgenden Befehl aus, um die Netzwerkkonfiguration anzuwenden:
    netplan --debug apply

Debian 12 mit einer sekundären ENI in einem anderen Subnetz konfigurieren

Debian 12 verwendet standardmäßig systemd-networkd für die Netzwerkkonfiguration. Wenn du eine sekundäre ENI in einem anderen Subnetz platzierst, musst du eine Policy-Routing-Tabelle mit quellenbasierten Routing-Regeln erstellen. Ohne diese Regeln verwendet der Datenverkehr von der sekundären Schnittstelle die Standardroute der primären Schnittstelle und schlägt fehl.

Wichtig: In diesem Abschnitt wird eine andere Subnetzkonfiguration behandelt. Die obigen Ubuntu-Abschnitte behandeln nur Konfigurationen mit demselben Subnetz.

Führe die folgenden Schritte aus:

  1. Bestätige, dass systemd-networkd der aktive Netzwerkdienst ist:

    for SVC in networking systemd-networkd NetworkManager; do echo "${SVC}: $(systemctl is-active "${SVC}")"; done

    Erwartete Ausgabe:

    networking: inactive
    systemd-networkd: active
    NetworkManager: inactive

    Falls systemd-networkd nicht aktiv ist, aktiviere es, bevor du fortfährst.

  2. Teste die Konfiguration manuell, bevor du sie persistent machst:

    IF=ens6
    IP=10.0.2.100
    CIDR=10.0.2.64/26
    GW=10.0.2.65
    TABLE=101
    
    
    sudo ip link set $IF up mtu 9001
    sudo ip addr add $IP/26 dev $IF
    
    
    sudo ip route add $CIDR dev $IF proto static src $IP table $TABLE
    sudo ip route add default via $GW dev $IF table $TABLE
    
    
    sudo ip rule add from $IP/32 lookup $TABLE priority $TABLE

    Hinweis: Ersetze ens6 durch den Namen deiner sekundären Schnittstelle, 10.0.2.100 durch deine sekundäre ENI-IP, 10.0.2.64/26 durch das CIDR des sekundären Subnetzes und 10.0.2.65 durch das Gateway des sekundären Subnetzes.

  3. Stelle sicher, dass die sekundäre Schnittstelle über ihr eigenes Gateway geleitet wird:

    ip route get 8.8.8.8 from 10.0.2.100

    Erwartete Ausgabe:

    8.8.8.8 from 10.0.2.100 via 10.0.2.65 dev ens6 table 101 uid 0
        cache
  4. Wenn der Test erfolgreich ist, hebe die temporäre Konfiguration auf:

    sudo ip rule del from $IP/32 lookup $TABLE priority $TABLE
    sudo ip route flush table $TABLE
    sudo ip addr flush dev $IF
  5. Erstelle eine persistente systemd-networkd-Konfigurationsdatei:

    sudo touch /etc/systemd/network/60-ens6.network

    Hinweis: Ersetze ens6 durch den Namen deiner sekundären Schnittstelle.

  6. Füge der Datei 60-ens6.network den folgenden Inhalt hinzu:

    [Match]
    Name=ens6
    
    
    [Link]
    MTUBytes=9001
    
    
    [Network]
    Address=10.0.2.100/26
    IPv6AcceptRA=no
    
    
    [Route]
    Destination=0.0.0.0/0
    Gateway=10.0.2.65
    Table=101
    
    
    [Route]
    Destination=10.0.2.64/26
    Scope=link
    PreferredSource=10.0.2.100
    Table=101
    
    
    [RoutingPolicyRule]
    From=10.0.2.100/32
    Table=101
    Priority=101

    Hinweis: Ersetze ens6 durch den Namen deiner sekundären Schnittstelle, 10.0.2.100/26 durch deine sekundäre ENI-IP und dein CIDR, 10.0.2.65 durch das Gateway des sekundären Subnetzes und 10.0.2.64/26 durch das CIDR deines sekundären Subnetzes.

  7. Lade die Netzwerkkonfiguration neu:

    sudo networkctl reload && sudo networkctl reconfigure ens6

    Hinweis: Ersetze ens6 durch den Namen deiner sekundären Schnittstelle.

  8. Stelle den Reverse-Path-Filter auf den Loose-Modus ein, um eingehenden Datenverkehr auf der sekundären Schnittstelle zuzulassen. Prüfe die aktuellen Werte:

    sysctl net.ipv4.conf.all.rp_filter net.ipv4.conf.ens6.rp_filter

    Wenn einer der Werte 1 ist, dann erstelle oder aktualisiere /etc/sysctl.d/99-multihome.conf mit den folgenden Zeilen:

    net.ipv4.conf.all.rp_filter = 2
    net.ipv4.conf.default.rp_filter = 2

    Wende die Änderungen an:

    sudo sysctl --system

    Hinweis: Die Einstellung rp_filter=2 aktiviert den Loose-Modus. Dadurch können Pakete, die über die sekundäre Schnittstelle eintreffen, auch dann weitergeleitet werden, wenn der Rückweg über eine andere Schnittstelle erfolgt.

  9. Stelle sicher, dass jede Schnittstelle über ihr eigenes Gateway weitergeleitet wird.

    Für das primäre ENI:

    ip route get 8.8.8.8 from 10.0.2.12

    Erwartete Ausgabe:

    8.8.8.8 from 10.0.2.12 via 10.0.2.1 dev ens5 uid 0
        cache

    Für das sekundäre ENI:

    ip route get 8.8.8.8 from 10.0.2.100

    Erwartete Ausgabe:

    8.8.8.8 from 10.0.2.100 via 10.0.2.65 dev ens6 table 101 uid 0
        cache
  10. Starte die Instance neu und wiederhole die Verifizierungsbefehle aus Schritt 9, um zu bestätigen, dass die Konfiguration bestehen bleibt.

Verwandte Informationen

Routing-Tabellen konfigurieren

Elastische Netzwerkschnittstellen

AWS OFFICIALAktualisiert vor 14 Tagen