Collegarsi a una macchina WSL dalla rete locale

Come fare per collegarsi a una macchina virtuale Linux in esecuzione con WSL in Windows 10 o in Windows 11 usando un altro PC collegato in rete locale.

Il Sottosistema Windows per Linux (WSL, Windows Subsystem for Linux) permette di eseguire macchine virtuali basate sulle principali distribuzioni del pinguino.
Negli altri nostri articoli abbiamo già visto come eseguire programmi Linux in Windows, anche con interfaccia grafica grazie a WSL 2, componente software sviluppato da Microsoft introdotto in Windows 10 e confermato in Windows 11.

Supponiamo di aver installato una distribuzione Linux come Ubuntu in Windows utilizzando WSL 2: come fare per accedervi da remoto e utilizzare i servizi che espone?
Ipotizziamo ad esempio di avervi installato un server web per fare dei test: come accedervi dagli altri dispositivi collegati alla LAN?

Come raggiungere una macchina Linux in esecuzione con WSL 2 dalla rete locale

Una delle domande ricorrenti quando si parla di WSL 2 e di networking è la possibilità di raggiungere la macchina virtuale dagli altri dispositivi connessi in rete locale.

Posto di aver installato dal Microsoft Store Ubuntu 20.04 LTS in Windows 10 o in Windows 11, digitando nella finestra di WSL il comando ifconfig si può leggere l’indirizzo IP che è stato assegnato all’interfaccia di rete virtuale.
Nell’esempio in figura si vede che l’hypervisor di Windows 10 o Windows 11 ha in questo caso assegnato l’IP locale 172.26.86.48 all’interfaccia di rete della macchina virtuale Linux.

Digitando ad esempio ping 8.8.8.8 in WSL si riceverà risposta dal server DNS di Google (8.8.8.8) a conferma che Ubuntu è correttamente collegato e può uscire sulla rete WAN scambiando dati con host remoti.

Allo stesso modo, premendo Windows+X quindi scegliendo Windows PowerShell oppure Terminale Windows e digitando il comando che segue, si riceverà risposta dalla macchina virtuale Ubuntu in esecuzione con WSL 2 (sostituire ovviamente l’indirizzo IP locale con quello desunto lanciando il comando ifconfig):

ping 172.26.86.48

Come si vede nell’esempio dal sistema Windows si può tranquillamente raggiungere la macchina Linux ospitata in WSL e in esecuzione in tale ambiente.

Lanciando il comando ping e specificando lo stesso indirizzo IP da un altro dispositivo collegato in rete LAN ovviamente non si potrà mai ricevere risposta.

WSL crea un’interfaccia virtuale che per impostazione predefinita permette soltanto al sistema host ovvero alla macchina Windows sulla quale è in esecuzione la distribuzione Linux di colloquiare con essa. Il NAT (Network Address Translation) abilitato da WSL non permette agli altri dispositivi collegati in LAN di accedere alla macchina virtuale.

Supponiamo di installare il server HTTP Apache nella macchina virtuale Linux caricata con WSL. I comandi da eseguire sono quelli illustrati in questa pagina di supporto.

Digitando semplicemente quanto segue in WSL si installa Apache e si fa rispondere il server web sull’IP locale della macchina virtuale Linux con una pagina di cortesia:
sudo apt update
sudo apt install apache2 -y
sudo service apache2 start

Scrivendo http:// seguito dall’indirizzo del browser web della macchina Linux in esecuzione con WSL sullo stesso sistema, si leggerà Apache2 Ubuntu Default Page a conferma che il server web Apache sta correttamente rispondendo sulla porta HTTP 80.

Come fare per raggiungere il server Apache dagli altri dispositivi connessi in rete locale?

Al momento Microsoft non offre gli strumenti per farlo in modo semplice attraverso la configurazione di WSL e delle singole macchine virtuali.
Posto che il nostro obiettivo in questo caso è aprire la porta 80 per l’accesso dagli altri dispositivi connessi in LAN, si può premere Windows+X quindi scegliere Windows PowerShell (amministratore) oppure Terminale Windows (Admin) quindi digitare quanto segue:

netsh interface portproxy add v4tov4 listenport=80 listenaddress=0.0.0.0 connectport=80 connectaddress=172.26.86.48

New-NetFirewallRule -DisplayName "Apache Web Server WSL" -Direction Inbound -LocalPort 80 -Protocol TCP -Action Allow

Al posto di 172.26.86.48 è necessario indicare l’indirizzo IP della macchina virtuale Ubuntu Linux in esecuzione in WSL 2 (nel nostro esempio è appunto 172.26.86.48, come visto in precedenza).
Il primo comando permette di attivare un reindirizzamento dei pacchetti dati ricevuti sulla porta 80 verso l’analoga porta della macchina virtuale; il secondo comando, invece, permette di impostare una regola su Windows Firewall in modo tale che i pacchetti in arrivo sulla porta TCP 80 non vengano bloccati.

Con il comando ipconfig si deve quindi leggere l’indirizzo IP della macchina Windows. Tale indirizzo IP viene assegnato dal router o comunque dal server DHCP presente nella rete locale fisica (leggere quanto compare accanto a Indirizzo IPv4 in corrispondenza di Scheda Ethernet o Scheda LAN Wi-Fi).

Digitando http:// seguito dall’indirizzo IP della macchina Windows che con WSL ospita la macchina virtuale Linux, risponderà il server Apache e mostrerà la pagina Apache2 Ubuntu Default Page.
In questo modo la macchina virtuale e il server in esecuzione potranno essere raggiunti da qualunque dispositivo collegato in rete locale (ed eventualmente anche dalla WAN aprendo la porta in ingresso sul router e configurando il port forwarding).

La stessa operazione può essere ripetuta per qualunque porta e per qualsiasi host virtuale caricato con WSL.
Digitando il comando netsh interface portproxy show all si possono controllare tutte le porte che si sono inoltrate verso le macchine virtuali.
Utilizzando il comando netsh interface portproxy delete v4tov4 listenaddress=0.0.0.0 listenport=PORTA si possono eliminare singole regole di inoltro.

Digitando firewall nella casella di ricerca di Windows, scegliendo Windows Defender Firewall con sicurezza avanzata, cliccando su Regole connessioni in entrata si possono eventualmente cancellare le regole configurate a livello firewall. Nel nostro esempio in elenco si troverà la regola Apache Web Server.

Un buono strumento avanzato per gestire gli IP utilizzati da WSL è lo script PowerShell WSL-IpHandler.

Ti consigliamo anche

Link copiato negli appunti