前言
近期因爲win10 2004要發佈(自裝了一臺新電腦),所以更新了預覽版提前體驗了下wsl2,在使用docker跑一個簡單的ngnix時發現只有宿主機使用localhost可以用瀏覽器打開對應的ngnix界面,而內網內其他電腦則沒辦法使用宿主機內網ip訪問ngnix界面,而這一點在wsl1中是支持的。在幾番查找資料後發現大多解決方法都無效或者過於簡單,最後在github上找到了一個自認爲相對完美的解決方案,現對這個方案進行一下記錄。這裏只記錄解決方法具體造成這種情況的原因解釋的文章有很多了。
簡單的能讓內網訪問wsl2
佈置測試環境
- wsl2內使用docker佈置ngnix
- 宿主機訪問
- 內網訪問
獲取虛擬機ip及端口轉發
因爲每次都會用wsl2虛擬機分配一個ip所以使用windows自帶的端口轉發命令netsh可以實現在獲取了虛擬機ip之後轉發至wsl2進而進行訪問。
-
獲得虛擬機ip
如圖所示虛擬機ip爲172.19.25.67(每次啓動都會變) -
設置端口轉發(需要管理員權限運行)
interface portproxy add v4tov4 listenport=【宿主機windows平臺監聽端口】 listenaddress=0.0.0.0 connectport=【wsl2平臺監聽端口】 connectaddress=【wsl2平臺ip】
各項參數需根據實際情況進行調整
然後查看下端口轉發狀態:netsh interface portproxy show all
如圖所示端口轉發成功。 -
測試內網訪問
內網訪問成功 -
刪除端口轉發
netsh interface portproxy delete v4tov4 listenport=【宿主機windows平臺監聽端口】 listenaddress=0.0.0.0
使用腳本每次啓動時進行端口轉發
因爲每一次重新啓動 wsl2的ip都會變動,所以每一次重啓都去手動執行端口轉發是一件反人類的事情,我在github上找到一個powershell的腳本能夠每一次獲取虛擬機ip,並進行指定端口轉發。同時有看到一個用go語言做類似功能的,但是由於還需要其它非系統原生支持相對比較繁瑣,所以沒有嘗試。
配置腳本
腳本代碼如下:
更改ports=@ 對應的端口即可
$remoteport = bash.exe -c "ifconfig eth0 | grep 'inet '"
$found = $remoteport -match '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}';
if( $found ){
$remoteport = $matches[0];
} else{
echo "The Script Exited, the ip address of WSL 2 cannot be found";
exit;
}
#[Ports]
#All the ports you want to forward separated by coma
$ports=@(9696);
#[Static ip]
#You can change the addr to your ip config to listen to a specific address
$addr='0.0.0.0';
$ports_a = $ports -join ",";
#Remove Firewall Exception Rules
#iex "Remove-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' ";
#adding Exception Rules for inbound and outbound Rules
#iex "New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Outbound -LocalPort $ports_a -Action Allow -Protocol TCP";
#iex "New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Inbound -LocalPort $ports_a -Action Allow -Protocol TCP";
for( $i = 0; $i -lt $ports.length; $i++ ){
$port = $ports[$i];
iex "netsh interface portproxy delete v4tov4 listenport=$port listenaddress=$addr";
iex "netsh interface portproxy add v4tov4 listenport=$port listenaddress=$addr connectport=$port connectaddress=$remoteport";
}
1.將腳本保存爲 xxxx.ps1
2.使用cmd調用powershell運行腳本,首次執行可能會有報錯,因爲powershell默認不能直接執行腳本,需要更改一個設置,需在powershell下執行
Set-ExecutionPolicy RemoteSigned
使之可以執行ps1腳本。
3.執行netsh interface portproxy show all 查看端口
配置任務計劃
- win+r 鍵入taskschd.msc 打開任務計劃
- 創建任務
- 進行配置(如圖所示)
填寫名稱並隱藏
用戶登錄時觸發,延遲10s執行
執行的操作爲 powershell,將腳本完整路徑作爲參數
其它一些配置根據自己實際情況進行修改,比如是不是使用筆記本一類的。
(完)