Connessione in attesa
Questo argomento descrive uno dei problemi più comuni riscontrati nelle comunicazioni tra la rete cloud e la rete in locale: una connessione sospesa, anche se è possibile eseguire il ping degli host sulla connessione.
Riepilogo del problema e delle soluzioni
Symptom: la rete cloud virtuale (VCN) si connette alla rete on premise esistente utilizzando la VPN da sito a sito o Oracle Cloud Infrastructure FastConnect. Gli host su un lato della connessione possono eseguire il ping sugli host sull'altro lato, ma il traffico normale che utilizza la connessione viene sospeso. Ad esempio:
- È possibile eseguire la connessione SSH a un host tramite la connessione, ma dopo aver eseguito il login all'host, la connessione si blocca.
- È possibile avviare una connessione VNC (Virtual Networking Computing), ma la sessione si blocca.
- È possibile avviare un download SFTP, ma il download si blocca.
Problema generale: Path Maximum Transmission Unit Discovery (PMTUD) probabilmente non funziona su uno o entrambi i lati della connessione. Deve funzionare su entrambi i lati della connessione in modo che entrambi i lati possano sapere se stanno cercando di inviare pacchetti troppo grandi per la connessione e regolare di conseguenza. Per una breve panoramica di Maximum Transmission Unit (MTU) e PMTUD, vedere Panoramica di MTU e Panoramica di PMTUD.
Soluzioni per il fissaggio PMTUD:
Il diagramma riportato di seguito mostra uno scenario di esempio con la rete in locale connessa alla rete VCN tramite VPN da sito a sito e dispone di callout che rappresentano ogni parte della soluzione.
- Assicurarsi che gli host utilizzino PMTUD: se gli host della rete in locale non utilizzano PMTUD (ossia, se non impostano il flag Non frammentare nei pacchetti), non hanno modo di scoprire se stanno inviando pacchetti troppo grandi per la connessione. Per impostazione predefinita, le istanze sul lato Oracle della connessione utilizzano PMTUD. Non modificare la configurazione nelle istanze. Inoltre, assicurarsi che i server abbiano una regola firewall per consentire ICMP tipo 3 codice 4.
-
Assicurarsi che sia le liste di sicurezza VCN che i firewall delle istanze consentano i messaggi ICMP di tipo 3 codice 4: quando PMTUD è in uso, gli host di invio ricevono un messaggio ICMP speciale se inviano pacchetti troppo grandi per la connessione. Al ricevimento del messaggio, l'host può aggiornare dinamicamente la dimensione dei pacchetti per adattarsi alla connessione. Tuttavia, affinché le tue istanze ricevano questi importanti messaggi ICMP, devi configurare sia gli elenchi di sicurezza per la subnet nella VCN che i firewall dell'istanza per accettarli.
Suggerimento
Se si utilizzano regole della lista di sicurezza con conservazione dello stato (per il traffico TCP, UDP o ICMP), non è necessario assicurarsi che la lista di sicurezza disponga di una regola esplicita per consentire i messaggi ICMP di tipo 3 codice 4 perché il servizio di networking tiene traccia delle connessioni e consente automaticamente tali messaggi. Le regole senza conservazione dello stato richiedono una regola esplicita nella lista di sicurezza in entrata per i messaggi ICMP di tipo 3 codice 4. Verificare che i firewall dell'istanza siano impostati correttamente.Per verificare se un host sta ricevendo i messaggi, vedere Ricerca della posizione di interruzione di PMTUD.
- Assicurarsi che il router in locale rispetti il flag Non frammentare: se il router non rispetta il flag e pertanto ignora l'uso di PMTUD, invia pacchetti frammentati alle istanze nella VCN. Non è quello che si desidera visualizzare. Fare riferimento a Perché evitare la frammentazione?. È probabile che le liste di sicurezza della VCN siano configurate in modo da riconoscere solo il frammento iniziale ed eliminare quelli rimanenti, causando la sospensione della connessione. Invece, il router dovrebbe utilizzare PMTUD e rispettare il flag Don't Fragment per determinare la corretta dimensione dei pacchetti non frammentati da inviare attraverso la connessione.
Continua a leggere per una breve panoramica di MTU e PMTUD e come verificare il funzionamento di PMTUD su entrambi i lati della connessione di rete.
Perché evitare la frammentazione?
Ti starai chiedendo perché vuoi evitare la frammentazione. In primo luogo, influisce negativamente sulle prestazioni dell'applicazione. La frammentazione richiede il riassemblaggio dei frammenti e la ritrasmissione dei frammenti persi. Il riassemblaggio e la ritrasmissione richiedono tempo e risorse CPU.
In secondo luogo, solo il primo frammento contiene le informazioni sulla porta di origine e di destinazione. Ciò significa che i firewall o gli elenchi di sicurezza della VCN eliminano gli altri pacchetti, in quanto in genere sono configurati per valutare le informazioni sulla porta. Affinché la frammentazione funzioni con i firewall e le liste di sicurezza, è necessario configurarle per essere più permissive del solito, il che non è auspicabile.
Panoramica di MTU
Le comunicazioni tra due host qualsiasi in una rete IP (Internet Protocol) utilizzano i pacchetti. Ogni pacchetto ha un indirizzo IP di origine e di destinazione e un payload di dati. Ogni segmento di rete tra i due host ha un'unità massima di trasmissione che rappresenta il numero di byte trasportabile da un singolo pacchetto.
La dimensione standard della MTU Internet è di 1500 byte. Questo vale anche per la maggior parte delle reti domestiche e molte reti aziendali (e le loro reti Wi-Fi). Alcuni data center, inclusi quelli per Oracle Cloud Infrastructure, possono avere una MTU più grande. Per impostazione predefinita, tutte le istanze di computazione OCI utilizzano una MTU di 9000. Su un host Oracle Linux 8, è possibile utilizzare il comando ip address show
per visualizzare l'MTU della connessione di rete di tale host (o utilizzare ip link
su Red Hat Linux). Ad esempio, ecco l'output di un'istanza di Oracle Linux 8 (l'MTU è evidenziato in corsivo rosso):
ip address show <interface-x>
<interface-x>: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc pfifo_fast state UP group default qlen 1000
link/ether 01:00:5E:90:10:10 brd ff:ff:ff:ff:ff:ff
...
Per un confronto, ecco l'output di un host Oracle Linux 8 connesso a una rete aziendale:
ip address show <interface-y>
<interface-y>: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 01:00:5E:90:10:20 brd ff:ff:ff:ff:ff:ff
...
Si noti che la sua MTU è il più tipico 1500 byte.
Se l'host si connette tramite una VPN aziendale, la MTU è ancora più piccola, perché il tunnel VPN deve incapsulare il traffico all'interno di un pacchetto IPSec e inviarlo attraverso la rete locale. Ad esempio:
ip address show <interface-z>
<interface-z>: flags=81d1<UP,POINTOPOINT,RUNNING,NOARP,PROMISC,MULTICAST> mtu 1300
...
Come fanno i due host a capire quanto grande di un pacchetto possono inviare a vicenda? Per molti tipi di traffico di rete, ad esempio HTTP, SSH e FTP, gli host utilizzano TCP per stabilire nuove connessioni. Durante l'handshake iniziale a tre vie tra due host, ciascuno di essi invia il messaggio Maximum Segment Size (MSS) per determinare la dimensione del payload. Questo è più piccolo della MTU. (TCP viene eseguito all'interno del protocollo Internet (IP), motivo per cui è indicato come TCP / IP. I segmenti sono per TCP quali pacchetti sono per IP.)
L'applicazione tcpdump consente di visualizzare il valore MSS condiviso durante l'handshake. Ecco un esempio di tcpdump (con l'MSS evidenziato in corsivo rosso):
12:11:58.846890 IP 192.168.0.25.22 > 10.197.176.19.58824: Flags [S.], seq
2799552952, ack 2580095593, win 26844, options [mss 1260,sackOK,TS val
44858491 ecr 1321638674,nop,wscale 7], length 0
Il pacchetto precedente proviene da una connessione SSH a un'istanza da un laptop connesso a una VPN aziendale. La rete locale che il laptop utilizza per la sua connessione Internet ha una MTU di 1500 byte. Il tunnel VPN applica una MTU di 1300 byte. Quindi, quando si tenta la connessione SSH, TCP (in esecuzione all'interno della connessione IP) indica all'istanza di Oracle Cloud Infrastructure di supportare segmenti TCP inferiori o uguali a 1260 byte. Con una connessione VPN aziendale, il laptop connesso alla VPN in genere ha la più piccola MTU e MSS rispetto a qualsiasi cosa con cui comunica su Internet.
Un caso più complesso è quando i due host hanno un MTU più grande di un collegamento di rete intermedio tra loro non connesso direttamente a nessuno di essi. Il seguente diagramma descrive un esempio.
L'esempio mostra due server, ognuno collegato direttamente alla propria rete instradata che supporta una MTU a 9000 byte. I server si trovano in diversi data center. Ogni data center si connette a Internet, che supporta una MTU a 1500 byte. Un tunnel VPN da sito a sito IPSec collega i due data center. Quel tunnel attraversa Internet, quindi l'interno del tunnel ha una MTU più piccola di Internet. In questo diagramma, la MTU è di 1380 byte.
Se i due server tentano di comunicare (ad esempio con SSH), durante l'handshake a tre vie, concordano su un MSS intorno all'8960. La connessione SSH iniziale potrebbe riuscire, poiché le dimensioni massime dei pacchetti durante l'impostazione iniziale della connessione SSH sono in genere inferiori ai 1380 byte. Quando un lato tenta di inviare un pacchetto più grande del più piccolo collegamento tra i due endpoint, Path MTU Discovery (PMTUD) diventa critico.
Panoramica di PMTUD
La ricerca automatica MTU del percorso è definita in RFC 1191 e RFC 8899. Funziona richiedendo ai due host di comunicazione di impostare un flag Non frammentare nei pacchetti inviati da ciascuno di essi. Se un pacchetto di uno di questi host raggiunge un router in cui l'interfaccia di uscita (o in uscita) ha una MTU più piccola della lunghezza del pacchetto, il router rilascia quel pacchetto. Il router restituisce anche un messaggio ICMP di tipo 3 codice 4 all'host. Questo messaggio specifica "Destinazione non raggiungibile, frammentazione necessaria e impostazione di non frammentazione" (definita in RFC 792). In effetti il router dice all'host: "Mi hai detto di non frammentare pacchetti troppo grandi, e questo è troppo grande. Non lo sto mandando". Il router indica inoltre all'host la dimensione massima consentita per i pacchetti tramite l'interfaccia di uscita. L'host di invio regola quindi le dimensioni dei suoi pacchetti in uscita in modo che siano più piccoli del valore fornito dal router nel messaggio.
Questo esempio mostra il risultato quando un'istanza tenta di eseguire il ping di un host (203.0.113.2) su Internet con un pacchetto da 8000 byte e il flag Non frammentare impostato (ovvero con PMTUD in uso). Il messaggio ICMP restituito viene evidenziato in corsivo rosso:
ping 203.0.113.2 -M do -s 8000
PING 203.0.113.2 (203.0.113.2) 8000(8028) bytes of data.
From 10.0.0.2 icmp_seq=1
Frag needed and DF set (mtu = 1500)
La risposta è esattamente ciò che dovresti aspettarti. L'host di destinazione è su Internet, che ha una MTU di 1500 byte. Anche se la connessione di rete locale dell'host di invio ha una MTU di 9000 byte, l'host non può raggiungere l'host di destinazione con il pacchetto di 8000 byte e ottiene un messaggio ICMP di conseguenza. PMTUD funziona correttamente.
Per un confronto, ecco lo stesso ping, ma l'host di destinazione si trova in un tunnel VPN da sito a sito IPSec:
ping 192.168.6.130 -M do -s 8000
PING 192.168.0.130 (192.168.0.130) 8000(8028) bytes of data.
From 192.0.2.2 icmp_seq=1 Frag needed and DF set
(mtu = 1358)
Qui il router VPN vede che per inviare questo pacchetto alla sua destinazione, l'interfaccia in uscita è un tunnel VPN. Quel tunnel attraversa Internet, quindi il tunnel deve rientrare nel collegamento MTU a 1500 byte di Internet. Di conseguenza, l'interno del tunnel consente solo pacchetti fino a 1360 byte (che il router ha poi abbassato a 1358, il che può rendere le cose più confuse).
Trovare dove PMTUD è rotto
Se PMTUD non funziona da qualche parte lungo la connessione, è necessario capire perché e dove si è rotto. In genere è perché il pacchetto ICMP tipo 3 codice 4 (dal router con il link vincolato che non può adattarsi al pacchetto) non torna mai all'host di invio. Questo può accadere se qualcosa blocca quel tipo di traffico tra l'host e il router, e su entrambi i lati del tunnel VPN (o altro link MTU limitato).
Prova a fare ping da ogni lato della connessione
Per risolvere il problema del PMTUD danneggiato, è necessario determinare se PMTUD sta lavorando su ciascun lato della connessione. In questo scenario, supponiamo che la connessione utilizzi una VPN da sito a sito.
Come eseguire il ping: come in Panoramica di PMTUD, il ping di un host sull'altro lato della connessione con un pacchetto che si sa sia troppo grande per adattarsi al tunnel VPN (ad esempio, 1500 byte o più grande). A seconda del sistema operativo utilizzato dall'host di invio, potrebbe essere necessario formattare il comando ping in modo leggermente diverso per determinare che è impostato il flag Non frammentare. Per Ubuntu e Oracle Linux, utilizzare il flag -M
con il comando ping.
Di seguito sono riportate le informazioni della Guida incorporate relative al flag -M
.
-M pmtudisc_opt
Select Path MTU Discovery strategy. pmtudisc_option may be either do
(prohibit fragmentation, even local one), want (do PMTU discovery, fragment
locally when packet size is large), or dont (do not set DF flag).
Ecco un ping di esempio (con il flag -M e il messaggio ICMP risultante evidenziato in corsivo rosso)
ping -M do
-s 1500 192.168.6.130
PING 192.168.0.130 (192.168.0.130) 1500(1528) bytes of data.
From 10.0.0.2 icmp_seq=1
Frag needed and DF set (mtu = 1358)
Buono: PMTUD Funziona
Se il risultato include la riga "Da x.x.x.x icmp_seq=1 Frag necessario e DF set (mtu = xxxx)", PMTUD sta lavorando su quel lato del tunnel. Si noti che l'indirizzo di origine del messaggio ICMP è l'indirizzo IP pubblico del tunnel che il traffico sta tentando di estrarre (ad esempio, 203.0.113.13 nell'esempio Ubuntu precedente).
Inoltre, ping dall'altro lato della connessione per confermare che PMTUD sta funzionando da quel lato. Entrambi i lati della connessione devono riconoscere quando un tunnel tra di loro non può adattarsi ai grandi pacchetti.
Bad: Se stai testando il tuo lato della connessione e il ping ha successo
Se stai inviando il ping da un host nella tua rete on-premise e il ping riesce, probabilmente significa che il tuo router edge non sta rispettando il flag Non frammentare. Invece, il router sta frammentando il grande pacchetto. Il primo frammento raggiunge l'host di destinazione, quindi il ping riesce, il che è fuorviante. Se si tenta di fare di più del semplice ping, i frammenti dopo la prima goccia e la connessione si blocca.
Verificare che la configurazione del router rispetti il flag Non frammentare. La configurazione predefinita del router è quella di rispettarla, ma qualcuno potrebbe aver modificato il valore predefinito.
Errore: se si sta eseguendo il test del lato VCN della connessione e non viene visualizzato il messaggio ICMP
Quando si esegue il test dal lato VCN della connessione, se nella risposta non viene visualizzato il messaggio ICMP, è probabile che il pacchetto ICMP venga eliminato prima che raggiunga l'istanza.
Potrebbero esserci due problemi:
- Elenco di sicurezza: nella lista di sicurezza di networking potrebbe mancare una regola di entrata che consenta ai messaggi ICMP di tipo 3 codice 4 di raggiungere l'istanza. Si tratta di un problema solo se si utilizzano regole della lista di sicurezza senza conservazione dello stato. Se si utilizzano regole con conservazione dello stato, le connessioni vengono tracciate e il messaggio ICMP viene consentito automaticamente senza che sia necessaria una specifica regola della lista di sicurezza per consentirlo. Se si utilizzano regole senza conservazione dello stato, assicurarsi che la subnet dell'istanza disponga di una lista di sicurezza con una regola di entrata che consenta il codice 4 del traffico ICMP di tipo 3 dall'origine 0.0.0.0/0 e da qualsiasi porta di origine. Per ulteriori informazioni, vedere Elenchi di sicurezza e in particolare Aggiornamento delle regole in una lista di sicurezza.
- Firewall istanza: nelle regole del firewall dell'istanza (impostate nel sistema operativo) potrebbe mancare una regola che consente ai messaggi ICMP di tipo 3 codice 4 di raggiungere l'istanza. In particolare, per un'istanza Linux, configurare iptables o firewalld per consentire i messaggi ICMP di tipo 3 codice 4.
Evitare la necessità di PMTUD
Oracle consiglia l'utilizzo di PMTUD. Tuttavia, in alcune situazioni è possibile configurare i server in modo da non dover fare affidamento su di esso. Considera il caso delle istanze nella tua VCN che comunicano tra VPN da sito a sito agli host nella tua rete on premise. Conosci la gamma di indirizzi IP per la tua rete on premise. È possibile aggiungere un instradamento speciale alle istanze che specifica la MTU massima da utilizzare durante la comunicazione con gli host in tale intervallo di indirizzi. La comunicazione da istanza a istanza all'interno della VCN utilizza comunque un MTU di 9000 byte.
Le informazioni riportate di seguito mostrano come impostare l'instradamento su un'istanza Linux.
La tabella di instradamento predefinita nell'istanza in genere include due instradamenti: l'instradamento predefinito (per il gateway predefinito) e un instradamento locale (per la subnet locale). Ad esempio:
ip route show
default via 10.0.6.1 dev ens3
10.0.6.0/27 dev ens3 proto kernel scope link src 10.0.6.9
Puoi aggiungere un altro instradamento che punta allo stesso gateway predefinito, con l'intervallo di indirizzi della rete in locale e una MTU più piccola. Ad esempio, nel seguente comando, la rete in locale è 1.0.0.0/8, il gateway predefinito è 10.0.6.1 e la dimensione massima MTU è 1300 per i pacchetti inviati alla rete in locale.
ip route add 1.0.0.0/8 via 10.0.6.1 mtu 1300
La tabella di instradamento aggiornata è simile alla seguente:
ip route show
default via 10.0.6.1 dev ens3
1.0.0.0/8 via 10.0.6.1 dev ens3 mtu 1300
10.0.6.0/27 dev ens3 proto kernel scope link src 10.0.6.9
All'interno della VCN, la comunicazione da istanza a istanza continua a utilizzare 9000 MTU. Tuttavia, la comunicazione con la rete on-premise utilizza un massimo di 1300. In questo esempio si presume che nessuna parte della connessione tra la rete in locale e la rete VCN utilizzi una MTU inferiore a 1300.
I comandi precedenti non sono persistenti se si riavvia l'istanza. È possibile rendere permanente l'instradamento aggiungendolo a un file di configurazione nel sistema operativo. Oracle Linux, ad esempio, utilizza un file specifico dell'interfaccia denominato
/etc/sysconfig/network-scripts/route-<interface>
. Per ulteriori informazioni, consultare la documentazione relativa alla propria variante di Linux.