WSL2设置静态ip

发布时间 2023-06-16 14:36:07作者: tinstone

TOC

简介

本人Windows 11 家庭中文版系统从Microsoft Store中安装Ubuntu系统(版本号:2204.2.33.0),用于一些Linux系统的操作,但是在使用中面临了一个较大的问题:每次启动电脑或者重启Ubuntu系统都会导致Ubuntu的IP地址变化,对于docker使用、window连接Ubuntu系统Python环境等均会带来繁琐的问题,因此本文主要介绍如何设置WSL2为静态IP

WSL2动态IP问题

由于子系统是通过虚拟网卡并设置到与宿主机同一网段中,所以可以互相访问,但是对于宿主机来说,并不能够完全的隔离。如果在子系统中开启了网站服务,那么在宿主机居然使用 localhost 来访问,这太让人迷惑了。并且另一个致命的问题是 每次重启 wsl2 都会自动分配一个 ip 地址,连同宿主机的虚拟网段中的 ip也会改变,所以每次都需要获取并更改服务的地址,如 : 通过 docker 开启了一个服务并监听了一个端口,但是每次宿主机重启后也是一样的发现服务地址变了,可能会导致服务运行失败,最小的副作用是更改 ip 地址。

设置WSL2为静态IP

1. 选择设定的静态IP

主要有两个地方需要设置静态ip

  1. WSL内部的eth0网卡;假定ip为172.18.224.2
  2. Windows的vEthernet (WSL)网卡;假定ip为172.18.224.1

补充:

  1. 对于静态ip的设定(为什么选择172.18.224.2之类的问题),我这边是根据当前windows中的 vEthernet(WSL)初始的ip作为后续的静态ip,然后WSL的eth0网卡就选定同网段下的一个ip就可以了
  2. 如果电脑没有通过terminal中输入命令 ipconfig 没有显示vEthernet(WSL)的ip,说明你没有启动WSL系统,点击Ubuntu图标启动或者命令net start LxssManager 启动一下就可以了

2. 设置Windows的vEthernet (WSL)网卡ip

cmd命令以管理员权限执行一下命令就可以了(或者在powershell中执行下面命令双引号里的内容),执行完可以通过ipconfig 查看 vEthernet (WSL)网卡ip是否是选定的IP,本文是:172.18.224.1

powershell -c "Get-NetAdapter 'vEthernet (WSL)' | Get-NetIPAddress | Remove-NetIPAddress -Confirm:$False; New-NetIPAddress -IPAddress 172.18.224.1 -PrefixLength 24 -InterfaceAlias 'vEthernet (WSL)'; Get-NetNat | ? Name -Eq WSLNat | Remove-NetNat -Confirm:$False; New-NetNat -Name WSLNat -InternalIPInterfaceAddressPrefix 172.18.224.0/24;"

补充:如果想更换为你设定的IP,只需将对应的172.18.224.1修改即可

3. 设置WSL2的eth0w网卡的IP

在WSL2系统中启动脚本 ~/.bashrc 里添加如下命令(我本人在root账户、个人账户都添加了!手动捂脸),此处设置的IP为 172.18.224.2

# static ip
if [ "$(ip addr show eth0 | grep 'inet\b' | awk '{print $2}' | head -n 1)" != "172.18.224.2/24" ];
then
sudo ip addr del $(ip addr show eth0 | grep 'inet\b' | awk '{print $2}' | head -n 1) dev eth0
sudo ip addr add 172.18.224.2/24 broadcast 172.18.224.255 dev eth0
sudo ip route add 0.0.0.0/0 via 172.18.224.1 dev eth0
fi

4. 配置DNS

设置好静态IP后,如果不配置DNS(一般在root账户),则WSL2无法访问外网(可以通过命令 ping www.baidu.com 测试),因此需要设置DNS,此部分需要两个步骤:

4.1 修改 /etc/wsl.conf 文件
使用命令 vim /etc/wsl.conf 文件中写入如下命令

[network]
generateResolvConf = false # 不自动生成dns配置,必须
generateHosts = false # 是否生成hosts文件,可选

[interop]
enabled = false # 不能调用Windows进程,可选
appendWindowsPath = false # 不添加Windows路径,可选

4.2 修改 /etc/resolv.conf 文件
对于本人使用的WSL2版本中系统存在一条软连接(指向/mnt/msl/resolv.conf),需要先删除软连接,使用命令 vim /etc/resolv.conf 文件中写入如下命令,

nameserver 8.8.4.4 # 写入你本地最好用的dns就行

配置完成后,使用命令 ping www.baidu.com 测试一下,即可访问外网。

5. 重要问题

对于完成以上设置后,上述的设置还存在两个大问题:

  1. WSL2中设置好的 /etc/resolv.conf 重启丢失问题
  2. 重启电脑或WSL2服务后vEthernet (WSL)网卡IP仍然变动问题,WSL2的IP对于重启电脑或者WSL2服务均不会发生变化

因此该部分主要针对这两个问题进行解决,解决完这两个问题才能保证设置完全完成,少年,不要浮躁哇。

对于第一个问题,可以直接在WSL2每次启动时将相关内容写入对应文件即可,可以借助 ~/.bashrc 文件进行配置(登入Ubuntu时对应的账户,不要忘了在/etc/sudoers中配置当前账户的sudo权限:youuser ALL=(ALL) NOPASSWD: ALL), 运行命令 vim ~/.bashrc,然后天下下面内容即可保证每次启动WSL2都会完成4.2的操作:

sudo sh -c 'echo "nameserver 114.114.114.114 
nameserver 8.8.8.8" > /etc/resolv.conf'

对于第二个问题,最笨的方式是每次开机或者重启WSL2服务时,重复操作一下 2 操作对应的命令,如果想省事的话就将对应的命令写成一个脚本设置开机自启或者放到某个地方手动启动也可以,

其他相关命令

  1. 重启wsl 服务命令
# 用管理员权限打开 powershell
#停止LxssManager服务
net stop LxssManager
#启动LxssManager服务
net start LxssManager
  1. windows 系统查看当前运行的WSL子系统
    wsl --list --running



来自为知笔记(Wiz)