天天看點

ubuntu系統設定固定ip_WSL2配置公網連結與固定别名

前言

今天為了測試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是每次重新開機都會變的。

這裡的解決方案為

  1. 編寫windows腳本每次重新開機來擷取wsl2的内部ip并且寫入到windows的hosts中。
  2. 利用某位老哥的go腳本,老哥的go腳本實際原理還是用的1的方案,最後的解決方案變成了

    netsh interface portproxy add v4tov4 listenport=8080 connectaddress=ubuntu.wsl connectport=8080 listenaddress=* protocol=tcp

    也就是ubuntu.wsl為寫入到hosts中的位址 。。。。

go腳本自動擷取内部ip

go-wsl2-host

這個腳本主要的用處為 每次重新開機擷取内部ip 并且會寫入到windows的hosts中 這樣以後在windows需要轉發某些端口的時候直接轉發到hosts的别名就行了,不過需要管理者權限才能運作,并且會常駐windows的啟動任務中

ubuntu系統設定固定ip_WSL2配置公網連結與固定别名

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