1. 代理服务
1.1 获取Windows主机ip并使用其代理
可以在wsl中安装代理软件,但如果win主机上也有代理软件的话,会感觉有点乱。这里让wsl使用主机的代理。
我使用的代理软件是clash
,这里首先要确保clash允许局域网
确认完clash支持局域网后,我们来看如何从wsl中获取win主机的ip地址。
在Windows主机上,我们可以用ipconfig
命令来查看本地的ip地址
ipconfig
如图所示,命令行输出了在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查看是否代理成功:
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
命令来一键设置代理了
2. 从windows主机访问wsl2
2.1 获取WSL的ip地址
当我们使用WSL2时,wsl和Windows相当于两台处于一个网络中但分贝独立的主机(我们称这个网络为WSL网络)。在Windows主机上使用ipconfig
我们可以看到Windows主机在WSL网络中的地址,相应的,在wsl中我们可以使用ifconfig
命令来查看wsl在WSL网络中的地址。
ifconfig
其中的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
文件权限
右击文件,选择属性
,选择安全
选项卡,点击编辑
来更改文件权限
为User
增加写入权限
点击确定保存退出。
这时候,可以在wsl中cd进入/mnt/c/Windows/System32/drivers/etc
,使用ll
命令查看hosts
文件的权限
可以看到,对于hosts
文件,已经有了写权限