Risolvi i problemi di connettività interna tra le VM
Questo documento fornisce i passaggi per la risoluzione dei problemi di connettività tra VM di Compute Engine che si trovano nella stessa rete Virtual Private Cloud (VPC) (VPC condiviso o autonomo) o in due reti VPC connesse con il peering di rete VPC. Presuppone che le VM comunichino utilizzando gli indirizzi IP interni dei rispettivi controller di interfaccia di rete virtuale (vNIC).
I passaggi di questa guida si applicano sia alle VM di Compute Engine sia ai nodi di Google Kubernetes Engine.
Se vuoi vedere ulteriori scenari specifici per la risoluzione dei problemi, fai clic sul link Invia feedback in fondo alla pagina per comunicarcelo.
Le seguenti configurazioni di VM e VPC sono applicabili a questa guida:
- Connessioni da VM a VM che usano indirizzi IP interni in una singola rete VPC.
- Connessioni da VM a VM che utilizzano indirizzi IP interni in una rete VPC condiviso.
- Connessioni da VM a VM tramite indirizzi IP interni in reti VPC diverse in peering tramite peering di rete VPC.
I comandi utilizzati in questa guida sono disponibili su tutte le immagini del sistema operativo fornite da Google. Se utilizzi un'immagine sistema operativo personalizzata, potresti dover installare gli strumenti.
Quantifica il problema
- Se ritieni di avere una perdita di pacchetti completa, vedi Risolvere i problemi di connessione completa.
- Se si verifica una latenza, solo una perdita parziale di pacchetti o timeout che si verificano a metà connessione, consulta Risolvere i problemi di latenza o perdita di rete che causano problemi di velocità effettiva.
Risolvere l'errore di connessione completo
Le sezioni seguenti forniscono i passaggi per la risoluzione dei problemi di completa connettività interna tra le VM. Se invece si verificano aumento della latenza o timeout della connessione intermittente, passa alla sezione Risolvere i problemi di latenza o perdita di rete che causano problemi di velocità effettiva.
Determinare i valori della connessione
Innanzitutto, raccogli le seguenti informazioni:
- Dalla pagina Istanze VM, raccogli quanto segue per entrambe le VM:
- Nomi VM
- Zone VM
- Indirizzi IP interni per le vNIC che comunicano
Dalla configurazione del software del server di destinazione, raccogli le seguenti informazioni:
- Protocollo di livello 4
- Porta di destinazione
Ad esempio, se la destinazione è un server HTTPS, il protocollo è TCP e in genere la porta è
443
, ma la tua configurazione specifica potrebbe utilizzare una porta diversa.
Se riscontri problemi con più VM, scegli una singola VM di origine e di destinazione singola che presentano problemi e utilizza questi valori. In generale, la porta di origine della connessione non dovrebbe essere necessaria.
Una volta raccolte queste informazioni, vai a Esaminare i problemi relativi alla rete Google sottostante.
Esamina i problemi relativi alla rete Google sottostante
Se la tua configurazione è esistente e non è stata modificata di recente, il problema potrebbe riguardare la rete Google sottostante. Controlla il Performance Dashboard di Network Intelligence Center per verificare la perdita di pacchetti tra le zone delle VM. Se si verifica un aumento della perdita di pacchetti tra le zone durante il periodo di tempo in cui si sono verificati timeout di rete, questo potrebbe indicare che il problema riguardava la rete fisica sottostante la rete virtuale. Controlla la Dashboard dello stato di Google Cloud per verificare la presenza di problemi noti prima di inviare una richiesta di assistenza.
Se il problema non sembra riguardare la rete Google sottostante, vai a Verificare la presenza di regole firewall di Google Cloud configurate in modo errato.
Verifica la presenza di regole firewall configurate in modo errato in Google Cloud
Connectivity Tests analizza la configurazione del percorso della rete VPC tra due VM e mostra se la configurazione programmata deve consentire o meno il traffico. Se il traffico non è consentito, i risultati mostrano se una regola firewall in uscita o in entrata di Google Cloud blocca il traffico o se una route non è disponibile.
Connectivity Tests può anche testare in modo dinamico il percorso inviando pacchetti tra gli hypervisor delle VM. Se esegui questi test, vengono visualizzati i relativi risultati.
Connectivity Tests esamina solo la configurazione della rete VPC. Non testa il firewall del sistema operativo o le route del sistema operativo, né il software server sulla VM.
La procedura seguente esegue Connectivity Tests dalla console Google Cloud. Per altri modi di eseguire i test, vedi Esecuzione di Connectivity Tests.
Utilizza la seguente procedura per creare ed eseguire un test:
Nella console Google Cloud, vai alla pagina Connectivity Tests.
Nel menu a discesa del progetto, conferma di essere nel progetto corretto o specifica quello corretto.
Fai clic su Crea test di connettività.
Assegna un nome al test.
Specifica quanto segue:
- Protocollo
- Indirizzo IP dell'endpoint di origine
- Progetto di origine e rete VPC
- Indirizzo IP dell'endpoint di destinazione
- Progetto di destinazione e rete VPC
- Porta di destinazione
Fai clic su Crea.
Il test viene eseguito immediatamente. Per visualizzare il diagramma dei risultati, fai clic su Visualizza nella colonna Dettagli risultato.
- Se i risultati indicano che la connessione è stata interrotta da una regola firewall di Google Cloud, determina se la configurazione di sicurezza prevista deve consentire la connessione. Potresti dover chiedere informazioni
all'amministratore della sicurezza o della rete. Se il traffico deve essere consentito, verifica quanto segue:
- Consulta l'elenco Traffico sempre bloccato. Se il traffico viene bloccato da Google Cloud come descritto nell'elenco del traffico sempre bloccato, la configurazione esistente non funzionerà.
- Vai alla pagina Criteri firewall e rivedi le regole firewall. Se il firewall non è configurato correttamente, crea o modifica una regola firewall per consentire la connessione. Può essere una regola firewall VPC o una regola di criteri firewall gerarchici.
- Se esiste una regola firewall configurata correttamente che blocca questo traffico, rivolgiti all'amministratore della sicurezza o di rete. Se i requisiti di sicurezza della tua organizzazione impediscono alle VM di connettersi tra loro, potresti dover riprogettare la configurazione.
- Se i risultati indicano che non ci sono problemi con il percorso di connettività VPC, il problema potrebbe essere uno dei seguenti.
- Problemi con la configurazione del sistema operativo guest, ad esempio con il software firewall.
- Problemi con le applicazioni client o server, ad esempio il blocco o la configurazione dell'applicazione per l'ascolto sulla porta errata.
I passaggi successivi ti guideranno nell'esame di ciascuna di queste possibilità. Continua con Verificare la connettività TCP dall'interno della VM.
Testa la connettività TCP dall'interno della VM
Se il test di connettività VM-VM non ha rilevato un problema di configurazione VPC, inizia a testare la connettività OS-OS. I seguenti passaggi ti aiutano a determinare quanto segue:
- Se un server TCP è in ascolto sulla porta indicata
- Se il software firewall lato server consente le connessioni a quella porta dalla VM client
- Se il software firewall lato client consente le connessioni a quella porta sul server
- Se la tabella di route lato server è configurata correttamente per inoltrare i pacchetti
- Se la tabella di route lato client è configurata correttamente per inoltrare i pacchetti
Puoi testare l'handshake TCP utilizzando curl
con Linux o Windows 2019 oppure
utilizzando il comando New-Object System.Net.Sockets.TcpClient
con Windows
Powershell. Il flusso di lavoro in questa sezione dovrebbe produrre uno dei seguenti risultati: connessione riuscita, timeout della connessione o reimpostazione della connessione.
- Operazione riuscita: se l'handshake TCP viene completato correttamente, una regola firewall del sistema operativo non blocca la connessione, il sistema operativo inoltra correttamente i pacchetti e un server di qualche tipo è in ascolto sulla porta di destinazione. In questo caso, il problema potrebbe riguardare l'applicazione stessa. Per verificarlo, consulta la sezione Controllare il logging del server per informazioni sul comportamento del server.
- Timeout:in caso di timeout della connessione, in genere si verifica una delle seguenti condizioni:
- Non esistono computer a quell'indirizzo IP
- Esiste un firewall da qualche parte in cui i pacchetti vengono scartati automaticamente
- Il routing dei pacchetti del sistema operativo invia i pacchetti a una destinazione che non è in grado di elaborarli oppure il routing asimmetrico invia il pacchetto di ritorno su un percorso non valido
Reimposta: se la connessione viene reimpostata, significa che l'IP di destinazione riceve pacchetti, ma un sistema operativo o un'applicazione li rifiuta. Può trattarsi di una delle seguenti situazioni:
- I pacchetti arrivano alla macchina sbagliata e non sono configurati per rispondere a quel protocollo
- I pacchetti arrivano alla macchina corretta, ma nessun server è in ascolto su quella porta
- I pacchetti arrivano alla macchina e alla porta corrette, ma i protocolli di livello superiore (come SSL) non stanno completando l'handshake
- Un firewall sta reimpostando la connessione. Questo è meno probabile che un firewall elimini automaticamente i pacchetti, ma può succedere.
Linux
Nella console Google Cloud, vai alla pagina Criteri firewall.
Assicurati che esista una regola firewall che consenta le connessioni SSH da IAP alla VM o creane una nuova.
Nella console Google Cloud, vai alla pagina Istanze VM.
Trova la VM di origine.
Fai clic su SSH nella colonna Connetti per quella VM.
Dalla riga di comando della macchina client, esegui questo comando. Sostituisci DEST_IP:DEST_PORT con l'indirizzo IP e la porta di destinazione.
curl -vso /dev/null --connect-timeout 5 DEST_IP:DEST_PORT
Windows
Nella console Google Cloud, vai alla pagina Istanze VM.
Trova la VM di origine.
Utilizza uno dei metodi descritti in Connessione alle VM Windows per connetterti alla VM.
Dalla riga di comando della macchina client, esegui questo comando:
- Windows 2019:
curl -vso /dev/null --connect-timeout 5 DEST_IP:DEST_PORT
- Windows 2012 o Windows 2016 Powershell:
PS C:> New-Object System.Net.Sockets.TcpClient('DEST_IP',DEST_PORT)`
- Windows 2019:
Connessione riuscita
I seguenti risultati indicano un handshake TCP riuscito. Se l'handshake TCP viene completato correttamente, il problema non è correlato al timeout o al reset della connessione TCP. Il problema di timeout si verifica invece all'interno dei livelli dell'applicazione. Se la connessione riesce, vai a Controllare il logging del server per informazioni sul comportamento del server.
Linux e Windows 2019
$ curl -vso /dev/null --connect-timeout 5 192.168.0.4:443
La riga "Connesso a" indica un handshake TCP riuscito.
Expire in 0 ms for 6 (transfer 0x558b3289ffb0) Expire in 5000 ms for 2 (transfer 0x558b3289ffb0) Trying 192.168.0.4... TCP_NODELAY set Expire in 200 ms for 4 (transfer 0x558b3289ffb0) Connected to 192.168.0.4 (192.168.0.4) port 443 (#0) > GET / HTTP/1.1 > Host: 192.168.0.4:443 > User-Agent: curl/7.64.0 > Accept: */* > Empty reply from server Connection #0 to host 192.168.0.4 left intact
Windows 2012 e 2016
PS C:\> New-Object System.Net.Sockets.TcpClient('DEST_IP_ADDRESS', PORT)
Risultato della connessione riuscito. La riga "Connesso: True" è pertinente.
Available : 0 Client : System.Net.Sockets.Socket Connected : True ExclusiveAddressUse : False ReceiveBufferSize : 131072 SendBufferSize : 131072 ReceiveTimeout : 0 SendTimeout : 0 LingerState : System.Net.Sockets.LingerOption NoDelay : False
Timeout connessione
I seguenti risultati indicano che la connessione è scaduta. Se si verifica il timeout della connessione, vai alla sezione Verificare l'indirizzo IP e la porta del server.
Linux e Windows 2019
$ curl -vso /dev/null --connect-timeout 5 DEST_IP_ADDRESS:PORT
Risultato del timeout della connessione:
Trying 192.168.0.4:443... Connection timed out after 5000 milliseconds Closing connection 0
Windows 2012 e 2016
PS C:\> New-Object System.Net.Sockets.TcpClient('DEST_IP_ADDRESS', PORT)
Risultato del timeout della connessione:
New-Object: Exception calling ".ctor" with "2" argument(s): "A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond. 192.168.0.4:443"
Reimposta connessione
Una reimpostazione si verifica quando un dispositivo invia un pacchetto RST al client, informando il client che la connessione è stata terminata. La connessione potrebbe essere reimpostata per uno dei seguenti motivi:
- Il server di destinazione non è stato configurato per accettare connessioni per quel protocollo su quella porta. Il pacchetto potrebbe essere stato inviato al server o alla porta errati oppure il software del server non era configurato correttamente.
- Il software firewall ha rifiutato il tentativo di connessione
Se la connessione è stata reimpostata, vai a Verificare di accedere all'indirizzo IP e alla porta corretti.
Linux e Windows 2019
$ curl -vso /dev/null --connect-timeout 5 DEST_IP_ADDRESS:PORT
Risultato della reimpostazione della connessione:
Trying 192.168.0.4:443... connect to 192.168.0.4 port 443 failed: Connection refused Failed to connect to 192.168.0.4 port 443: Connection refused Closing connection 0
Windows 2012 e 2016
PS C:\> New-Object System.Net.Sockets.TcpClientt('DEST_IP_ADDRESS', PORT)
Risultato della reimpostazione della connessione:
New-Object: Exception calling ".ctor" with "2" argument(s): "No connection could be made because the target machine actively refused it. 192.168.0.4:443"
Verifica l'indirizzo IP e la porta del server
Esegui uno dei seguenti comandi sul server. Indicano se c'è un server in ascolto sulla porta necessaria.
Linux
$ sudo netstat -ltuvnp
L'output mostra che un server TCP è in ascolto di qualsiasi indirizzo IP di destinazione (0.0.0.0
) sulla porta 22, accettando connessioni da qualsiasi indirizzo di origine (0.0.0.0
) e qualsiasi porta di origine (*
). La colonna PID/Program name specifica l'eseguibile associato al socket.
Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 588/sshd tcp6 0 0 :::22 :::* LISTEN 588/sshd udp 0 0 0.0.0.0:68 0.0.0.0:* 334/dhclient udp 0 0 127.0.0.1:323 0.0.0.0:* 429/chronyd udp6 0 0 ::1:323 :::* 429/chronyd
Windows
PS C:\> Get-NetTcpConnection -State "LISTEN" -LocalPort DEST_PORT
L'output mostra i risultati dell'esecuzione del comando con DEST_PORT impostato su 443
.
Questo output mostra che un server TCP è in ascolto di qualsiasi indirizzo (0.0.0.0
) alla porta 443
e accetta connessioni da qualsiasi indirizzo di origine (0.0.0.0
) e qualsiasi porta di origine (0
). La colonna OwningProcess indica l'ID di processo del processo che ascolta il socket.
LocalAddress LocalPort RemoteAddress RemotePort State AppliedSetting OwningProcess ------------ --------- ------------- ---------- ----- -------------- ------------- :: 443 :: 0 Listen 928 0.0.0.0 443 0.0.0.0 0 Listen 928
Se noti che il server non è associato alla porta o all'IP corretti o che il prefisso remoto non corrisponde al tuo client, consulta la documentazione o il fornitore del server per risolvere il problema. Il server deve essere associato all'indirizzo IP di una determinata interfaccia o a 0.0.0.0
e deve accettare connessioni dal prefisso IP client corretto o 0.0.0.0
.
Se il server delle applicazioni è associato all'indirizzo IP e alla porta corretti, è possibile che il client stia accedendo alla porta sbagliati, che un protocollo di livello superiore (spesso TLS) rifiuti attivamente la connessione o che un firewall rifiuti la connessione.
Verifica che il client e il server utilizzino la stessa versione TLS e la stessa crittografia.
Verifica che il client acceda alla porta corretta.
Se i passaggi precedenti non risolvono il problema, consulta l'articolo Controllare la presenza di eliminazioni di pacchetti nel firewall su client e server.
Verifica la presenza di eliminazioni di pacchetti nel firewall su client e server
Se il server non è raggiungibile dalla VM client, ma è in ascolto sulla porta corretta, è possibile che una delle VM esegua un software firewall che sta ignorando i pacchetti associati alla connessione. Controlla il firewall sulle VM client e server usando i comandi seguenti.
Se una regola blocca il traffico, puoi aggiornare il software firewall per consentire il traffico. Se aggiorni il firewall, procedi con cautela durante la preparazione ed l'esecuzione dei comandi, perché un firewall configurato in modo errato può bloccare il traffico imprevisto. Valuta la possibilità di configurare l'accesso alla console seriale VM prima di procedere.
IPtables Linux
Controlla il conteggio dei pacchetti per conoscere il numero di pacchetti elaborati per ogni catena e regola iptables installate. Determina a quali regole DROP viene effettuato il confronto confrontando gli indirizzi IP e le porte di origine e di destinazione con i prefissi e le porte specificati dalle regole iptables.
Se una regola corrispondente mostra un aumento degli scarti con timeout della connessione,
consulta la documentazione di iptables per applicare la regola allow
corretta alle
connessioni appropriate.
$ sudo iptables -L -n -v -x
Questa catena di esempio INPUT mostra che i pacchetti da qualsiasi indirizzo IP a qualsiasi indirizzo IP che utilizza la porta TCP di destinazione 5000
verranno scartati al firewall.
La colonna pkts indica che la regola ha eliminato 10342 pacchetti. Come
test, se crei connessioni che vengono ignorate da questa regola, vedrai
l'aumento del contatore pkts, a conferma del comportamento.
Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 10342 2078513 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:5000
Puoi aggiungere una regola in entrata o in uscita a iptables con i seguenti comandi:
Regola in entrata:
$ sudo iptables -A INPUT -p tcp -s SOURCE_IP_PREFIX --dport SERVER_PORT -j ACCEPT
Regola in uscita:
$ sudo iptables -A OUTPUT -p tcp -d DEST_IP_PREFIX --dport DEST_PORT -j ACCEPT
Firewall Windows
Verifica in Windows Firewall che la connessione sia consentita per il traffico in uscita dal client e in entrata verso il server. Se una regola blocca il traffico, apporta le correzioni necessarie in Windows Firewall per consentire le connessioni. Puoi anche abilitare il logging di Windows Firewall.
Il comportamento predefinito DENY di Windows Firewall consiste nell'ignorare automaticamente i pacchetti rifiutati, determinando timeout.
Questo comando controlla il server. Per controllare le regole in uscita sulla VM client, modifica il valore -match
in Outbound
.
PS C:\> Get-NetFirewallPortFilter | `
>> Where-Object LocalPort -match "PORT" | `
>> Get-NetFirewallRule | `
>> Where-Object {$_.Direction -match "Inbound" -and $_.Profile -match "Any"}
Name : {80D79988-C7A5-4391-902D-382369B4E4A3} DisplayName : iperf3 udp Description : DisplayGroup : Group : Enabled : True Profile : Any Platform : {} Direction : Inbound Action : Allow EdgeTraversalPolicy : Block LooseSourceMapping : False LocalOnlyMapping : False Owner : PrimaryStatus : OK Status : The rule was parsed successfully from the store. (65536) EnforcementStatus : NotApplicable PolicyStoreSource : PersistentStore PolicyStoreSourceType : Local
Puoi aggiungere nuove regole firewall a Windows con i comandi seguenti.
Regola in uscita:
PS C:\> netsh advfirewall firewall add rule name="My Firewall Rule" dir=out action=allow protocol=TCP remoteport=DEST_PORT
Regola in entrata:
PS C:\> netsh advfirewall firewall add rule name="My Firewall Rule" dir=in action=allow protocol=TCP localport=PORT
Software di terze parti
Anche i firewall delle applicazioni o i software antivirus di terze parti possono interrompere o rifiutare connessioni. Consulta la documentazione fornita dal fornitore.
Se riscontri un problema con le regole firewall e lo correggi, ripeti il test della connettività. Se non sembra che le regole firewall siano il problema, vai a Verificare la configurazione del routing del sistema operativo.
Controlla la configurazione del routing del sistema operativo
I problemi di routing del sistema operativo possono verificarsi in una delle seguenti situazioni:
- I problemi di routing sono più comuni sulle VM con più interfacce di rete
- Su una VM creata in Google Cloud con una singola interfaccia di rete, i problemi di routing di solito si verificano solo se qualcuno ha modificato manualmente la tabella di routing predefinita
- Su una VM di cui è stata eseguita la migrazione da on-premise, la VM potrebbe trasferire le impostazioni di routing o di MTU necessarie on-premise, ma che causano problemi nella rete VPC
Se utilizzi una VM con più interfacce di rete, le route devono essere configurate per il traffico in uscita verso la subnet vNIC e la subnet corrette. Ad esempio, una VM potrebbe avere route configurate in modo che il traffico destinato alle subnet interne venga inviato a una vNIC, ma il gateway predefinito (destinazione 0.0.0.0/0
) è configurato su un'altra vNIC che ha un indirizzo IP esterno o accesso a Cloud NAT.
Puoi rivedere le route controllando le singole route una alla volta o visualizzando l'intera tabella di routing delle VM. Se uno dei due approcci rivela problemi con la tabella di routing, consulta i passaggi in Aggiornare le tabelle di routing se necessario per le istruzioni.
Rivedi tutti i percorsi
Elenca tutte le route per capire quali sono già presenti sulla tua VM.
Linux
$ ip route show table all
default via 10.3.0.1 dev ens4 10.3.0.1 dev ens4 scope link local 10.3.0.19 dev ens4 table local proto kernel scope host src 10.3.0.19 broadcast 10.3.0.19 dev ens4 table local proto kernel scope link src 10.3.0.19 broadcast 127.0.0.0 dev lo table local proto kernel scope link src 127.0.0.1 local 127.0.0.0/8 dev lo table local proto kernel scope host src 127.0.0.1 local 127.0.0.1 dev lo table local proto kernel scope host src 127.0.0.1 broadcast 127.255.255.255 dev lo table local proto kernel scope link src 127.0.0.1 ::1 dev lo proto kernel metric 256 pref medium fe80::/64 dev ens4 proto kernel metric 256 pref medium local ::1 dev lo table local proto kernel metric 0 pref medium local fe80::4001:aff:fe03:13 dev ens4 table local proto kernel metric 0 pref medium multicast ff00::/8 dev ens4 table local proto kernel metric 256 pref medium
Windows
PS C:\> Get-NetRoute
ifIndex DestinationPrefix NextHop RouteMetric ifMetric PolicyStore ------- ----------------- ------- ----------- -------- ----------- 4 255.255.255.255/32 0.0.0.0 256 5 ActiveStore 1 255.255.255.255/32 0.0.0.0 256 75 ActiveStore 4 224.0.0.0/4 0.0.0.0 256 5 ActiveStore 1 224.0.0.0/4 0.0.0.0 256 75 ActiveStore 4 169.254.169.254/32 0.0.0.0 1 5 ActiveStore 1 127.255.255.255/32 0.0.0.0 256 75 ActiveStore 1 127.0.0.1/32 0.0.0.0 256 75 ActiveStore 1 127.0.0.0/8 0.0.0.0 256 75 ActiveStore 4 10.3.0.255/32 0.0.0.0 256 5 ActiveStore 4 10.3.0.31/32 0.0.0.0 256 5 ActiveStore 4 10.3.0.1/32 0.0.0.0 1 5 ActiveStore 4 10.3.0.0/24 0.0.0.0 256 5 ActiveStore 4 0.0.0.0/0 10.3.0.1 0 5 ActiveStore 4 ff00::/8 :: 256 5 ActiveStore 1 ff00::/8 :: 256 75 ActiveStore 4 fe80::b991:6a71:ca62:f23f/128 :: 256 5 ActiveStore 4 fe80::/64 :: 256 5 ActiveStore 1 ::1/128 :: 256 75 ActiveStore
Controllare singoli percorsi
Se il problema sembra essere un particolare prefisso IP, verifica che esistano route corrette per gli IP di origine e di destinazione all'interno delle VM client e server.
Linux
$ ip route get DEST_IP
Risultato positivo:
Viene mostrato un percorso valido. In questo caso, i pacchetti in uscita dall'interfaccia ens4
.
10.3.0.34 via 10.3.0.1 dev ens4 src 10.3.0.26 uid 1000 cache
Risultato negativo:
Questo risultato conferma che i pacchetti vengono eliminati perché non esiste un percorso per la rete di destinazione. Verifica che la tabella delle route contenga un percorso all'interfaccia in uscita corretta.
**RTNETLINK answers: Network is unreachable
Windows
PS C:\> Find-NetRoute -RemoteIpAddress "DEST_IP"
Risultato positivo:
IPAddress : 192.168.0.2 InterfaceIndex : 4 InterfaceAlias : Ethernet AddressFamily : IPv4 Type : Unicast PrefixLength : 24 PrefixOrigin : Dhcp SuffixOrigin : Dhcp AddressState : Preferred ValidLifetime : 12:53:13 PreferredLifetime : 12:53:13 SkipAsSource : False PolicyStore : ActiveStore Caption : Description : ElementName : InstanceID : ;:8=8:8:9<>55>55:8:8:8:55; AdminDistance : DestinationAddress : IsStatic : RouteMetric : 256 TypeOfRoute : 3 AddressFamily : IPv4 CompartmentId : 1 DestinationPrefix : 192.168.0.0/24 InterfaceAlias : Ethernet InterfaceIndex : 4 InterfaceMetric : 5 NextHop : 0.0.0.0 PreferredLifetime : 10675199.02:48:05.4775807 Protocol : Local Publish : No State : Alive Store : ActiveStore ValidLifetime : 10675199.02:48:05.4775807 PSComputerName : ifIndex : 4
Risultato negativo:
Find-NetRoute : The network location cannot be reached. For information about network troubleshooting, see Windows Help.
At line:1 char:1
+ Find-NetRoute -RemoteIpAddress "192.168.0.4"
+ ----------------------------------------
+ CategoryInfo : NotSpecified: (MSFT_NetRoute:ROOT/StandardCimv2/MSFT_NetRoute) [Find-NetRoute], CimException
+ FullyQualifiedErrorId : Windows System Error 1231,Find-NetRoute
Questo comando conferma che i pacchetti vengono eliminati perché non esiste un percorso per l'indirizzo IP di destinazione. Verifica di disporre di un gateway predefinito e che quest'ultimo sia applicato alla rete e a vNIC corretti.
Aggiorna tabelle di routing
Se necessario, puoi aggiungere un percorso alla tabella delle route del tuo sistema operativo. Prima di eseguire un comando per aggiornare la tabella di routing della VM di routing, ti consigliamo di acquisire familiarità con i comandi e sviluppare una comprensione delle possibili implicazioni. L'uso improprio dei comandi di aggiornamento delle route potrebbe causare problemi imprevisti o la disconnessione dalla VM. Valuta la possibilità di configurare l'accesso alla console seriale VM prima di procedere.
Consulta la documentazione del tuo sistema operativo per istruzioni sull'aggiornamento dei percorsi.
Se riscontri un problema con i percorsi e lo correggi, ripeti la connessione. Se non sembrano essere le route come il problema, vai a Verificare l'MTU dell'interfaccia.
Controlla MTU
La MTU dell'interfaccia di una VM deve corrispondere alla MTU della rete VPC a cui è collegata. Idealmente, anche le VM che comunicano tra loro hanno MTU corrispondenti. MTU non corrispondenti in genere non rappresentano un problema per TCP, ma possono esserlo per UDP.
Controlla la MTU del VPC. Se le VM si trovano in due reti diverse, controllale entrambe.
gcloud compute networks describe NET_NAME --format="table(name,mtu)"
Verifica la configurazione della MTU per le interfacce di rete di client e server.
Linux
$ netstat -i
L'interfaccia lo (loopback) ha sempre una MTU di 65536 e può essere ignorata per questo passaggio.
Kernel Interface table Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg ens4 1460 8720854 0 0 0 18270406 0 0 0 BMRU lo 65536 53 0 0 0 53 0 0 0 LRU
Windows
PS C:\> Get-NetIpInterface
Le pseudo-interfacce di loopback hanno sempre una MTU di 4294967295 e possono essere ignorate per questo passaggio.
ifIndex InterfaceAlias Address NlMtu(Bytes) Interface Dhcp Connection PolicyStore Family Metric State ------- -------------- ------- ------------ --------- ---- ---------- ----------- 4 Ethernet IPv6 1500 5 Enabled Connected ActiveStore 1 Loopback Pseudo-Interface 1 IPv6 4294967295 75 Disabled Connected ActiveStore 4 Ethernet IPv4 1460 5 Enabled Connected ActiveStore 1 Loopback Pseudo-Interface 1 IPv4 4294967295 75 Disabled Connected Active
Se le MTU dell'interfaccia e della rete non corrispondono, riconfigurare l'MTU dell'interfaccia. Per ulteriori informazioni, consulta Impostazioni di VM e MTU. Se corrispondono e se hai seguito i passaggi per la risoluzione dei problemi fin qui, è probabile che il problema riguardi il server stesso. Per indicazioni sulla risoluzione dei problemi del server, vai all'articolo Controllare il logging del server per informazioni sul comportamento del server.
Controlla il logging del server per informazioni sul comportamento del server
Se i passaggi precedenti non risolvono un problema, è possibile che i timeout siano causati dall'applicazione. Controlla i log del server e delle applicazioni per verificare che non ci siano comportamenti che potrebbero spiegare ciò che viene visualizzato.
Sorgenti di log da controllare:
- Cloud Logging per la VM
- Log seriali delle VM
- syslog e kern.log di Linux o il visualizzatore eventi di Windows
Se i problemi persistono
Se i problemi persistono, consulta Assistenza per i passaggi successivi. È utile avere a disposizione i risultati dei passaggi di risoluzione dei problemi precedenti per condividerli con altri collaboratori.
Risolvere i problemi di latenza o perdita di rete che causano problemi di velocità effettiva
I problemi di latenza o perdita di rete sono in genere causati da esaurimento delle risorse o colli di bottiglia all'interno di una VM o di un percorso di rete. A volte, la perdita di rete può causare timeout della connessione intermittente. Cause come l'esaurimento della vCPU o la saturazione di vNIC portano a un aumento della latenza e alla perdita di pacchetti, con una riduzione delle prestazioni di rete.
Le seguenti istruzioni presuppongono che il timeout delle connessioni non sia costante e che tu stia riscontrando problemi di capacità o prestazioni limitate. Se visualizzi una perdita di pacchetti completa, consulta Risolvere i problemi di connessione completa.
Sono normali variazioni minime della latenza, ad esempio latenze che variano di alcuni millisecondi. Le latenze variano a causa del carico di rete o dell'accodamento all'interno della VM.
Determinare i valori della connessione
Innanzitutto, raccogli le seguenti informazioni:
- Dalla pagina Istanze VM, raccogli quanto segue per entrambe le VM:
- Nomi VM
- Zone VM
- Indirizzi IP interni per le vNIC che comunicano
- Dalla configurazione del software del server di destinazione, raccogli le seguenti informazioni:
- Protocollo di livello 4
- Porta di destinazione
Se riscontri problemi con più VM, scegli una singola VM di origine e di destinazione singola che presentano problemi e utilizza questi valori. In generale, la porta di origine della connessione non dovrebbe essere necessaria.
Una volta raccolte queste informazioni, vai a Esaminare i problemi relativi alla rete Google sottostante.
Esamina i problemi relativi alla rete Google sottostante
Se la tua configurazione è esistente e non è stata modificata di recente, il problema potrebbe riguardare la rete Google sottostante. Controlla il Performance Dashboard di Network Intelligence Center per verificare la perdita di pacchetti tra le zone delle VM. Se si verifica un aumento della perdita di pacchetti tra le zone durante il periodo di tempo in cui si sono verificati timeout di rete, questo potrebbe indicare che il problema riguarda la rete fisica sottostante la rete virtuale. Controlla la Dashboard dello stato di Google Cloud per verificare la presenza di problemi noti prima di inviare una richiesta di assistenza.
Se il problema non sembra riguardare la rete Google sottostante, vai alla sezione Controllare la latenza dell'handshake.
Controlla la latenza dell'handshake
Tutti i protocolli basati sulla connessione presentano una certa latenza durante l'esecuzione dell'handshake di configurazione della connessione. Ogni handshake di protocollo si aggiunge all'overhead. Per le connessioni SSL/TLS, ad esempio, l'handshake TCP deve essere completato prima che l'handshake SSL/TLS possa iniziare; l'handshake TLS deve essere completato prima di poter trasmettere i dati.
La latenza dell'handshake nella stessa zona Google Cloud è solitamente trascurabile, ma gli handshake a località distanti in tutto il mondo potrebbero aggiungere ritardi maggiori all'avvio della connessione. Se hai risorse in regioni lontane, puoi verificare se la latenza che vedi è dovuta all'handshake del protocollo.
Linux e Windows 2019
$ curl -o /dev/null -Lvs -w 'tcp_handshake: %{time_connect}s, application_handshake: %{time_appconnect}s' DEST_IP:PORT
tcp_handshake: 0.035489s, application_handshake: 0.051321s
- L'handshake tcp_handshake passa da quando il client invia il pacchetto SYN iniziale a quando il client invia l'ACK dell'handshake TCP.
- application_handshake indica il tempo che intercorre tra il primo pacchetto SYN dell'handshake TCP e il completamento dell'handshake TLS (in genere).
- tempo di handshake aggiuntivo = application_handshake - tcp_handshake
Windows 2012 e 2016
Non disponibile con gli strumenti predefiniti del sistema operativo. Il tempo di round trip ICMP può essere usato come riferimento se le regole firewall lo consentono.
Se la latenza è superiore a quella degli handshake, vai a Determinare la velocità effettiva massima del tuo tipo di VM.
Determina la velocità effettiva massima del tuo tipo di VM
La velocità effettiva di uscita dalla rete VM è limitata dall'architettura della CPU della VM e dal numero di vCPU. Per determinare la larghezza di banda in uscita potenziale della VM, consulta la pagina Larghezza di banda di rete.
Se la tua VM non è in grado di soddisfare i requisiti in uscita, valuta la possibilità di eseguire l'upgrade a una VM con capacità maggiore. Per le istruzioni, consulta Modificare il tipo di macchina di un'istanza.
Se il tipo di macchina deve consentire una larghezza di banda in uscita sufficiente, verifica se l'utilizzo Persistent Disk interferisce con il traffico in uscita dalla rete. Le operazioni del Persistent Disk possono occupare fino al 60% della velocità effettiva di rete totale della tua VM. Per determinare se le operazioni Persistent Disk potrebbero interferire con la velocità effettiva di rete, consulta Controllare le prestazioni del disco permanente.
Il traffico di rete in entrata verso una VM non è limitato dalla rete VPC o dal tipo di istanza VM. Viene invece determinato dalle prestazioni di accodamento e elaborazione dei pacchetti del sistema operativo o dell'applicazione della VM. Se la larghezza di banda in uscita è adeguata, ma riscontri problemi di traffico in entrata, consulta Controllare il logging del server per informazioni sul comportamento del server.
Controlla la MTU dell'interfaccia
La MTU di una rete VPC è configurabile. La MTU dell'interfaccia della VM deve corrispondere al valore della MTU per la rete VPC a cui è collegata. In una situazione di peering di rete VPC, le VM in reti diverse possono avere MTU diverse. Quando si verifica questo scenario, applica il valore MTU più basso alle interfacce associate. Le mancate corrispondenze delle MTU in genere non sono un problema per TCP, ma possono esserlo per UDP.
Controlla la MTU del VPC. Se le VM si trovano in due reti diverse, controllale entrambe.
gcloud compute networks describe NET_NAME --format="table(name,mtu)"
Verifica la configurazione della MTU per l'interfaccia di rete.
Linux
L'interfaccia lo (loopback) ha sempre una MTU di 65536 e può essere ignorata per questo passaggio.
$ netstat -i
Kernel Interface table Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg ens4 1460 8720854 0 0 0 18270406 0 0 0 BMRU lo 65536 53 0 0 0 53 0 0 0 LRU
Windows
PS C:\> Get-NetIpInterface
Le pseudo-interfacce di loopback hanno sempre una MTU di 4294967295 e possono essere ignorate per questo passaggio.
ifIndex InterfaceAlias Address NlMtu(Bytes) Interface Dhcp Connection PolicyStore Family Metric State ------- -------------- ------- ------------ --------- ---- ---------- ----------- 4 Ethernet IPv6 1500 5 Enabled Connected ActiveStore 1 Loopback Pseudo-Interface 1 IPv6 4294967295 75 Disabled Connected ActiveStore 4 Ethernet IPv4 1460 5 Enabled Connected ActiveStore 1 Loopback Pseudo-Interface 1 IPv4 4294967295 75 Disabled Connected Active
Se le MTU dell'interfaccia e della rete non corrispondono, riconfigurare l'MTU dell'interfaccia. Per istruzioni sull'aggiornamento della MTU per le VM Windows, consulta Impostazioni di VM e MTU. Se corrispondono, il problema potrebbe essere la disponibilità del server. Il passaggio successivo consiste nel controllare i log per verificare se una VM è stata riavviata, arrestata o eseguita la migrazione live per vedere se è successo qualcosa alla VM durante il periodo pertinente.
Controlla i log per verificare se una VM è stata riavviata, arrestata o eseguita la migrazione live
Durante il ciclo di vita di una VM, una VM può essere riavviata dall'utente, sottoposta a migrazione live per la manutenzione di Google Cloud o, in rari casi, potrebbe essere persa e ricreata in caso di errore all'interno dell'host fisico contenente la VM. Questi eventi potrebbero causare un breve aumento della latenza o dei timeout della connessione. Se si verifica una di queste situazioni, l'evento viene registrato.
Per visualizzare i log per la tua VM, segui questi passaggi:
Nella console Google Cloud, vai alla pagina Logging.
Scegli il periodo di tempo in cui si è verificata la latenza.
Utilizza la seguente query di Logging per determinare se si è verificato un evento VM in prossimità del periodo di tempo in cui si è verificata la latenza:
resource.labels.instance_id:"INSTANCE_NAME" resource.type="gce_instance" ( protoPayload.methodName:"compute.instances.hostError" OR protoPayload.methodName:"compute.instances.OnHostMaintenance" OR protoPayload.methodName:"compute.instances.migrateOnHostMaintenance" OR protoPayload.methodName:"compute.instances.terminateOnHostMaintenance" OR protoPayload.methodName:"compute.instances.stop" OR protoPayload.methodName:"compute.instances.reset" OR protoPayload.methodName:"compute.instances.automaticRestart" OR protoPayload.methodName:"compute.instances.guestTerminate" OR protoPayload.methodName:"compute.instances.instanceManagerHaltForRestart" OR protoPayload.methodName:"compute.instances.preempted" )
Se le VM non vengono riavviate o non vengono migrate nel periodo opportuno, il problema potrebbe essere l'esaurimento delle risorse. Per verificare, vai a Controllare le statistiche di rete e del sistema operativo per gli scarti di pacchetti a causa dell'esaurimento delle risorse.
Controllare le statistiche di rete e del sistema operativo per gli scarti di pacchetti a causa dell'esaurimento delle risorse
Esaurimento delle risorse è un termine generico che indica che ad alcune risorse sulla VM, come la larghezza di banda in uscita, viene richiesto di gestire più risorse di quante possono. L'esaurimento delle risorse può causare l'eliminazione periodica dei pacchetti, causando latenza o timeout della connessione. Questi timeout potrebbero non essere visibili all'avvio del client o del server, ma potrebbero apparire nel tempo quando un sistema esaurisce le risorse.
Di seguito è riportato un elenco di comandi che visualizzano i contatori e le statistiche dei pacchetti. Alcuni di questi comandi duplicano i risultati di altri. In questi casi, puoi utilizzare il comando che funziona meglio per te. Consulta le note di ogni sezione per comprendere meglio il risultato previsto dell'esecuzione del comando. Può essere utile eseguire i comandi in momenti diversi per vedere se gli annullamenti o gli errori si verificano contemporaneamente al problema.
Linux
Utilizza il comando
netstat
per visualizzare le statistiche di rete.$ netstat -s
TcpExt: 341976 packets pruned from receive queue because of socket buffer overrun 6 ICMP packets dropped because they were out-of-window 45675 TCP sockets finished time wait in fast timer 3380 packets rejected in established connections because of timestamp 50065 delayed acks sent
Il comando netstat restituisce le statistiche di rete contenenti i valori dei pacchetti scartati per protocollo. I pacchetti eliminati potrebbero essere il risultato dell'esaurimento delle risorse da parte dell'applicazione o dell'interfaccia di rete. Visualizza il motivo del contatore per indicare il motivo per cui un contatore è stato incrementato.
Verifica in kern.log i log corrispondenti a
nf_conntrack: table full, dropping packet
.Debian:
cat /var/log/kern.log | grep "dropping packet"
CentOS:
sudo cat /var/log/dmesg | grep "dropping packet"
Questo log indica che la tabella di monitoraggio delle connessioni per la VM ha raggiunto il numero massimo di connessioni tracciabili. Ulteriori connessioni da e verso questa VM potrebbero scadere. Se la connettività è stata abilitata, il numero massimo di connessioni può essere trovato con:
sudo sysctl net.netfilter.nf_conntrack_max
Puoi aumentare il valore del numero massimo di connessioni monitorate modificando sysctl
net.netfilter.nf_conntrack_max
o distribuendo un carico di lavoro delle VM su più VM per ridurre il carico.
UI Windows
Perfmon
- Utilizzando il menu di Windows, cerca "perfmon" e apri il programma.
- Nel menu a sinistra, seleziona Performance > Strumenti di monitoraggio > Performance Monitor.
- Nella visualizzazione principale, fai clic sul segno più "+" verde per aggiungere contatori del rendimento al grafico di monitoraggio. I seguenti contatori sono interessanti:
- Adattatore di rete
- Lunghezza coda di output
- Pacchetti in uscita ignorati
- Errori in uscita dei pacchetti
- Pacchetti ricevuti eliminati
- Errori relativi ai pacchetti ricevuti
- Pacchetti ricevuti sconosciuti
- Interfaccia di rete
- Lunghezza coda di output
- Pacchetti in uscita ignorati
- Errori in uscita dei pacchetti
- Pacchetti ricevuti eliminati
- Errori relativi ai pacchetti ricevuti
- Pacchetti ricevuti sconosciuti
- Attività della scheda interfaccia di rete per processore
- Indicazioni di ricezione al secondo di risorse scarse
- Pacchetti ricevuti con poche risorse al secondo
- Processore
- % tempo di interruzione
- % di ora con privilegi
- % tempo di elaborazione
- % tempo utente
- Adattatore di rete
Pefmon consente di tracciare i contatori precedenti su un grafico delle serie temporali. Può essere utile monitorare quando i test vengono eseguiti o è interessato un server. Picchi nei contatori relativi alla CPU, come il tempo di interruzione e il tempo con privilegi, possono indicare problemi di saturazione quando la VM raggiunge i limiti di velocità effettiva della CPU. Gli errori dei pacchetti possono verificarsi quando la CPU è satura, il che forza la perdita dei pacchetti prima di essere elaborati dai socket del client o del server. Infine, la lunghezza della coda di output aumenta anche durante la saturazione della CPU, man mano che vengono messi in coda più pacchetti per l'elaborazione.
Windows PowerShell
PS C:\> netstat -s
IPv4 Statistics Packets Received = 56183 Received Header Errors = 0 Received Address Errors = 0 Datagrams Forwarded = 0 Unknown Protocols Received = 0 Received Packets Discarded = 25 Received Packets Delivered = 56297 Output Requests = 47994 Routing Discards = 0 Discarded Output Packets = 0 Output Packet No Route = 0 Reassembly Required = 0 Reassembly Successful = 0 Reassembly Failures = 0 Datagrams Successfully Fragmented = 0 Datagrams Failing Fragmentation = 0 Fragments Created = 0
Il comando netstat restituisce le statistiche di rete contenenti i valori dei pacchetti scartati per protocollo. I pacchetti eliminati potrebbero essere il risultato dell'esaurimento delle risorse da parte dell'applicazione o dell'interfaccia di rete.
Se noti un esaurimento delle risorse, puoi provare a distribuire il carico di lavoro su più istanze, eseguire l'upgrade della VM a una con più risorse, ottimizzare il sistema operativo o l'applicazione per esigenze di prestazioni specifiche, inserire il messaggio di errore in un motore di ricerca per cercare possibili soluzioni oppure chiedere assistenza utilizzando uno dei metodi descritti in Se continui a riscontrare problemi.
Se il problema non sembra essere l'esaurimento delle risorse, il problema potrebbe riguardare il software server stesso. Per indicazioni sulla risoluzione dei problemi relativi al software server, consulta Controllare il logging del server per informazioni sul comportamento del server.
Controlla il logging del server per informazioni sul comportamento del server
Se i passaggi precedenti non rivelano alcun problema, i timeout potrebbero essere causati dal comportamento dell'applicazione, ad esempio gli arresti anomali causati dall'esaurimento delle vCPU. Controlla i log del server e delle applicazioni per verificare se il comportamento stai riscontrando.
Ad esempio, un server che riscontra una latenza maggiore a causa di un sistema upstream, come un database sotto carico, potrebbe mettere in coda una quantità eccessiva di richieste, che possono causare un aumento dell'utilizzo della memoria e dei tempi di attesa della CPU. Questi fattori potrebbero causare connessioni non riuscite o un sovraccarico del buffer socket.
Le connessioni TCP a volte perdono un pacchetto, ma la conferma selettiva e la ritrasmissione dei pacchetti di solito recuperano i pacchetti persi, evitando il timeout della connessione. Considera invece che i timeout potrebbero essere il risultato di un errore o di un nuovo deployment del server delle applicazioni, che ha causato un errore temporaneo per le connessioni.
Se l'applicazione server si basa su una connessione a un database o a un altro servizio, verifica che i servizi accoppiati non abbiano prestazioni scadenti. La tua applicazione potrebbe monitorare queste metriche.
Se i problemi persistono
Se i problemi persistono, consulta Assistenza per i passaggi successivi. È utile avere a disposizione il risultato dei passaggi di risoluzione dei problemi da condividere con altri collaboratori.
Passaggi successivi
- Se continui a riscontrare problemi, consulta la pagina Risorse.