这两天通过在win10上启用了wsl的能力,并安装了Ubuntu , 具体的操作过程,网上已经非常多了,这篇文章主要记录两个点:
- 自定义安装目录
- 使linux子系统通过windows代理上网
自定义linux子系统的安装目录
- 到这里去下载官方提供的离线包,选择自己习惯的版本就行。
- 下载成功后,将linux包的后缀由.Appx改为.zip,并解压到想要安装到的路径下。
- 以Ubuntu20为例,解压后的目录如下 ,双击ubuntu2004.exe,等待一会,它会自动在此目录下安装好ubuntu
- 安装好会提示设置账号密码,然后就可以愉快的玩耍了。
通过windows代理上网
win10是可以直接通过localhost来访问wsl2的, 但是wsl2想访问Win10就没有那么容易了。
在wsl2中获取win10的ip地址
因为在`win10`和`wsl2`的网络环境中,`ip`地址是动态分配的,所以在`wsl2`想查看`win10`的地址需要通过如下的方式
```bash
$ cat /etc/resolv.conf
# This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/wsl.conf:
# [network]
# generateResolvConf = false
nameserver 172.18.176.1
```
win10和wsl2互通
# 查看wsl2的ip地址
$ ip route
default via 172.25.176.1 dev eth0
172.25.176.0/20 dev eth0 proto kernel scope link src 172.25.176.47
在windows里执行下面的测试:
# win10 ping wsl2 顺利
C:\Users\xingmu> ping 172.25.176.47
正在 Ping 172.25.176.47 具有 32 字节的数据:
来自 172.25.176.47 的回复: 字节=32 时间<1ms TTL=64
来自 172.25.176.47 的回复: 字节=32 时间<1ms TTL=64
来自 172.25.176.47 的回复: 字节=32 时间<1ms TTL=64
来自 172.25.176.47 的回复: 字节=32 时间<1ms TTL=64
172.25.176.47 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 0ms,最长 = 0ms,平均 = 0ms
在linux执行如下的测试:
# wsl2 ping win10 不通
$ ping 172.25.176.1
PING 172.25.176.1 (172.25.176.1) 56(84) bytes of data.
以下内容来自这里 ,侵删
首先暴力关闭 window10 的防火墙,然后再次 ping 宿主机。
所以可以确定就是宿主机防火墙拦截了宿主机的 ICMP 的回显,为了方便 WSL2 与宿主机进行无障碍沟通,我们可以禁用防火墙,但是很显然这样宿主机就完全暴露在公网之上,安全性无疑就大大折扣,所以最佳的做法就是我们添加一条入站规则: 仅允许 WSL2 所在的网段主机对宿主机进行无障碍访问 。
上图涉及到子网的计算,不会的小伙伴自己补课,或者使用一些在线的 网络和IP地址计算器 来计算。
到这里就创建好了,我们只需启用规则然后就可以无障碍的访问宿主机了。
可以看到此时宿主机已经可以被 PING 通。此时 主机提供的 任何对外的网络服务 WSL2 均可以访问。因为我们只是对网络地址做了限制,并没有限制协议、端口等。
配置上网软件
上网软件需要设置允许来自局域网的连接。
我用的上网软件如下图所示。
上网软件的防火墙设置
这一步是最重要的一步, 需要在`Win10`防火墙中允许上网软件(`txxxxn`、`Vxxxy`)进行公用和专用网络的访问,只要设置这个就可以了, 不需要调整过其他设置。
配置wsl2的代理
# 获取主机 IP
#主机 IP 保存在 /etc/resolv.conf 中
export hostip=$(cat /etc/resolv.conf |grep -oP '(?<=nameserver\ ).*')
假设 Windows 上的 代理软件已允许局域网连接,http 监听在 8888 端口,SOCKS5 代理监听在 8889 端口,设置终端代理的方法与以往相同:
export https_proxy="http://${hostip}:8888";
export http_proxy="http://${hostip}:8888";
export all_proxy="socks5://${hostip}:8889";
为了方便日常使用,可以将以上命令保存为 alias。添加以下内容到 ~/.bashrc 或者 ~/.zshrc:
export hostip=$(cat /etc/resolv.conf |grep -oP '(?<=nameserver\ ).*')
export https_proxy="http://${hostip}:8888";
export http_proxy="http://${hostip}:8888";
export all_proxy="socks5://${hostip}:8889";
之后就可以在 WSL 2 中使用 setss 设置终端代理。
额外话题(WSL2 DNS 的配置)
以下内容来自这里 ,侵删
在使用 WSL2 进行软件更新的时候经常超级慢(已更换了国内源的前提下),经过一番排查发现是 DNS 的问题,当使用自定义的 DNS 时,域名解析的速度明显快了很多。
不过 WSL2 的默认域名解析服务和普通的 Linux 略微有不同,下面解释一下:
熟悉 Linux 的都知道 DNS 服务器的配置信息是在 /etc/resolv.conf 文件中,默认情况下,微软在每次启动 WSL2 都会重新根据宿主机 WSL 网卡的地址(例如:172.25.176.1)为 wsl2 实例生成这个文件,且指定 DNS 服务器的地址为宿主机 WSL 网卡的地址(例如:172.25.176.1)。
所以要想使用自己指定的 DNS 服务,来加快解析,就需要先禁用掉自动生成策略,仔细读上图会发现,官方已经给出了禁用自动生成方法。
即创建 /etc/wsl.conf,且内容如下:
[network]
generateResolvConf = false
然后删掉 /etc/resolv.conf(因为自动生成的为一个软连接),并重新建一个 /etc/resolv.conf 文本文件,并将其 DNS 服务器地址指定为自己想用的,如下:
# generateResolvConf = false
nameserver 223.5.5.5
点击这里查看DNS的知识,选择合适的DNS服务器
参考
https://www.link2sea.com/archives/496