WSL2 内网静态ip相关设置(Ubuntu,含详解)

内容目录

很多时候,我们希望从外网访问WSL2中的某些服务,但是由于WSL2的本质相当于虚拟机,我们只能通过端口映射的方式,才能使外网访问WSL的服务。但是WSL2采用的是DHCP动态ip分配,因而每次关机或WSL2重启后,内网的ip地址都会发生改变。

详解部分

WSL2内部网络设置

在这一部分我们将对WSL2虚拟机内部的ip地址进行修改,修改的内网ip可以是任意的。但是需要注意,如果当前Windows主机已经是内网ip,如192.168.*.*,则需要避免与该内网ip冲突。

在此处我们设定当前内网ip为

export LOCALIP=172.16.0.2

对应网段的掩码我们设置为20,其实就是20个1,对应的子网掩码为255.255.240.0。也可以选择24位,但对应的广播地址等均不同,注意辨别修改。

因而对应的网关地址与广播地址即为

export GATEWAY=172.16.0.1
export BROADCAST=172.16.15.255

此处可以设置环境变量,但不设置其实也是可以的,没有设置的话,不要忘记把这些变量改为你自己设置的ip地址。

1. 删除系统自动分配的已有的内网ip地址

使用ip addr[ess] del IFADDR dev IFNAME [mngtmpaddr]指令,需要IFADDRIFNAME两个参数,即ip地址与该网络配置名称。名称已知是eth0

ip addr show eth0 | grep 'inet\b' | awk '{print $2}'

与命令

ifconfig eth0 | grep 'inet\b' | awk '{print $2}'

都可以提取出ip地址,因而删除操作即为

ip addr del $(ifconfig eth0 | grep 'inet\b' | awk '{print $2}') dev eth0

2. 添加新的网络配置

将之前的内网ip地址与广播地址填入以下命令

ip addr add $LOCALIP/20 broadcast $BROADCAST dev eth0

20代表该ip地址是20位掩码

3. 为网关设置路由

ip route add 0.0.0.0/0 via $GATEWAY dev eth0

4. 添加域名解析服务器

将自动生成的域名服务器地址改为我们的网关

echo nameserver $GATEWAY > /etc/resolv.conf

Windows网络设置

WSL2内部的网络设置结束后,WSL2并不能正常联网,因为这个内网设置并没有被我们的Windows主机认可,需要更改Windows上的网络设。以下网络设置均在Powershell上执行。

也可以先设置临时变量

$LOCALIP="172.16.0.2"
$NETWORK="172.16.0.0/20" # 就是当前网段最后一位为0,再加上掩码长度
$GATEWAY="172.26.0.1"

1. 删除已有的WSL内网网络设置

# 删除旧网络设置
Get-NetIPAddress -InterfaceAlias 'vEthernet (WSL)' | Remove-NetIPAddress -Confirm:$False

2. 创建新的WSL网络设置

# 新建网络设置
New-NetIPAddress -IPAddress $GATEWAY -PrefixLength 20 -InterfaceAlias 'vEthernet (WSL)'

3. 删除原有WSL的NAT(网络地址转换)

Get-NetNat | ? Name -Eq WSLNat | Remove-NetNat -Confirm:$False

4. 为WSL添加新的NAT

New-NetNat -Name WSLNat -InternalIPInterfaceAddressPrefix $NETWROK

5. 为需要的服务提供端口映射

以OPENSSH服务为例

# 设置端口映射
netsh interface portproxy set v4tov4 listenport=2233 listenaddress=0.0.0.0 connectport=22 connectaddress=$LOCALIP

其中listenport可以随意设置,但需要防止该端口已被占用,或有其他可能的软件需要用到此端口,listenaddress可以无需设置,默认就是0.0.0.0connectport是需要连接的WSL内网服务的端口,connectaddress是内网ip地址

一键式设置

1. WSL内网设置

在WSL中新建一个可执行文件/etc/startup.conf,其内容为

ip addr del $(ip addr show eth0 | grep 'inet\b' | awk '{print $2}') dev eth0
ip addr add $yourip/20 broadcast $yourbroadcast dev eth0
ip route add 0.0.0.0/0 via $yourgateway dev eth0
echo nameserver $yourgateway > /etc/resolv.conf
service ssh start # 可以添加你需要的开机自启动的服务

2. Windows设置

C:\Users\你的用户名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup文件夹中新建一个bat文件
其内容为

@echo off
%1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit
wsl -d 你的WSL发行版本号 -u root /etc/startup.conf
powershell -c "Get-NetAdapter 'vEthernet (WSL)' | Get-NetIPAddress | Remove-NetIPAddress -Confirm:$False; New-NetIPAddress -IPAddress $yourgateway -PrefixLength 20 -InterfaceAlias 'vEthernet (WSL)'; Get-NetNat | ? Name -Eq WSLNat | Remove-NetNat -Confirm:$False; New-NetNat -Name WSLNat -InternalIPInterfaceAddressPrefix $yournetwork/20;"
exit

重启Windows,配置完成

WSL2 内网静态ip相关设置(Ubuntu,含详解)》有2条留言

留下回复