前言
今天為了測試html,用了nodejs的http-server指令,當然有了WSL那肯定是在WSL2中啟動http-server,啟動後問題就來了,8080端口是無法在區域網路裡通路的,但是windows主控端是可以通過
127.0.0.1:8080
來通路到
WSL2相關
WSL2用的是hyper-v 相當于一個虛拟機,但是在網絡那塊就有點奇怪了,wsl2與windows中會有一個專有的ip。
舉例WSL2專用ip為:
172.31.58.132
,windows的公網ip為:
192.168.167.82
。
那麼問題來了 我wsl2啟動了一個http服務 端口為8080,如何在區域網路中通路它?
一開始想的辦法是讓wsl2直接在區域網路擷取一個新的ip 比如
192.168.167.83
,試着給wsl2用了固定ip後也是不行的,連wsl2本身的網絡都斷開了,看了一下wsl2官方的issue發現官方目前是不支援wsl2直接擷取ip的,v2ex上有老哥試着用網橋來解決這個問題,但是看最後的評論結果還是沒有成功,于是目前的辦法就比較hack了,區域網路機器通路windows主控端,windows主控端轉發端口至wsl2,雖然流程很簡單,網絡上也有老哥給出了解決方案,比較常見的指令就是
netsh interface portproxy add v4tov4 listenport=8080 connectaddress=127.0.0.1 connectport=8080 listenaddress=* protocol=tcp
,但是這段指令還是有個問題我轉發的ip是
127.0.0.1
這裡很明顯轉發到的是windows主控端的ip而不是wsl2的ip。但是有個疑問的點是 windows主控端能夠在浏覽器直接通路
127.0.0.1:8080
來通路到wsl2中的http服務。于是事情就變成了 我轉發到
127.0.0.1
是不行的,必須轉發到wsl2内部ip也就是
172.31.58.132
,這裡的話問題變成了 wsl2的内部ip是每次重新開機都會變的。
這裡的解決方案為
- 編寫windows腳本每次重新開機來擷取wsl2的内部ip并且寫入到windows的hosts中。
- 利用某位老哥的go腳本,老哥的go腳本實際原理還是用的1的方案,最後的解決方案變成了
也就是ubuntu.wsl為寫入到hosts中的位址 。。。。netsh interface portproxy add v4tov4 listenport=8080 connectaddress=ubuntu.wsl connectport=8080 listenaddress=* protocol=tcp
go腳本自動擷取内部ip
go-wsl2-host
這個腳本主要的用處為 每次重新開機擷取内部ip 并且會寫入到windows的hosts中 這樣以後在windows需要轉發某些端口的時候直接轉發到hosts的别名就行了,不過需要管理者權限才能運作,并且會常駐windows的啟動任務中
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5CZ2kzY0QWZiVTMlFTYkZmNwIjNjJDNwkTO5EmN4UTZ28CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
windows自帶的端口轉發指令
netsh interface portproxy add v4tov4 listenport=8080 connectaddress=ubuntu.wsl connectport=8080 listenaddress=* protocol=tcp
比較簡單,listenport為windows需要監聽的端口,connectport為WSL2你的服務端口,如果不用轉發了可以執行删除指令
netsh interface portproxy delete v4tov4 listenport=8080 protocol=tcp