Passer au contenu

Comment faire fonctionner mon interface réseau secondaire sur mon instance Amazon EC2 sous Ubuntu ?

Lecture de 10 minute(s)
0

Je souhaite faire fonctionner mon interface réseau secondaire sur mon instance Amazon Elastic Compute Cloud (Amazon EC2) sous Ubuntu.

Brève description

Important : l’utilisation d’une deuxième interface réseau Elastic est destinée aux utilisateurs avancés. Utilisez cette solution uniquement lorsque vous ne pouvez pas utiliser une seule interface réseau.

Si vous ajoutez une interface réseau secondaire à une instance Amazon EC2 qui n’utilise pas Amazon Linux, vous risquez de rencontrer des problèmes de flux de trafic. Ces problèmes se produisent car l’interface réseau secondaire achemine le trafic entrant via l’interface réseau principale. Comme l’adresse IP secondaire n’appartient pas à l’adresse MAC de l’interface réseau principale, l’interface secondaire ne fonctionne pas.

Remarque : Ubuntu 24.04 ne nécessite pas les étapes suivantes et gère automatiquement cette configuration avancée.

Pour assurer le fonctionnement de l’interface secondaire après sa création, procédez comme suit :

  1. Configurez la table de routage.
  2. Définissez des règles dans la base de données de la stratégie de routage personnalisée afin que le trafic de l’interface secondaire utilise la nouvelle table de routage.

Remarque : les instances Amazon EC2 se trouvent dans le Cloud AWS, et toutes les instances ne tirent pas parti de l’utilisation de plusieurs interfaces.

Il est possible que vous n’ayez pas besoin d’une deuxième interface réseau pour augmenter le débit réseau. AWS définit des quotas en fonction du type et de la taille de l’instance, et cette configuration limite le débit réseau. Pour plus d’informations, consultez Types d’instances Amazon EC2.

Il est également possible que vous n’ayez pas besoin d’une deuxième interface réseau pour augmenter le nombre d’adresses IP Elastic. Vous n’avez pas besoin d’ajouter d’adresses IP Elastic à votre instance, car la plupart des applications fonctionnent correctement avec le DNS. Par exemple, Apache peut utiliser des hôtes virtuels basés sur le nom. Pour plus d’informations, consultez la page Prise en charge des hôtes virtuels basés sur le nom sur le site Web d’Apache.

Les étapes pour ajouter une interface réseau secondaire diffèrent selon les systèmes d’exploitation suivants :

  • Ubuntu 14.04
  • Ubuntu 16.04
  • Ubuntu 18.04, 20.04 et 22.04
  • Debian 12 (sous-réseaux différents)

Résolution

Remarque : les étapes de la résolution suivante ont été testées sur les versions Linux répertoriées. Modifiez les paramètres personnalisés de votre configuration pour exécuter les étapes suivantes avec les autorisations d’utilisateur racine. Utilisez l’utilisateur racine avec sudo -i, ou exécutez toutes les commandes avec sudo.

Configurer Ubuntu 14.04 ou 16.04

Utilisez un seul fichier pour créer le fichier de configuration de l’interface secondaire, configurer la table de routage, puis définir les règles de stratégie de routage pour Ubuntu.

Procédez comme suit :

  1. Pour obtenir le nom de l’interface réseau primaire, exécutez la commande suivante :

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

    Exemple de sortie :

    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

    Important : dans l’exemple précédent, les interfaces principales sont nommées eth0 et eth1. Cependant, pour les instances qui prennent en charge la mise en réseau améliorée, telles que les familles m4 et m5, vous pouvez constater une incohérence de nommage. Par exemple, l’interface principale peut être nommée ens3 tandis que l’interface secondaire est nommée eth0. Cette incohérence de dénomination se produit lorsque vous ajoutez l’interface secondaire pendant que l’instance est en cours d’exécution. Pour éviter une incohérence de dénomination, ajoutez l’interface au moment du lancement ou redémarrez l’instance. Si l’interface est en cours d’exécution, utilisez la commande suivante pour modifier son nom :

    ip link set eth0 name ens4
    ip link set ens4 up
    ip link show ens4
  2. Créez un fichier de configuration pour l’interface secondaire :

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

    Remarque : remplacez eth1 par le nom de votre interface secondaire.

    La commande suivante est un exemple avec une seule adresse IP, 172.31.21.115, et une passerelle, 172.31.16.1, sur l’interface secondaire :

    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

    Remarque : remplacez 172.31.21.115 par votre adresse IP et 172.31.16.1 par votre passerelle. Votre passerelle doit être la première adresse IP valide de votre sous-réseau.
    La commande suivante est un exemple avec plusieurs adresses IP :

    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

    Remarque : remplacez 172.31.21.115 et 172.31.18.46 par vos adresses IP et 172.31.16.1 par votre passerelle.

  3. Créez le fichier restrict-default-gw pour empêcher le remplacement de la passerelle par défaut dans la table principale :

    vi /etc/dhcp/dhclient-enter-hooks.d/restrict-default-gw
  4. Ajoutez les lignes suivantes au fichier restrict-default-gw :

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

    Remarque : remplacez eth0 par le nom de votre interface principale.

  5. Redémarrez le réseau.
    Pour Ubuntu 14.04, exécutez la commande suivante :

    (ifdown eth1 && ifup eth1)

    Pour Ubuntu 16.04, exécutez la commande suivante :

    systemctl restart networking

Configurer Ubuntu 18.04, 20.04 et 22.04

Ubuntu 18.04, 20.04 et 22.04 utilisent la configuration réseau Netplan. Netplan utilise le format YAML. Une indentation correcte est essentielle dans le format YAML. L’exemple Netplan suivant utilise une indentation de deux espaces.

Procédez comme suit :

  1. Créez un fichier de configuration pour l’interface secondaire :

    vi /etc/netplan/51-eth1.yaml
  2. Ajoutez les lignes suivantes au fichier 51-eth1.yaml :

    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

    Remarque : remplacez les informations de l’exemple précédent par des informations propres à votre cas d’utilisation. L’exemple de fichier YAML précédent configure deux adresses IP sur eth1, l’interface secondaire.

Pour identifier la plage CIDR à utiliser dans le fichier YAML, procédez comme suit :

  1. Ouvrez la console Amazon EC2.
  2. Choisissez Instances, puis sélectionnez l’instance.
  3. Dans l’onglet Réseau, dans Interfaces réseau, notez l’ID de sous-réseau de votre interface réseau secondaire.
  4. Ouvrez la console Amazon VPC.
  5. Choisissez Sous-réseaux, puis notez la plage CIDR IPv4 indiquée pour l’ID de sous-réseau.
  6. Pour appliquer la configuration réseau, exécutez la commande suivante :
    netplan --debug apply

Configurer Debian 12 avec une ENI secondaire dans un sous-réseau différent

Debian 12 utilise systemd-networkd pour la configuration réseau par défaut. Lorsque vous placez une ENI secondaire dans un sous-réseau différent, vous devez créer une table de routage par stratégie avec des règles de routage basées sur la source. Sans ces règles, le trafic provenant de l’interface secondaire utilise la route par défaut de l’interface principale et échoue.

Important : cette section traite d’une configuration avec des sous-réseaux différents. Les sections Ubuntu ci-dessus couvrent uniquement les configurations dans un même sous-réseau.

Procédez comme suit :

  1. Vérifiez que systemd-networkd est le service réseau actif :

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

    Sortie attendue :

    networking: inactive
    systemd-networkd: active
    NetworkManager: inactive

    Si systemd-networkd n’est pas actif, activez-le avant de continuer.

  2. Testez la configuration manuellement avant de la rendre persistante :

    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

    Remarque : remplacez ens6 par le nom de votre interface secondaire, 10.0.2.100 par l’adresse IP de votre ENI secondaire, 10.0.2.64/26 par le CIDR de votre sous-réseau secondaire et 10.0.2.65 par la passerelle de votre sous-réseau secondaire.

  3. Vérifiez que l’interface secondaire achemine le trafic via sa propre passerelle :

    ip route get 8.8.8.8 from 10.0.2.100

    Sortie attendue :

    8.8.8.8 from 10.0.2.100 via 10.0.2.65 dev ens6 table 101 uid 0
        cache
  4. Si le test réussit, supprimez la configuration temporaire :

    sudo ip rule del from $IP/32 lookup $TABLE priority $TABLE
    sudo ip route flush table $TABLE
    sudo ip addr flush dev $IF
  5. Créez un fichier de configuration systemd-networkd persistant :

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

    Remarque : remplacez ens6 par le nom de votre interface secondaire.

  6. Ajoutez le contenu suivant au fichier 60-ens6.network :

    [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

    Remarque : remplacez ens6 par le nom de votre interface secondaire, 10.0.2.100/26 par l’adresse IP et le CIDR de votre ENI secondaire, 10.0.2.65 par la passerelle de votre sous-réseau secondaire et 10.0.2.64/26 par le CIDR de votre sous-réseau secondaire.

  7. Rechargez la configuration réseau :

    sudo networkctl reload && sudo networkctl reconfigure ens6

    Remarque : remplacez ens6 par le nom de votre interface secondaire.

  8. Réglez le filtre de chemin inverse en mode permissif pour autoriser le trafic entrant sur l’interface secondaire. Vérifiez les valeurs actuelles :

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

    Si l’une des valeurs est 1, créez ou mettez à jour /etc/sysctl.d/99-multihome.conf avec les lignes suivantes :

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

    Appliquez les modifications :

    sudo sysctl --system

    Remarque : le réglage rp_filter=2 active le mode permissif. Cela permet aux paquets d’arriver sur l’interface secondaire même si le chemin de retour utilise une interface différente.

  9. Vérifiez que chaque interface achemine le trafic via sa propre passerelle.

    Pour l’ENI principale :

    ip route get 8.8.8.8 from 10.0.2.12

    Sortie attendue :

    8.8.8.8 from 10.0.2.12 via 10.0.2.1 dev ens5 uid 0
        cache

    Pour l’ENI secondaire :

    ip route get 8.8.8.8 from 10.0.2.100

    Sortie attendue :

    8.8.8.8 from 10.0.2.100 via 10.0.2.65 dev ens6 table 101 uid 0
        cache
  10. Redémarrez l’instance et répétez les commandes de vérification de l’étape 9 pour confirmer que la configuration persiste.

Informations connexes

Configurer les tables de routage

Interfaces réseau Elastic

AWS OFFICIELA mis à jour il y a 11 jours