Windows部署WSL自動獲取IP開機自啟
再本地部署了ubuntu20.04,但每次開機IP都是隨機獲取的,嘗試通過固定IP的方式對IP進行固定,但未成功,因此這里選擇采用IP查詢,動態獲取IP,并將IP轉發,內部網絡可以通過IP加端口的形式訪問本機的ubuntu20.04。具體踩坑如下:
1、嘗試固定IP失敗
嘗試方法1:
根據網絡教程,使用 .wslconfig 文件固定本機IP失敗,具體操作如下:
創建配置文件 在 Windows 用戶目錄下創建一個 .wslconfig 文件:
C:\Users<your_username>.wslconfig
添加配置內容 在文件中寫入以下內容
[experimental]
autoMemoryReclaim=gradual
networkingMode=mirrored
dnsTunneling=true
firewall=true
autoProxy=true
重啟 WSL 保存文件后,重啟 WSL 終端:
wsl --shutdown
wsl
驗證 IP 地址 使用 ip addr 命令查看 IP 地址。這里通過查看,每次重啟后wsl的IP地址依然是固定的。
在這里其實有一個tip:在網絡連接中,vEthernet的IP是固定了,后續或許可以從這里入手。這里由于對這塊不熟悉,所以沒有接著做下去。
嘗試方法2:設置固定 IP 腳本
設置 vEthernet 固定 IP 在 Windows 中設置 vEthernet 適配器的固定 IP。
確認 Linux 子系統名稱 打開命令提示符并運行:wsl -l
編寫并執行腳本 創建一個 .bat 文件并寫入以下內容:
@echo off
setlocal enabledelayedexpansion
set "WSL_NAME=Ubuntu"
set "WSL_IP=xxx.xxx.xx.xxx"
netsh interface ip set address name="vEthernet (WSL)" static !WSL_IP! 255.255.255.0
wsl -d !WSL_NAME! -u root -- bash -c "echo nameserver !WSL_IP! > /etc/resolv.conf"
endlocal
運行腳本 雙擊運行該腳本,確保 WSL 的 IP 地址固定。
隨后檢查過防火墻,但依舊無效。
在這里即使我修改為自己的ip,但實際并未有效,在每次重啟wsl的IP依然會發生變化。同樣的在網絡連接中,vEthernet的IP是固定了
3、隨后創建過/etc/systemd/network/00 - wsl2.yaml
并輸入
network:
version: 2
ethernets:
eth0:
dhcp4: no
addresses:
- <靜態IP地址>/<子網掩碼>
gateway4: <網關IP地址>
nameservers:
addresses:
- <DNS服務器IP地址1>
- <DNS服務器IP地址2>
無效,并且網絡也丟失,ping本地ip也斷開了
4、構建bat腳本,動態獲取當前的wsl ip 并設置本機端口轉發,實現連接,具體操作如下
@echo off
chcp 65001 >nul 2>&1
setlocal enabledelayedexpansion
:: 配置參數(請根據實際情況修改)
set "NGINX_PATH=E:\nginx-1.20.2"
set "NGINX_CONF=!NGINX_PATH!\conf\nginx.conf"
set "BACKUP_CONF=!NGINX_CONF!.bak"
set "SSH_WINDOWS_PORT=22223" :: Windows本地映射的SSH端口
set "SSH_WSL_PORT=22" :: WSL中SSH服務實際端口
set "WSL_USER=cadai" :: WSL中的用戶名
:: 1. 獲取WSL的IP地址
echo 正在獲取WSL IP地址...
for /f "tokens=1 delims= " %%a in ('wsl -- hostname -I ^| findstr /r "^[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*"') do (
set "WSL_IP=%%a"
goto :found_ip
)
:found_ip
if "!WSL_IP!"=="" (
echo 錯誤:無法獲取WSL IP地址,請確保WSL已啟動
pause
exit /b 1
)
echo 成功獲取WSL IP:!WSL_IP!
:: 2. 檢查并啟動WSL中的SSH服務
echo 正在檢查WSL中的SSH服務...
wsl sudo service ssh start >nul 2>&1
if %errorlevel% neq 0 (
echo WSL SSH服務未運行,正在啟動...
wsl sudo service ssh start >nul 2>&1
if %errorlevel% equ 0 (
echo WSL SSH服務啟動成功
) else (
echo 錯誤:無法啟動WSL SSH服務,請在WSL中手動執行 'sudo service ssh start' 排查問題
pause
exit /b 1
)
) else (
echo WSL SSH服務已運行
)
echo 正在重置ssh端口
netsh interface portproxy delete v4tov4 listenport=22222 force
netsh interface portproxy delete v4tov4 listenport=22223 force
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=22223 connectaddress=!WSL_IP! connectport=22
echo 正在重置端口成功
echo 正在配置SSH端口轉發...
netsh interface portproxy show v4tov4 | findstr "listenport=!SSH_WINDOWS_PORT!" >nul
if %errorlevel% neq 0 (
netsh interface portproxy delete v4tov4 listenport=!SSH_WINDOWS_PORT! >nul
)
netsh interface portproxy add v4tov4 listenport=!SSH_WINDOWS_PORT! connectaddress=!WSL_IP! connectport=!SSH_WSL_PORT! >nul
if %errorlevel% equ 0 (
echo SSH端口轉發配置成功:localhost:!SSH_WINDOWS_PORT! -> !WSL_IP!:!SSH_WSL_PORT!
) else (
echo 警告:端口轉發配置失敗,可能需要管理員權限
)
echo 正在配置防火墻規則...
netsh advfirewall firewall show rule name="WSL-SSH-Port-!SSH_WINDOWS_PORT!" >nul
if %errorlevel% neq 0 (
netsh advfirewall firewall delete rule name="WSL-SSH-Port-!SSH_WINDOWS_PORT!" >nul
)
netsh advfirewall firewall add rule name="WSL-SSH-Port-!SSH_WINDOWS_PORT!" dir=in action=allow protocol=TCP localport=!SSH_WINDOWS_PORT! >nul
if %errorlevel% equ 0 (
echo 防火墻已允許端口!SSH_WINDOWS_PORT!的入站連接
) else (
echo 警告:防火墻規則配置失敗,可能需要管理員權限
)
echo 正在更新Nginx配置...
if exist "!BACKUP_CONF!" (
copy "!BACKUP_CONF!" "!NGINX_CONF!" >nul
echo 已從備份恢復原始配置
) else (
:: 如果沒有備份,先創建備份
copy "!NGINX_CONF!" "!BACKUP_CONF!" >nul
echo 已創建配置備份:!BACKUP_CONF!
)
powershell -Command "(Get-Content '!NGINX_CONF!') -replace '{WSL_IP}', '!WSL_IP!' | Set-Content '!NGINX_CONF!'" >nul
if %errorlevel% equ 0 (
echo Nginx配置已更新,IP已替換為:!WSL_IP!
) else (
echo 錯誤:更新Nginx配置失敗
pause
exit /b 1
)
echo 正在啟動Nginx...
cd /d "!NGINX_PATH!"
nginx.exe -s stop >nul 2>&1
start /b nginx.exe
timeout /t 2 /nobreak >nul
tasklist | findstr "nginx.exe" >nul
if %errorlevel% equ 0 (
echo Nginx啟動成功!
) else (
echo 錯誤:Nginx啟動失敗,請檢查配置文件
)
echo.
echo ==============================================
echo SSH連接信息:
echo 推薦命令:ssh !WSL_USER!@localhost -p !SSH_WINDOWS_PORT!
echo 或使用WSL IP:ssh !WSL_USER!@!WSL_IP! -p !SSH_WSL_PORT!
echo ==============================================
echo.
echo 操作完成,按任意鍵退出...
pause >nul
endlocal
這個方法通過調用nginx轉發端口實現,并設置端口22223,然后可以本地通過ssh 用戶名@IP -p 22223 訪問。
然后win+R,輸入shell:startup
將bat腳本放在文件夾中,重啟電腦,便會自動運行。

浙公網安備 33010602011771號