WSL 固定IP的两种方法

文章讲述了如何在WindowsSubsystemforLinux(WSL)中配置固定IP,解决wsl稳定性问题,包括手动设置静态IP、利用wsl2host进行自动配置,以及设置SSH转发和防火墙规则。还介绍了配置Linux和Windows启动脚本来实现对WSL的访问。
部署运行你感兴趣的模型镜像

首发于个人博客

1. 网桥配置固定ip

这种模式不稳定,wsl经常崩溃

@echo off
setlocal enabledelayedexpansion
::先停掉可能在跑的wsl实例
wsl --shutdown ubuntu
if !errorlevel! equ 0 (
    ::检查WSL有没有我需要的IP
    wsl -u root ip addr | findstr "192.168.3.100" > nul
    if !errorlevel! equ 0 (
        echo wsl ip has set
    ) else (
        ::IP不存在则绑定IP
        wsl -u root ip addr add 192.168.3.100/24 broadcast 192.168.3.255 dev eth0 label eth0:1
        echo set wsl ip success: 192.168.3.100
    )
    ::检查宿主机有没有我需要的IP
    ipconfig | findstr "192.168.3.200" > nul
    if !errorlevel! equ 0 (
        echo windows ip has set
    ) else (
        ::IP不存在则绑定IP
        netsh interface ip add address "vEthernet (WSL)" 192.168.3.200 255.255.255.0
        echo set windows ip success: 192.168.3.200
    )
)
 ::为主机设置SSH转发端口
 netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=22 connectaddress=192.168.3.100 connectport=22

pause

wsl无法ping通windows

New-NetFirewallRule -DisplayName "WSL" -Direction Inbound  -InterfaceAlias "vEthernet (WSL)"  -Action Allow

允许wsl通过防火墙

2.另一种模式,自动配置wsl2 host

WSL2 启动时会自动变换IP,IP地址不可固定。使用Localhost有时候可以连接上去,有时候连接不上去。
现在设置一个固定的host来配置WSL2

1. 配置Linux 获取IP启动脚本

如果无法写入,则需要在windows配置etc目录的权限,更改所属组,让User也有写入权

cd /etc
touch initWsl.sh
chmod 775 initWsl.sh
chmod 777 /mnt/c/Windows/System32/drivers/etc/hosts
vim initWsl.sh

initWsl.bash

#! /bin/sh

# 启动对应服务
#service ssh ${1}
#service docker ${1}

# 设置本地Wsl2域名,默认为wsl2host
ipaddr=$(ip -4 addr show dev eth0 | egrep 'inet ([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})' | awk '{print $2}' | awk -F/ '{print $1}')
hostName='wsl.local'
sed -i "/${hostName}/d" /mnt/c/Windows/System32/drivers/etc/hosts
echo "${ipaddr} ${hostName}" >> /mnt/c/Windows/System32/drivers/etc/hosts

sed -i "/${hostName}/d" /etc/hosts
echo "${ipaddr} ${hostName}" >> /etc/hosts

winip=$(cat /etc/resolv.conf | grep nameserver | awk '{ print $2 }')
winhost='win.local'

sed -i "/${winhost}/d" /etc/hosts
echo "${winip} ${winhost}" >> /etc/hosts

./initWsl.sh start
2. 配置Windows 启动运行脚本
  1. 进入 C:\Users\hanli\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
  2. 创建Ubuntu.vbs
Set ws = CreateObject("Wscript.Shell")
ws.run "wsl -d Ubuntu -u root /etc/initWsl.sh start", vbhide
  1. 执行Ubuntu.vbs

3. 通过localhost访问

curl localhost:port 

即可访问到wsl2的端口

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

<think>我们正在回答用户关于在WSL2中获取vEthernet (WSL)适配器IP方法的问题。 根据之前的对话,用户已经了解了在Windows中使用ipconfig获取该IP方法,现在他们想知道在WSL2内部如何获取这个IP。 实际上,在WSL2内部,我们通常不需要直接获取这个适配器的IP,因为WSL2会自动配置网络,使得Windows主机在WSL2网络中的IP地址被设置为WSL2的默认网关和DNS服务器。 这个IP地址通常可以在WSL2的/etc/resolv.conf文件中找到,因为WSL2将Windows主机设置为DNS服务器,所以该文件的nameserver值就是vEthernet (WSL)适配器在WSL网络中的IP。 步骤: 1. 在WSL2的终端中,执行:`cat /etc/resolv.conf` 2. 查看输出的nameserver,例如:`nameserver 172.27.160.1`,这个IP就是vEthernet (WSL)适配器的IP。 注意:这个IP是Windows主机在WSL2虚拟网络中的IP,也就是vEthernet (WSL)适配器的IP。 另外,也可以通过路由命令获取默认网关,这个网关就是Windows主机的IP(即vEthernet (WSL)适配器的IP): 在WSL2终端执行:`ip route show default | awk '{print $3}'` 解释:`ip route show default`会显示默认路由,其中会包含默认网关的IP,然后使用awk提取第三列(即网关IP)。 引用[3]中也展示了这一点:在WSL2中,/etc/resolv.conf的nameserver设置为172.27.160.1,而该IP正是Windows主机上vEthernet (WSL)适配器的IP[^3]。 因此,有两种方法方法一:查看/etc/resolv.conf中的nameserver。 方法二:使用ip命令获取默认网关。 注意:由于WSL2的网络是动态分配的,每次重启可能会变化。如果用户需要固定这个IP,则需要额外的配置(如引用[2]中提到的通过PowerShell设置静态IP,但通常不建议,因为可能会与WSL自动管理冲突)。 因此,我们给出以下步骤: 步骤1(推荐):在WSL2终端中运行: ```bash cat /etc/resolv.conf | grep nameserver | awk '{print $2}' ``` 或者更精确地(避免注释行的干扰): ```bash grep nameserver /etc/resolv.conf | awk '{print $2}' ``` 步骤2:或者使用ip命令获取默认网关: ```bash ip route | awk '/default/ {print $3}' ``` 注意:这两个命令获取的IP应该是同一个IP,即vEthernet (WSL)适配器的IP。 举例:在引用[3]中,这个IP是172.27.160.1[^3]。 同时,我们注意到,在Windows中通过ipconfig查询到的vEthernet (WSL)适配器的IP和在WSL2中通过上述方法获取的IP是一致的。 为什么需要这个IP? 这个IP用于在WSL2中访问Windows主机上运行的服务。例如,在Windows上运行了一个Web服务在8080端口,那么在WSL2中可以通过`curl http://172.27.160.1:8080`来访问。 注意事项: 如果/etc/resolv.conf被修改(比如用户禁用了自动生成),那么方法一可能失效。此时使用方法二更可靠。 因此,我们给出一个综合的方法: 在WSL2中,执行以下命令获取Windows主机的IP(即vEthernet (WSL)适配器的IP): ```bash hostname -I | awk '{print $1}' ``` 这个命令不行,因为hostname -I返回的是WSL2虚拟机自己的IP。 所以还是用上面两种方法之一。 我们选择一种更健壮的方法:先尝试从/etc/resolv.conf获取,如果失败则从默认路由获取。 但通常,我们只需要其中一种即可。我们推荐第一种,因为更简单。 另外,需要注意的是,在WSL2中,Windows主机还有一个特殊的域名:`host.docker.internal`(如果使用Docker)或者`host`(在WSL2中,可以通过`cat /etc/hosts`看到,有一个映射:`172.27.160.1 host`),但实际上,在WSL2中,我们可以直接使用`hostname`来访问Windows主机?不对。 实际上,在WSL2中,有一个特殊的DNS名称:`microsoft.com`,但这不是用来访问主机的。更准确的是,我们可以使用`host.docker.internal`(如果安装了Docker)或者直接使用IP。 但是,我们这里只需要获取IP。 所以总结:在WSL2中获取Windows主机(即vEthernet (WSL)适配器)的IP,最简单的方法是: ```bash cat /etc/resolv.conf | grep nameserver | cut -d ' ' -f 2 ``` 生成相关问题: 1. 为什么WSL2每次重启后Windows主机的IP会变化? 2. 如何在WSL2中固定访问Windows主机的IP地址? 3. 如何在Windows中访问WSL2子系统的网络服务? 注意:在回答中,我们要引用站内引用,特别是引用[3]中已经给出了实例。 因此,我们的回答如下: </think>### 在WSL2中获取vEthernet (WSL)适配器IP方法WSL2中获取`vEthernet (WSL)`适配器的IP地址(即Windows主机在WSL网络中的网关IP),主要有以下两种方法: #### 方法一:通过DNS配置文件获取(推荐) 在WSL2终端执行: ```bash cat /etc/resolv.conf | grep nameserver | awk '{print $2}' ``` **原理**: WSL2自动将Windows主机的虚拟适配器IP设置为Linux子系统的DNS服务器。输出结果如: ``` 172.27.160.1 # 即vEthernet (WSL)适配器的IP[^3] ``` #### 方法二:通过默认路由获取 在WSL2终端执行: ```bash ip route | awk '/default/ {print $3}' ``` **原理**: Windows主机在WSL网络中作为默认网关,该命令提取默认网关的IP地址。 #### 验证方法WSL2中访问Windows服务(例如端口18080): ```bash curl $(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):18080 ``` 预期返回结果: ``` ok # 证明IP正确[^3] ``` #### ⚠️ 注意事项 1. 该IP通常以`172.x.x.1`开头,是NAT网络的网关地址 2. 每次重启WSL可能变化,若需固定IP需修改Hyper-V配置[^2] 3. 若`/etc/resolv.conf`被修改,需检查`/etc/wsl.conf`的`generateResolvConf`设置[^3]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值