本人Windows 11 家庭中文版系统从Microsoft Store中安装Ubuntu系统(版本号:2204.2.33.0),用于一些Linux系统的操作,但是在使用中面临了一个较大的问题:每次启动电脑或者重启Ubuntu系统都会导致Ubuntu的IP地址变化,对于docker使用、window连接Ubuntu系统Python环境等均会带来繁琐的问题,因此本文主要介绍如何设置WSL2为静态IP。
由于子系统是通过虚拟网卡并设置到与宿主机同一网段中,所以可以互相访问,但是对于宿主机来说,并不能够完全的隔离。如果在子系统中开启了网站服务,那么在宿主机居然使用 localhost
来访问,这太让人迷惑了。并且另一个致命的问题是 每次重启 wsl2
都会自动分配一个 ip
地址,连同宿主机的虚拟网段中的 ip
也会改变,所以每次都需要获取并更改服务的地址,如 : 通过 docker
开启了一个服务并监听了一个端口,但是每次宿主机重启后也是一样的发现服务地址变了,可能会导致服务运行失败,最小的副作用是更改 ip
地址。
主要有两个地方需要设置静态ip:
172.18.224.2
;172.18.224.1
;补充:
ipconfig
没有显示vEthernet(WSL)的ip,说明你没有启动WSL系统,点击Ubuntu图标启动或者命令net start LxssManager
启动一下就可以了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
修改即可
在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
设置好静态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
测试一下,即可访问外网。
对于完成以上设置后,上述的设置还存在两个大问题:
因此该部分主要针对这两个问题进行解决,解决完这两个问题才能保证设置完全完成,少年,不要浮躁哇。
对于第一个问题,可以直接在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 操作对应的命令,如果想省事的话就将对应的命令写成一个脚本设置开机自启或者放到某个地方手动启动也可以,
# 用管理员权限打开 powershell
#停止LxssManager服务
net stop LxssManager
#启动LxssManager服务
net start LxssManager
wsl --list --running