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脚本放在文件夹中,重启电脑,便会自动运行。