te')); return $arr; } /* 遍历用户所有主题 * @param $uid 用户ID * @param int $page 页数 * @param int $pagesize 每页记录条数 * @param bool $desc 排序方式 TRUE降序 FALSE升序 * @param string $key 返回的数组用那一列的值作为 key * @param array $col 查询哪些列 */ function thread_tid_find_by_uid($uid, $page = 1, $pagesize = 1000, $desc = TRUE, $key = 'tid', $col = array()) { if (empty($uid)) return array(); $orderby = TRUE == $desc ? -1 : 1; $arr = thread_tid__find($cond = array('uid' => $uid), array('tid' => $orderby), $page, $pagesize, $key, $col); return $arr; } // 遍历栏目下tid 支持数组 $fid = array(1,2,3) function thread_tid_find_by_fid($fid, $page = 1, $pagesize = 1000, $desc = TRUE) { if (empty($fid)) return array(); $orderby = TRUE == $desc ? -1 : 1; $arr = thread_tid__find($cond = array('fid' => $fid), array('tid' => $orderby), $page, $pagesize, 'tid', array('tid', 'verify_date')); return $arr; } function thread_tid_delete($tid) { if (empty($tid)) return FALSE; $r = thread_tid__delete(array('tid' => $tid)); return $r; } function thread_tid_count() { $n = thread_tid__count(); return $n; } // 统计用户主题数 大数量下严谨使用非主键统计 function thread_uid_count($uid) { $n = thread_tid__count(array('uid' => $uid)); return $n; } // 统计栏目主题数 大数量下严谨使用非主键统计 function thread_fid_count($fid) { $n = thread_tid__count(array('fid' => $fid)); return $n; } ?>windows下wsl2网络配置实现局域网机器直接访问wsl内linux系统服务
最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

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

运维笔记admin3浏览0评论

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

前言

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

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

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

章节目录

    • 前言
    • 正文
      • 1.清理乱七八糟的环境
      • 2.windows端 .wslconfig
      • 3.ubuntu端 /etc/wsl.conf
      • 4.ubuntu端 /etc/resolv.conf 访问外部网络,绑定dns
      • 5.让外部网络访问本地机器内的wsl服务

正文

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 应该还是会出错,因为dns解析出错了。

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

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

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
PING www.a.shifen (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内部网络。
有问题再说

发布评论

评论列表(0)

  1. 暂无评论