windows下wsl2网络配置实现局域网机器直接访问wsl内linux系统服务

期望通过每一次分享,让技术的门槛变低,落地更容易。 —— around

前言

为什么要在windows上安装linux,这个问题当你是研发、测试、运维人员,我相信应该有你使用的场景,特别是部署和测试较大的服务,直接本地模拟线上真实环境操作会更好。

为什么不安装vmware、docker-desktop之类的虚拟化应用呢,因为最终跑不掉还是要安装linux系统,所以干脆直接运行一个可交互的双系统来的好,并且vmware使用时间长了莫名其妙的问题和垃圾太多了。

本文基础环境为windows10、wsl2、ubuntu22,如果你还没有安装好基于wsl2的ubuntu系统,请移步看我这篇文章,傻瓜式操作windows通过wsl2安装linux

正文

1.清理乱七八糟的环境

影响wsl2操作系统配置的有几个关键配置文件,请不要到网上随便乱搜索照着乱填,容易出事,如果你有配置过,请根据自己的记忆,把那些操作都还原。

2.windows端 .wslconfig

此文件为对wsl端网络、硬件资源、文件路径等相关配置参数,所在目录为C:\Users\{你的系统用户名}\.wslconfig请将配置都删除掉。

[wsl2]
processors=8  # 分配给linux的cpu
memory=10737418240 #分配给linux的内存

上述不知道怎么配置,也可以直接在系统上搜索wsl
在这里插入图片描述
接着在打开的页面,只更改内存、cpu资源即可
在这里插入图片描述
如果你是windows11,可以直接在这个页面,勾选网络设置为镜像,也是可以的。我接下来讲述的网络模式全部围绕着NAT网络方式做,因为本地是windows10,且windows环境的端口和ubuntu的端口可能冲突,为了避免这个情况,让我自由去控制端口映射更从容。

如果你是windwos11也可以不使用NAT网络,直接在WSL Setting里设置当前的网络,直接勾选为镜像网络模式,其他不用改了,重启一下wsl服务就可以生效了。

3.ubuntu端 /etc/wsl.conf

此文件内,用于记录系统端配置加载项,如果其他项你控制不了,请都删掉,按我的配置

[boot]
systemd=true   # 开启systemctl

[network]
hostname=ubuntu22  # 给自己主机起一个名字
generateResolvConf=false  # 是否开启自动生成resolv配置文件,用于生成dns

[user]
default=root    # 系统登录默认用户

完成上述配置后,退出系统,依次在windows命令行执行下列

# windows 命令行界面执行
# 关闭wsl
wsl --shudown
# 查询是否关闭,state显示为stopped
wsl -l -v
# 启动wsl
wsl

至此,应该可以正常访问网络进行下载了,不过执行ping www.baidu.com 应该还是会出错,因为dns解析出错了。

# ubuntu环境下执行命令
root@ubuntu22:/data# ping www.baidu.com
ping: www.baidu.com: 域名解析暂时失败

说明网络还未配置完毕,我们继续。。。

4.ubuntu端 /etc/resolv.conf 访问外部网络,绑定dns

此文件用于系统生成dns解析配置,这里你需要了解一些网络知识,包括ip、网关、dns等。当关闭了wsl.conf文件中自动生成resolv配置文件后,需要手动去创建了。

我们打开windows端的网络配置,自己找到windows系统的网络连接入口。
在这里插入图片描述
接着点开该网络配置,继续查看属性信息,再查看ip地址。
在这里插入图片描述
这里可以发现,再windows上wsl的网络地址ip为172.31.32.1,你可以理解为,wsl系统的网络ip地址就是这个。
而我们在ubuntu内再查看一下当前ubuntu的ip地址,可以发现都在一个网段172.31.32中,说明wsl中每个操作系统都会有一个基于网关ip的精确ip地址。
在这里插入图片描述
总结:wsl就是一个网关地址,它会将通过wsl进行创建的N个操作系统统一连接到该ip地址转发出去上网。所以,作为内部操作系统的ubuntu,只要能配置连接上wsl,就能访问外部网络。

下面我们来修复dns,执行route -n查看到的网关就得到ip地址就是172.31.32.1

root@ubuntu22:/data# route -n
内核 IP 路由表
目标            网关            子网掩码        标志  跃点   引用  使用 接口
0.0.0.0         172.31.32.1     0.0.0.0         UG    0      0        0 eth0

注意看到的0.0.0.0对应的网关地址,就是你windows机器上 虚拟网络wsl的ip地址。根据之前查询的内容,说明网络已经完成了匹配和映射,现在我们只需要绑定一下dns的nameserver即可。

# ubuntu端
vi /etc/resolve.conf

# 添加下列内容,注意nameserver后面的地址,一定是你上述route -n 查询到的网关地址
nameserver 172.31.32.1
options edns0 trust-ad

配置完成,保存该文件。再次测试ping命令,显示成功。

root@ubuntu22:/data# ping www.baidu.com
PING www.a.shifen.com (183.22.17.52) 56(84) bytes of data.
64 bytes from 183.22.17.52 (183.22.17.52): icmp_seq=1 ttl=49 time=21.2 ms
64 bytes from 183.22.17.52 (183.22.17.52): icmp_seq=2 ttl=49 time=21.1 ms

5.让外部网络访问本地机器内的wsl服务

网络本身不复杂,就是一个网络访问领一个网络的网关,然后转发给该网络内的机器或网关设备继续转发,简单画了个草图。
在这里插入图片描述
如果需要电脑A访问电脑C中的wsl-ubuntu,在保证电脑A可以正确访问到电脑B,我们只需要解决电脑C访问本地wsl-ubuntu即可。

如果按照上述配置wsl网络完成,说明网络已经打通了,剩下要解决的只有端口映射了,NAT网络需要手动指定映射,就像docker一样,运行的docker容器,需要指明内部服务的端口号和外部服务端口号绑定关系,否则无法访问进去,这种方式是为了避免端口冲突。

实际操作,在windows端命令行执行,第一个IP显示为172.31.32.124,它就是当前ubuntu的ip地址,如果你有多个wsl系统,建议还是通过ubuntu内,执行ifconfig查看。

PS C:\Users\Administrator> wsl hostname -I
172.31.32.124 172.17.0.1

接着直接在windows端的命令行界面中,ping该ip地址,如果畅通表示网络连接是成功的。

PS C:\Users\Administrator> ping 172.31.32.124

正在 Ping 172.31.32.124 具有 32 字节的数据:
来自 172.31.32.124 的回复: 字节=32 时间<1ms TTL=64
来自 172.31.32.124 的回复: 字节=32 时间<1ms TTL=64

再根据该ip地址,在windows端的命令行界面,配置ip+端口映射关系

#listenport=外部宿主机端口
#connectport=内部wsl虚拟机端口
#connectaddress=执行wsl hostname -I 查看的非127.0.0.1的ip地址
netsh interface portproxy add v4tov4 listenport=1521 listenaddress=0.0.0.0 connectport=3006 connectaddress=172.31.32.124

上述命令表示,在宿主机上的1521端口,绑定访问wsl网络虚拟机172.31.32.124:3006的系统服务。
若同局域网用户想访问该wsl服务,正确访问地址应该是宿主机IP:1521
若需要对外互联网暴露该服务,请在当前局域网段的网关中,配置对外ip端口映射,将宿主机IP:1521配置进去,外部互联网就可以通过公网IP+端口直接访问到该服务了。

至此,完成本地网络访问wsl内部网络。
有问题再说

<think>嗯,用户想了解Excel中的VLOOKUP函数的用法和参数含义。首先,我需要回忆一下VLOOKUP的基本结构。VLOOKUP是垂直查找函数,用于在表格的首列查找指定的值,然后返回该行中指定列的数据。它的四个参数分别是查找值、表格范围、列索引号和匹配模式。 接下来,我得确认每个参数的具体作用。第一个参数是lookup_value,也就是用户要查找的值,比如产品ID或者姓名。第二个参数是table_array,即查找的范围,这里要注意的是,查找值必须位于这个范围的第一列,否则函数无法正确工作。第三个参数是col_index_num,也就是用户想要返回的数据在表格范围中的第几列,这个列数是从表格范围的第一列开始算起的,不是整个工作表的列。第四个参数是range_lookup,决定是精确匹配还是近似匹配,通常用FALSE或0来指定精确匹配,避免错误。 然后,用户可能需要一个具体的例子来理解如何使用。比如,假设有一个产品价格表,用户想根据产品ID查找对应的价格。这时候,VLOOKUP就可以在ID列查找,然后返回价格列的数据。同时,要提醒用户注意表格范围最好使用绝对引用,比如$A$2:$C$100,这样在拖动公式时范围不会变化。 可能遇到的问题也需要考虑。比如,如果查找值不在表格的第一列,或者列索引号超过了表格的列数,函数会返回错误。此外,数据格式不一致也可能导致问题,比如查找值是数字,而表格中是文本格式的数字,这时候需要统一格式。还有,当出现#N/A错误时,可能是查找值不存在,或者匹配模式设置不正确,需要检查参数是否正确。 用户可能还会问到如何避免常见的错误,比如部分数据匹配出错的情况。这时候需要检查是否有多余的空格,或者数据格式不一致,或者表格范围没有锁定导致拖动时偏移。此外,XLOOKUP作为VLOOKUP的升级版,可能在某些情况下更方便,比如可以向左查找或者返回多列数据,这也是可以提及的内容。 最后,整理步骤,从基础语法到参数说明,再到具体案例,逐步引导用户理解如何使用VLOOKUP函数。同时,提供常见错误和解决方法,帮助用户在实际应用中避免问题。如果有必要,还可以比较VLOOKUP和其他查找函数的区别,比如HLOOKUP或XLOOKUP,但根据用户的问题,主要集中在VLOOKUP本身即可。</think>### Excel VLOOKUP函数详解 #### 一、基础语法与参数说明 VLOOKUP函数的语法为: $$=VLOOKUP(lookup\_value, table\_array, col\_index\_num, [range\_lookup])$$ 包含4个参数: 1. **lookup_value**(必填):要查找的值(如单元格引用或具体值) 2. **table_array**(必填):包含数据的表格范围(必须包含查找列和返回列) 3. **col_index_num**(必填):返回值所在列的序号(从table_array第一列开始计数) 4. **range_lookup**(可选):匹配类型 - `TRUE`/`1`:近似匹配(默认值,需数据升序排列) - `FALSE`/`0`:精确匹配(常用选项) [^1][^2] #### 二、使用步骤演示(工资表查询案例) 假设需要根据员工编号查询工资: 1. 建立查询单元格(如`B12`) 2. 输入公式: ```excel =VLOOKUP(A12, $A$2:$D$100, 4, 0) ``` - `A12`:待查询的员工编号 - `$A$2:$D$100`:锁定数据区域(绝对引用) - `4`:返回第4列(工资列) - `0`:精确匹配 [^2][^3] #### 三、常见错误与解决方法 | 错误现象 | 原因 | 解决方案 | |---------|------|---------| | #N/A | 查找值不存在 | 检查数据源或改用`IFERROR`容错 | | #REF! | 列序号超出范围 | 确认col_index_num ≤ 表格列数 | | 部分匹配失败 | 数据格式不一致 | 统一数值/文本格式 | | 结果错位 | 表格未锁定 | 使用`$`符号固定区域引用 | [^3][^4] #### 四、进阶技巧 1. **多条件查询**: 使用辅助列合并多个条件字段 ```excel =VLOOKUP(A2&B2, $D$2:$F$100, 3, 0) ``` 2. **通配符匹配**: `"*"`匹配任意字符,`"?"`匹配单个字符 ```excel =VLOOKUP("张*", $A$2:$C$100, 3, 0) ``` 3. **跨表查询**: 引用其他工作表数据 ```excel =VLOOKUP(A2, Sheet2!$A$2:$D$100, 4, 0) ``` [^1][^4]
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值