Accesso alle applicazioni di rete con WSL

Quando si lavora con le app di rete e WSL, è necessario tenere presenti alcune considerazioni. Per impostazione predefinita, WSL usa un'architettura basata su NAT ed è consigliabile provare la nuova modalità di rete con mirroring per ottenere le funzionalità e i miglioramenti più recenti.

Modalità di rete predefinita: NAT

Per impostazione predefinita, WSL usa un'architettura basata su NAT (Network Address Translation) per la rete. Quando si lavora con un'architettura di rete basata su NAT, tenere presenti le considerazioni seguenti:

Accesso alle app di rete Linux da Windows (localhost)

Se stai creando un'app di rete (ad esempio un'app in esecuzione su un server NodeJS o su SQL Server) nella distribuzione Linux, puoi accedervi da un'app di Windows (come il browser Internet Edge o Chrome) usando localhost, proprio come faresti normalmente.

Accesso alle app di rete Windows da Linux (IP host)

Se vuoi accedere a un'app di rete in esecuzione in Windows (ad esempio su un server NodeJS o su SQL Server) dalla distribuzione Linux (ovvero Ubuntu), devi usare l'indirizzo IP del computer host. Anche se non si tratta di uno scenario comune, puoi seguire questa procedura per ottenere il risultato desiderato.

  1. Ottieni l'indirizzo IP del computer host eseguendo questo comando dalla distribuzione Linux: ip route show | grep -i default | awk '{ print $3}'
  2. Connettiti a un server Windows usando l'indirizzo IP copiato.

Nell'immagine seguente viene illustrato un esempio di questa procedura con la connessione a un server Node.js in esecuzione in Windows tramite curl.

Connettiti al server NodeJS in Windows tramite Curl

Connessione tramite indirizzi IP remoti

Quando vengono usati indirizzi IP remoti per la connessione alle applicazioni, verranno considerati come connessioni dalla rete locale (LAN). Devi pertanto verificare che l'applicazione possa accettare connessioni LAN.

Potresti ad esempio dover associare l'applicazione a 0.0.0.0 anziché a 127.0.0.1. Ad esempio, in un'app Python con Flask questa operazione può essere eseguita con il comando app.run(host='0.0.0.0'). Tenere presente la sicurezza quando si apportano queste modifiche, in quanto ciò consentirà le connessioni dalla lan.

Accesso a una distribuzione di WSL 2 dalla rete locale (LAN)

Quando viene usata una distribuzione di WSL 1, se il computer è stato configurato per l'accesso dalla rete LAN, anche le applicazioni eseguite in WSL saranno accessibili dalla LAN.

Questo non è il caso predefinito in WSL 2. WSL 2 dispone di una scheda Ethernet virtualizzata con un indirizzo IP univoco. Attualmente, per abilitare questo flusso di lavoro, devi eseguire gli stessi passaggi previsti per una normale macchina virtuale. È in corso uno studio per migliorare questa esperienza.

Nell'esempio seguente il di Windows netsh interface portproxy viene usato per aggiungere un proxy della porta che resta in ascolto sulla porta host e connettere tale proxy di porta all'indirizzo IP della macchina virtuale WSL 2.

netsh interface portproxy add v4tov4 listenport=<yourPortToForward> listenaddress=0.0.0.0 connectport=<yourPortToConnectToInWSL> connectaddress=(wsl hostname -I)

In questo esempio sarà necessario aggiornare <yourPortToForward> inserendo un numero di porta, ad esempio listenport=4000. listenaddress=0.0.0.0 significa che verranno accettate le richieste in ingresso da QUALUNQUE indirizzo IP. Il valore listen address specifica l'indirizzo IPv4 per cui restare in ascolto e può essere modificato in valori che includono: indirizzo IP, nome NetBIOS del computer o nome DNS del computer. Se non viene specificato un indirizzo, il valore predefinito è il computer locale. È necessario aggiornare il valore <yourPortToConnectToInWSL> inserendo il numero della porta a cui si vuole che WSL si connetta, ad esempio connectport=4000. Infine, il valore connectaddress deve essere l'indirizzo IP della distribuzione di Linux installata tramite WSL 2 (l'indirizzo della macchina virtuale WSL 2), che si può trovare immettendo il comando: wsl.exe hostname -I.

Il comando avrà un aspetto simile al seguente:

netsh interface portproxy add v4tov4 listenport=4000 listenaddress=0.0.0.0 connectport=4000 connectaddress=192.168.101.100

Per ottenere l'indirizzo IP, usare:

  • wsl hostname -I per l'indirizzo IP della distribuzione di Linux installata tramite WSL 2 (l'indirizzo della macchina virtuale WSL 2)
  • cat /etc/resolv.conf per l'indirizzo IP del computer Windows come visto da WSL 2 (la macchina virtuale WSL 2)

Usando listenaddress=0.0.0.0 verranno ascoltate tutte le porte IPV4.

Nota

L'uso di un "i" minuscolo con il comando nome host genererà un risultato diverso rispetto all'uso di un carattere "I" maiuscolo. wsl hostname -i è il computer locale (127.0.1.1 è un indirizzo di diagnostica segnaposto), mentre wsl hostname -I restituirà l'indirizzo IP del computer locale come illustrato da altri computer e deve essere usato per identificare la connectaddress distribuzione Linux in esecuzione tramite WSL 2.

Accesso IPv6

  • wsl hostname -i per l'indirizzo IP della distribuzione di Linux installata tramite WSL 2 (l'indirizzo della macchina virtuale WSL 2)
  • ip route show | grep -i default | awk '{ print $3}' per l'indirizzo IP del computer Windows come visto da WSL 2 (la macchina virtuale WSL 2)

Usando listenaddress=0.0.0.0 verranno ascoltate tutte le porte IPV4.

Rete in modalità con mirroring

È possibile impostare networkingMode=mirrored[wsl2] in nel file per abilitare la .wslconfig rete in modalità con mirroring. L'abilitazione di questa modifica di WSL in un'architettura di rete completamente nuova che ha l'obiettivo di "mirroring" delle interfacce di rete disponibili in Windows in Linux, per aggiungere nuove funzionalità di rete e migliorare la compatibilità.

Ecco i vantaggi correnti per abilitare questa modalità:

  • Supporto di IPv6
  • Connessione ai server Windows dall'interno di Linux usando l'indirizzo 127.0.0.1localhost . L'indirizzo ::1 localhost IPv6 non è supportato
  • Miglioramento della compatibilità di rete per vpn
  • Supporto multicast
  • Connessione a WSL direttamente dalla rete locale (LAN)

Nota

Eseguire il comando seguente nella finestra di PowerShell con privilegi di amministratore per configurare le impostazioni del firewall Hyper-V per consentire le connessioni in ingresso: Set-NetFirewallHyperVVMSetting -Name '{40E0AC32-46A5-438A-A0B2-2B479E8F2E90}' -DefaultInboundAction Allow o New-NetFirewallHyperVRule -Name "MyWebServer" -DisplayName "My Web Server" -Direction Inbound -VMCreatorId '{40E0AC32-46A5-438A-A0B2-2B479E8F2E90}' -Protocol TCP -LocalPorts 80.

Questa nuova modalità risolve i problemi di rete riscontrati con l'uso di un'architettura basata su NAT (Network Address Translation). Trovare problemi noti o inviare commenti e suggerimenti su eventuali bug identificati nel repository del prodotto WSL in GitHub.

DNS Tunneling

L'impostazione dnsTunneling=true.wslconfig nel file include WSL che usa una funzionalità di virtualizzazione per rispondere alle richieste DNS da WSL, anziché richiederle tramite un pacchetto di rete.[wsl2] Questa funzionalità è finalizzata a migliorare la compatibilità con vpn e altre set up di rete complesse.

Proxy automatico

[wsl2] L'impostazione .wslconfigautoProxy=truein nel file impone a WSL di usare le informazioni sul proxy HTTP di Windows. Se è già stato configurato un proxy in Windows, l'abilitazione di questa funzionalità renderà il proxy impostato automaticamente anche in WSL.

WSL e firewall

Nei computer che eseguono Windows 11 22H2 e versioni successive, con WSL 2.0.9 e versioni successive, la funzionalità firewall Hyper-V verrà attivata per impostazione predefinita. Ciò garantisce che:

  • Vedi Windows Defender Firewall con sicurezza avanzata per altre informazioni sulle funzionalità di sicurezza di Windows che verranno applicate automaticamente a WSL.
  • Vedere Configurare il firewall Hyper-V per altre informazioni sull'applicazione di queste regole e impostazioni sia in locale che tramite strumenti online come Intune.