WSL2設置內網訪問

前言

近期因爲win10 2004要發佈(自裝了一臺新電腦),所以更新了預覽版提前體驗了下wsl2,在使用docker跑一個簡單的ngnix時發現只有宿主機使用localhost可以用瀏覽器打開對應的ngnix界面,而內網內其他電腦則沒辦法使用宿主機內網ip訪問ngnix界面,而這一點在wsl1中是支持的。在幾番查找資料後發現大多解決方法都無效或者過於簡單,最後在github上找到了一個自認爲相對完美的解決方案,現對這個方案進行一下記錄。這裏只記錄解決方法具體造成這種情況的原因解釋的文章有很多了。

簡單的能讓內網訪問wsl2

佈置測試環境

  1. wsl2內使用docker佈置ngnix
    在這裏插入圖片描述
  2. 宿主機訪問
    在這裏插入圖片描述
  3. 內網訪問
    在這裏插入圖片描述

獲取虛擬機ip及端口轉發

因爲每次都會用wsl2虛擬機分配一個ip所以使用windows自帶的端口轉發命令netsh可以實現在獲取了虛擬機ip之後轉發至wsl2進而進行訪問。

  1. 獲得虛擬機ip
    在這裏插入圖片描述
    如圖所示虛擬機ip爲172.19.25.67(每次啓動都會變)

  2. 設置端口轉發(需要管理員權限運行)

      interface portproxy add v4tov4 listenport=【宿主機windows平臺監聽端口】 listenaddress=0.0.0.0 connectport=【wsl2平臺監聽端口】 connectaddress=【wsl2平臺ip】
    

    在這裏插入圖片描述
    各項參數需根據實際情況進行調整
    然後查看下端口轉發狀態:

    netsh interface portproxy show all
    

    在這裏插入圖片描述
    如圖所示端口轉發成功。

  3. 測試內網訪問
    在這裏插入圖片描述
    內網訪問成功

  4. 刪除端口轉發

    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";
}

索引自 github

1.將腳本保存爲 xxxx.ps1
2.使用cmd調用powershell運行腳本,首次執行可能會有報錯,因爲powershell默認不能直接執行腳本,需要更改一個設置,需在powershell下執行

 Set-ExecutionPolicy RemoteSigned

使之可以執行ps1腳本。
3.執行netsh interface portproxy show all 查看端口

在這裏插入圖片描述
在這裏插入圖片描述

配置任務計劃

  1. win+r 鍵入taskschd.msc 打開任務計劃
  2. 創建任務
  3. 進行配置(如圖所示)
    在這裏插入圖片描述
    填寫名稱並隱藏
    在這裏插入圖片描述
    用戶登錄時觸發,延遲10s執行
    在這裏插入圖片描述執行的操作爲 powershell,將腳本完整路徑作爲參數
    在這裏插入圖片描述
    在這裏插入圖片描述
    其它一些配置根據自己實際情況進行修改,比如是不是使用筆記本一類的。

(完)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章