1. 代理服务

1.1 获取Windows主机ip并使用其代理

可以在wsl中安装代理软件,但如果win主机上也有代理软件的话,会感觉有点乱。这里让wsl使用主机的代理。

我使用的代理软件是clash,这里首先要确保clash允许局域网
20210810162350

确认完clash支持局域网后,我们来看如何从wsl中获取win主机的ip地址。 在Windows主机上,我们可以用ipconfig命令来查看本地的ip地址

ipconfig

20210810172327

如图所示,命令行输出了在wsl网络中Win主机的ip地址。(wsl和windows处于一个网络中,这里得到的是windows在这个网络中的ip地址)。

如果我们想使用windows的代理,那么可以使用如下命令(在wsl中):

export ALL_PROXY="http://172.28.48.1:7890"

这里, 172.28.48.1是Windows在这个网络中的ip地址,7890是代理接口。

通过访问google查看是否代理成功: 20210810172708

1.2 使用脚本自动获取ip地址并设置代理

通过1.1我们知道,可以在Windows主机中获取其在wsl网络中的ip地址,那我们是否可以在wsl中获取到这个地址呢?

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.28.48.1

这里的nameserver,是不是就和我们在Windows下获取到的ip地址是一样的。

我们通过一个脚本来自动获取到这个ip地址,并将其设置为代理地址:

#!/bin/bash
host_ip=$(cat /etc/resolv.conf |grep "nameserver" |cut -f 2 -d " ") # 获取ip地址
echo $host_ip # 输出ip地址
export ALL_PROXY="http://$host_ip:7890" # 设置代理,7890为我的代理端口
curl -I https://www.google.com # 尝试访问Google, 验证代理的有效性

将这个脚本移动到某个目录下,例如我将其放在/opt/proxy/proxy.sh
再为其设置一个快捷启动方式:

vim ~/.bashrc

~/.bashrc最后输入下行

alias proxy=/opt/proxy/proxy.sh
source ~/.bashrc

现在,我们可以使用proxy命令来一键设置代理了 20210810173807

2. 从windows主机访问wsl2

2.1 获取WSL的ip地址

当我们使用WSL2时,wsl和Windows相当于两台处于一个网络中但分贝独立的主机(我们称这个网络为WSL网络)。在Windows主机上使用ipconfig我们可以看到Windows主机在WSL网络中的地址,相应的,在wsl中我们可以使用ifconfig命令来查看wsl在WSL网络中的地址。

ifconfig

20210810174254

其中的eth0就是wsl在WSL网络中的IP地址,这里为:172.28.62.74

打开Windows文件夹,定位到C:\Windows\System32\drivers\etc\hosts这个文件,在其最后一行加上:

172.28.62.74 wsl #wsl2 dns config

配置完成之后,你就可以使用wsl域名来直接访问wsl中的服务。如:https://wsl:8080/index。(如果你的8080端口有服务监听的话)。

2.2 使用脚本自动为windows配置dns

#!/bin/bash
HOSTS_FILE_WIN='/mnt/c/Windows/System32/drivers/etc/hosts'
inetIp=`ifconfig eth0 | grep -o "inet [0-9]*\.[0-9]*\.[0-9]*\.[0-9]*  netmask" | cut -f 2 -d " "` # 获取本机ip

nu=`cat -n ${HOSTS_FILE_WIN} | grep wsl2 | awk '{print $1}'`   # 获取已设置dns行号

dnsIp=`cat ${HOSTS_FILE_WIN} | grep -o "[0-9]*\.[0-9]*\.[0-9]*\.[0-9]* wsl #" | cut -f 1 -d " "` # 获取已设置dns ip

echo "wsl's ip is: ${inetIp}"

# set -x
set -e
if [ ${nu} ]  # 若已设置
then
        if [ ${inetIp} != ${dnsIp} ] # 已设置dns不正确
        then
                echo reset
                sed -i "${nu}d" ${HOSTS_FILE_WIN}  # 删除对应行
                echo "${inetIp} wsl #wsl2 dns config" >> ${HOSTS_FILE_WIN} # 重新设置
        fi
else # 未设置
        echo "${inetIp} wsl #wsl2 dns config" >> ${HOSTS_FILE_WIN} # 直接设置
fi

同样,将这个脚本保存到/opt/dns/dns.sh,然后为其设置别名(快捷启动)alias dns="/opt/dns/dns.sh"

当需要从Windows访问wsl中的服务时,就可以使用dns命令来设置为通过使用wsl域名来访问。

关于这个脚本,我还实现了golang版本,并编译出二进制文件,你可以直接下载二进制文件放在你的/usr/local/bin目录下面,在需要的时候使用命令一键设置dns. 地址在这里:https://github.com/yangchnet/wsl-Ip

2.3 遇到访问权限问题怎么办

如果遇到因权限问题不能更改文件,可按照以下步骤更改C:\Windows\System32\drivers\etc\hosts文件权限 右击文件,选择属性,选择安全选项卡,点击编辑来更改文件权限
20210820194359

User增加写入权限 20210820194659

点击确定保存退出。

这时候,可以在wsl中cd进入/mnt/c/Windows/System32/drivers/etc,使用ll命令查看hosts文件的权限 20210820194929 可以看到,对于hosts文件,已经有了写权限