Si applica a: ✔️ macchine virtuali di Linux
Note
CentOS a cui si fa riferimento in questo articolo è una distribuzione Linux e raggiungerà End Of Life (EOL). Valutare le proprie esigenze e pianificare di conseguenza. Per altre informazioni, vedere Indicazioni sulla fine della vita di CentOS.
Riepilogo
Questo articolo illustra come configurare più interfacce di rete virtuale in Azure macchine virtuali Linux che eseguono le distribuzioni Linux più comuni.
È possibile creare una macchina virtuale Azure con più interfacce di rete collegate. Uno scenario comune consiste nell'avere subnet diverse per la connettività front-end e back-end o una rete dedicata a una soluzione di monitoraggio o backup.
Questo articolo fornisce la configurazione necessaria per il funzionamento di più interfacce di rete in una macchina virtuale Linux Azure basata sullo scenario di esempio seguente:
- La macchina virtuale ha due o più interfacce di rete nella stessa subnet.
- La macchina virtuale ha due o più interfacce di rete in subnet diverse, ma nella stessa Rete virtuale (VNET).
Per informazioni dettagliate, vedere gli screenshot seguenti:
In ogni scenario, la connettività può essere testata da qualsiasi macchina virtuale nella stessa rete virtuale.
Importante
Questo stesso processo può essere seguito anche nelle macchine virtuali con più di due schede di interfaccia di rete.
Quando si aggiungono più interfacce di rete a una macchina virtuale Linux, è necessario creare regole di routing. Queste regole consentono alla macchina virtuale di inviare e ricevere traffico appartenente a un'interfaccia di rete specifica. In caso contrario, il traffico non può essere elaborato correttamente. Ad esempio, il traffico appartenente a eth1 non può essere elaborato correttamente dalla route predefinita definita.
Le sezioni seguenti forniscono la configurazione necessaria per due interfacce di rete che funzionano nelle macchine virtuali Linux che eseguono le distribuzioni Linux più comuni.
Note
Eseguire tutti i comandi nelle sezioni seguenti usando i privilegi di root (passando all'utente root o utilizzando il comando sudo).
In ogni sezione si supponga che la macchina virtuale abbia due interfacce di rete con una delle impostazioni seguenti:
Aggiungere due tabelle di routing al file /etc/iproute2/rt_tables eseguendo i comandi seguenti (è necessaria una voce per scheda di interfaccia di rete):
sudo echo "200 eth0-rt" >> /etc/iproute2/rt_tables
sudo echo "201 eth1-rt" >> /etc/iproute2/rt_tables
Se alla macchina virtuale sono collegate più interfacce di rete, aggiungere tabelle di routing aggiuntive, ad esempio 202 eth2-rt, 203 eth3-rt e così via.
Assicurarsi che esista un file di configurazione per ogni interfaccia di rete nella directory /etc/sysconfig/network-scripts/ . È possibile creare nuovi file di configurazione dell'interfaccia di rete in base al file di configurazione ifcfg-eth0 (modificare la DEVICE riga e rimuovere le DHCP_HOSTNAME righe e HWADDR dal nuovo file). A tale scopo, eseguire i seguenti comandi:
sudo cat /etc/sysconfig/network-scripts/ifcfg-eth0 > /etc/sysconfig/network-scripts/ifcfg-eth1
sudo sed -i 's/DEVICE=eth0/DEVICE=eth1/' /etc/sysconfig/network-scripts/ifcfg-eth1
sudo sed -i '/DHCP_HOSTNAME/d' /etc/sysconfig/network-scripts/ifcfg-eth1
sudo sed -i '/HWADDR/d' /etc/sysconfig/network-scripts/ifcfg-eth1
Per rendere persistente e applicata la modifica durante l'attivazione dello stack di rete, modificare i file /etc/sysconfig/network-scripts/ifcfg-eth0 e /etc/sysconfig/network-scripts/ifcfg-eth1 (ifcfg-eth2, ifcfg-eth3 e così via, se la macchina virtuale ha più di due interfacce di rete) e modificare il valore di NM_CONTROLLED da yes a no. A tale scopo, eseguire i seguenti comandi:
sudo cp -rp /etc/sysconfig/network-scripts/ifcfg-eth0 /tmp/ifcfg-eth0.bkp
sudo cp -rp /etc/sysconfig/network-scripts/ifcfg-eth1 /tmp/ifcfg-eth1.bkp
sudo sed -i 's/NM_CONTROLLED=yes/NM_CONTROLLED=no/' /etc/sysconfig/network-scripts/ifcfg-eth0
sudo sed -i 's/NM_CONTROLLED=yes/NM_CONTROLLED=no/' /etc/sysconfig/network-scripts/ifcfg-eth1
Note
Verificare che la NM_CONTROLLED=no riga venga aggiunta sia ai file /etc/sysconfig/network-scripts/ifcfg-eth0 e /etc/sysconfig/network-scripts/ifcfg-eth1 usando il cat /etc/sysconfig/network-scripts/ifcfg-eth* comando . Se la riga non è presente nei file, aggiungerla manualmente usando i sudo echo "NM_CONTROLLED=no" >> /etc/sysconfig/network-scripts/ifcfg-eth0 comandi e sudo echo "NM_CONTROLLED=no" >> /etc/sysconfig/network-scripts/ifcfg-eth1 .
Dopo aver modificato questa configurazione, riavviare i servizi di rete per applicare le modifiche eseguendo il comando seguente:
sudo systemctl restart network
Creare file di regola e route corrispondenti usando qualsiasi editor di testo (negli esempi seguenti viene usato l'editor vi) e aggiungere regole e route appropriate a ogni file. Usare la procedura seguente per creare un set di file rule-eth# e route-eth# per ogni interfaccia di rete. Sostituire l'indirizzo IP e le informazioni sulla subnet di conseguenza in ogni passaggio. Se sono presenti più interfacce di rete, creare lo stesso set di file rule-eth# e route-eth# per ogni interfaccia usando l'indirizzo IP, la rete e i dettagli del gateway corrispondenti.
Per applicare le modifiche, eseguire il comando seguente per riavviare il servizio di rete:
sudo systemctl restart network
Le regole di routing sono ora impostate correttamente e la connettività dovrebbe funzionare da qualsiasi interfaccia di rete. È possibile testare la connettività usando Secure Shell (SSH) o eseguendo il ping di entrambi gli indirizzi IP da una macchina virtuale nella stessa rete virtuale.
Verificare che le route e le regole correnti vengano caricate usando i comandi seguenti:
sudo ip route show
sudo ip rule show
Importante
Se si verificano ancora problemi durante la comunicazione con la seconda scheda di interfaccia di rete, riavviare la macchina virtuale usando il comando , ripetere il sudo reboot passaggio 7 e testare nuovamente la connettività.
Per impostazione predefinita, il routing dei criteri non è installato in Red Hat Enterprise Linux (RHEL)/CentOS 8.x. Per configurare più interfacce di rete, installare e abilitare l'instradamento basato su criteri. A tale scopo, eseguire i seguenti comandi:
sudo yum install NetworkManager-dispatcher-routing-rules -y
sudo systemctl enable NetworkManager-dispatcher.service
sudo systemctl start NetworkManager-dispatcher.service
In RHEL/CentOS 8.x, l'impostazione NM_CONTROLLED è impostata su yes in ogni file di configurazione di rete (/etc/sysconfig/network-scripts/ifcfg-eth#) per impostazione predefinita. Per evitare problemi, assicurarsi che questa impostazione non sia impostata su no nel file di configurazione specifico. Assicurarsi inoltre che venga creato un file di configurazione di rete corrispondente per ogni interfaccia di rete. Di seguito è riportata la configurazione di esempio per i file di configurazione di rete:
/etc/sysconfig/network-scripts/ifcfg-eth0:
sudo cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=dhcp
TYPE=Ethernet
USERCTL=no
PEERDNS=yes
IPV6INIT=no
PERSISTENT_DHCLIENT=yes
/etc/sysconfig/network-scripts/ifcfg-eth1:
sudo cat /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
ONBOOT=yes
BOOTPROTO=dhcp
TYPE=Ethernet
USERCTL=no
PEERDNS=yes
IPV6INIT=no
PERSISTENT_DHCLIENT=yes
Eseguire i comandi seguenti per aggiungere due tabelle di routing al file /etc/iproute2/rt_tables :
sudo echo "200 eth0-rt" >> /etc/iproute2/rt_tables
sudo echo "201 eth1-rt" >> /etc/iproute2/rt_tables
Se alla macchina virtuale sono collegate più interfacce di rete, aggiungere tabelle di routing aggiuntive, ad esempio 202 eth2-rt, 203 eth3-rt e così via.
Creare i file di configurazione delle regole e delle rotte corrispondenti per ognuna delle schede di interfaccia di rete e aggiungere le regole e le rotte appropriate per ciascuna. Per creare un set di file rule-eth# e route-eth# per ogni interfaccia di rete, seguire questa procedura. Sostituire l'indirizzo IP e le informazioni sulla subnet di conseguenza in ogni passaggio. Se sono presenti più interfacce di rete, creare lo stesso set di file rule-eth# e route-eth# per ogni interfaccia usando i dettagli ip e subnet corrispondenti.
Per applicare le modifiche, riavviare il servizio di rete eseguendo il comando seguente:
sudo systemctl restart NetworkManager
Le regole di routing sono ora impostate correttamente e la connettività dovrebbe funzionare da qualsiasi interfaccia di rete. È possibile testare la connettività usando Secure Shell (SSH) o eseguendo il ping di entrambi gli indirizzi IP da una macchina virtuale nella stessa rete virtuale.
Verificare che le route e le regole correnti vengano caricate usando i comandi seguenti:
sudo ip route show
sudo ip rule show
Importante
Se non si ha ancora connettività alla seconda scheda di interfaccia di rete, riavviare la macchina virtuale usando il comando , ripetere il sudo reboot passaggio 6 e testare nuovamente la connettività.
Aggiungere due tabelle di routing al file /etc/iproute2/rt_tables eseguendo i comandi seguenti:
sudo echo "200 eth0-rt" >> /etc/iproute2/rt_tables
sudo echo "201 eth1-rt" >> /etc/iproute2/rt_tables
Se alla macchina virtuale sono collegate più interfacce di rete, aggiungere tabelle di routing aggiuntive, ad esempio 202 eth2-rt, 203 eth3-rt e così via.
Se l'automazione Cloud-Init è impostata (per impostazione predefinita, è impostata nelle immagini Ubuntu Azure), assicurarsi che l'automazione CI di rete sia disabilitata così che il file /etc/netplan/50-cloud-init.yaml non venga sovrascritto ogni volta che il sistema viene riavviato.
Creare il file /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg usando il comando e il contenuto seguenti:
sudo vi /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg
network:
config: disabled
Modificare il file di configurazione di netplan /etc/netplan/50-cloud-init.yaml usando qualsiasi editor di testo e includere le route e i blocchi di instradamento basato su criteri seguenti per ogni sezione dell'interfaccia di rete.
routes:
- to: <subnet>/24
via: <gatewayIP>
metric: 200
table: 201
- to: 0.0.0.0/0
via: <gatewayIP>
table: <routingTableID>
routing-policy:
- from: <NICIP>/32
table: <routingTableID>
- to: <NICIP>/32
table: <routingTableID>
Sostituire le informazioni relative a subnet, indirizzo MAC e indirizzo IP per ogni interfaccia di rete (eth0 e eth1). Assicurarsi che il valore a 32 bit sia mantenuto nel routing-policy blocco.
Ecco il file di configurazione di esempio che usa i dettagli di esempio specificati:
sudo vi /etc/netplan/50-cloud-init.yaml
Due schede di interfaccia di rete (NIC) nella stessa subnet:
network:
ethernets:
eth0:
dhcp4: true
dhcp4-overrides:
route-metric: 100
dhcp6: false
match:
driver: hv_netvsc
macaddress: 00:0d:3a:9d:60:e6
set-name: eth0
routes:
- to: 10.0.1.0/24
via: 10.0.1.1
metric: 200
table: 200
- to: 0.0.0.0/0
via: 10.0.1.1
table: 200
routing-policy:
- from: 10.0.1.4/32
table: 200
- to: 10.0.1.4/32
table: 200
eth1:
dhcp4: true
dhcp4-overrides:
route-metric: 200
dhcp6: false
match:
driver: hv_netvsc
macaddress: 00:0d:3a:9a:25:5f
set-name: eth1
routes:
- to: 10.0.1.0/24
via: 10.0.1.1
metric: 200
table: 201
- to: 0.0.0.0/0
via: 10.0.1.1
table: 201
routing-policy:
- from: 10.0.1.5/32
table: 201
- to: 10.0.1.5/32
table: 201
version: 2
Due NIC in subnet diverse ma nella stessa VNET.
network:
ethernets:
eth0:
dhcp4: true
dhcp4-overrides:
route-metric: 100
dhcp6: false
match:
driver: hv_netvsc
macaddress: 00:0d:3a:9d:60:e6
set-name: eth0
routes:
- to: 10.0.1.0/24
via: 10.0.1.1
metric: 200
table: 200
- to: 0.0.0.0/0
via: 10.0.1.1
table: 200
routing-policy:
- from: 10.0.1.4/32
table: 200
- to: 10.0.1.4/32
table: 200
eth1:
dhcp4: true
dhcp4-overrides:
route-metric: 200
dhcp6: false
match:
driver: hv_netvsc
macaddress: 00:0x:3x:9x:03:5f
set-name: eth1
routes:
- to: 10.0.2.0/24
via: 10.0.2.1
metric: 200
table: 201
- to: 0.0.0.0/0
via: 10.0.2.1
table: 201
routing-policy:
- from: 10.0.2.5/32
table: 201
- to: 10.0.2.5/32
table: 201
version: 2
Importante
Se si usa uno degli esempi di file di configurazione precedenti, assicurarsi che il valore dell'indirizzo MAC venga sostituito di conseguenza. È possibile ottenere l'indirizzo MAC della scheda di interfaccia di rete corrispondente dall'output del ip a | grep ether | awk '{print $2}' comando.
Applicare le modifiche eseguendo il comando seguente:
sudo netplan apply
Per testare la connettività, effettuare il ping o SSH di entrambi gli indirizzi IP da un'altra macchina virtuale nella stessa rete virtuale:
ping 10.0.1.4
ping 10.0.1.5
Aggiungere due tabelle di routing al file /etc/iproute2/rt_tables eseguendo i comandi seguenti:
sudo echo "200 eth0-rt" >> /etc/iproute2/rt_tables
sudo echo "201 eth1-rt" >> /etc/iproute2/rt_tables
Se alla macchina virtuale sono collegate più interfacce di rete, aggiungere tabelle di routing aggiuntive, ad esempio 202 eth2-rt, 203 eth3-rt e così via.
Creare gli script con route e regole per ogni interfaccia di rete nella directory /etc/sysconfig/network/scripts/ usando qualsiasi editor di testo (nei comandi seguenti viene usato l'editor di testo vi).
/etc/sysconfig/network/scripts/ifup-route.eth0
sudo vi /etc/sysconfig/network/scripts/ifup-route.eth0
#!/bin/bash
/sbin/ip route add default via 10.0.1.1 dev eth0 table eth0-rt
/sbin/ip rule add from 10.0.1.4/32 table eth0-rt
/sbin/ip rule add to 10.0.1.4/32 table eth0-rt
/etc/sysconfig/network/scripts/ifup-route.eth1
sudo vi /etc/sysconfig/network/scripts/ifup-route.eth1
Due schede di interfaccia di rete (NIC) nella stessa subnet:
#!/bin/bash
/sbin/ip route add 10.0.1.0/24 dev eth1 table eth1-rt
/sbin/ip route add default via 10.0.1.1 dev eth1 table eth1-rt
/sbin/ip rule add from 10.0.1.5/32 table eth1-rt
/sbin/ip rule add to 10.0.1.5/32 table eth1-rt
Due NIC in subnet diverse ma nella stessa VNET.
#!/bin/bash
/sbin/ip route add 10.0.2.0/24 dev eth1 table eth1-rt
/sbin/ip route add default via 10.0.2.1 dev eth1 table eth1-rt
/sbin/ip rule add from 10.0.2.5/32 table eth1-rt
/sbin/ip rule add to 10.0.2.5/32 table eth1-rt
Modificare le informazioni di rete e indirizzo IP di conseguenza e mantenere il valore a 32 bit. Se sono presenti più di due schede di interfaccia di rete, assicurarsi che le regole IP e le route IP corrispondenti siano incluse per ognuna di esse.
Fornire le autorizzazioni di esecuzione per entrambi gli script usando i comandi seguenti:
sudo chmod +x /etc/sysconfig/network/scripts/ifup-route.eth0
sudo chmod +x /etc/sysconfig/network/scripts/ifup-route.eth1
Modificare i file di configurazione di rete sia per eth0 che per eth1 (/etc/sysconfig/network/ifcfg-eth#) usando qualsiasi editor di testo e includere la riga seguente in entrambi i file in modo che puntino allo script corrispondente:
Nel file di configurazione di rete /etc/sysconfig/network/ifcfg-eth0:
POST_UP_SCRIPT='compat:suse:/etc/sysconfig/network/scripts/ifup-route.eth0'
Nel file di configurazione di rete /etc/sysconfig/network/ifcfg-eth1:
POST_UP_SCRIPT='compat:suse:/etc/sysconfig/network/scripts/ifup-route.eth1'
Ecco un esempio di entrambi i file di configurazione:
sudo cat /etc/sysconfig/network/ifcfg-eth0
BOOTPROTO='dhcp'
DHCLIENT6_MODE='managed'
MTU=''
REMOTE_IPADDR=''
STARTMODE='onboot'
CLOUD_NETCONFIG_MANAGE='yes'
POST_UP_SCRIPT='compat:suse:/etc/sysconfig/network/scripts/ifup-route.eth0'
sudo cat /etc/sysconfig/network/ifcfg-eth1
STARTMODE='hotplug'
BOOTPROTO='dhcp'
DHCLIENT_SET_DEFAULT_ROUTE='yes'
DHCLIENT_ROUTE_PRIORITY='10100'
CLOUD_NETCONFIG_MANAGE='yes'
POST_DOWN_SCRIPT='compat:suse:cloud-netconfig-cleanup'
POST_UP_SCRIPT='compat:suse:/etc/sysconfig/network/scripts/ifup-route.eth1'
Se il file /etc/sysconfig/network/ifcfg-eth1 non esiste, crearlo usando il contenuto del file /etc/sysconfig/network/ifcfg-eth0 . Assicurarsi che POST_UP_SCRIPT sia regolato per usare lo script corrispondente. A tale scopo, eseguire il comando seguente:
sudo cat /etc/sysconfig/network/ifcfg-eth0 > /etc/sysconfig/network/ifcfg-eth1
Per applicare le modifiche, riavviare il servizio di rete:
sudo systemctl restart network
Le regole di routing sono ora impostate correttamente e la connettività dovrebbe funzionare da qualsiasi interfaccia di rete. È possibile testare la connettività usando Secure Shell (SSH) o eseguendo il ping di entrambi gli indirizzi IP da una macchina virtuale nella stessa rete virtuale.
Verificare che le route e le regole correnti vengano caricate usando i comandi seguenti:
sudo ip route show
sudo ip rule show
Importante
Se non si ha ancora connettività alla seconda scheda di interfaccia di rete, riavviare la macchina virtuale usando il comando , ripetere il sudo reboot passaggio 6 e testare nuovamente la connettività.
Aggiungere due tabelle di routing al file /etc/iproute2/rt_tables eseguendo i comandi seguenti:
sudo echo "200 eth0-rt" >> /etc/iproute2/rt_tables
sudo echo "201 eth1-rt" >> /etc/iproute2/rt_tables
Se alla macchina virtuale sono collegate più interfacce di rete, aggiungere tabelle di routing aggiuntive, ad esempio 202 eth2-rt, 203 eth3-rt e così via.
Creare o modificare il file di configurazione /etc/network/interfaces.d/50-cloud-init con qualsiasi editor di testo.
sudo vi /etc/network/interfaces.d/50-cloud-init
Usare la configurazione seguente:
Due schede di interfaccia di rete (NIC) nella stessa subnet:
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
metric 100
up /usr/sbin/ip route add default via 10.0.1.1 dev eth0 table eth0-rt
up /usr/sbin/ip rule add from 10.0.1.4/32 table eth0-rt
up /usr/sbin/ip rule add to 10.0.1.4/32 table eth0-rt
auto eth1
iface eth1 inet dhcp
metric 200
up /usr/sbin/ip route add 10.0.1.0/24 dev eth1 table eth1-rt
up /usr/sbin/ip route add default via 10.0.1.1 dev eth1 table eth1-rt
up /usr/sbin/ip rule add from 10.0.1.5/32 table eth1-rt
up /usr/sbin/ip rule add to 10.0.1.5/32 table eth1-rt
Due NIC in subnet diverse ma nella stessa VNET.
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
metric 100
up /usr/sbin/ip route add default via 10.0.1.1 dev eth0 table eth0-rt
up /usr/sbin/ip rule add from 10.0.1.4/32 table eth0-rt
up /usr/sbin/ip rule add to 10.0.1.4/32 table eth0-rt
auto eth1
iface eth1 inet dhcp
metric 200
up /usr/sbin/ip route add 10.0.2.0/24 dev eth1 table eth1-rt
up /usr/sbin/ip route add default via 10.0.2.1 dev eth1 table eth1-rt
up /usr/sbin/ip rule add from 10.0.2.5/32 table eth1-rt
up /usr/sbin/ip rule add to 10.0.2.5/32 table eth1-rt
Modificare le informazioni di rete e indirizzo IP di conseguenza e mantenere il valore a 32 bit. Se sono presenti più di due schede di interfaccia di rete, assicurarsi che le regole IP e le route IP corrispondenti siano incluse per ognuna di esse.
Attivare la nuova configurazione usando il comando seguente:
sudo systemctl restart networking
Le regole di routing sono ora impostate correttamente e la connettività dovrebbe funzionare da qualsiasi interfaccia di rete. È possibile testare la connettività usando Secure Shell (SSH) o eseguendo il ping di entrambi gli indirizzi IP da una macchina virtuale nella stessa rete virtuale.
Verificare che le route e le regole correnti vengano caricate usando i comandi seguenti:
sudo ip route show
sudo ip rule show
Importante
Se non è ancora disponibile la connettività alla seconda scheda di interfaccia di rete, riavviare la macchina virtuale usando il comando , ripetere il sudo reboot passaggio 4 e testare di nuovo la connettività.