编辑
2024-01-08
wsl
00
请注意,本文编写于 522 天前,最后修改于 228 天前,其中某些信息可能已经过时。

目录

wsl2在NAT网络模式下使用主机clash代理
为 apt 配置代理
注意点
其它tips

wsl2在NAT网络模式下使用主机clash代理

wsl2下git clone命令遇到了网络问题,于是想设置wsl2下的代理,将方法和注意点记录一下。

wsl网络模式工作在NAT模式时,主机和wsl相当于一个局域网,主机是网关,wsl是一台机器,wsl的dns服务器ip地址也是主机地址。

bash
cutelemon6@Cutelemon6-laptop:~$ ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.20.53.72 netmask 255.255.240.0 broadcast 172.20.63.255

wsl地址172.20.53.72

powershell
PS C:\Users\Cutelemon6> ipconfig 以太网适配器 vEthernet (WSL): 连接特定的 DNS 后缀 . . . . . . . : 本地链接 IPv6 地址. . . . . . . . : fe80::201c:37d6:6f73:d884%53 IPv4 地址 . . . . . . . . . . . . : 172.20.48.1 子网掩码 . . . . . . . . . . . . : 255.255.240.0 默认网关. . . . . . . . . . . . . :

主机为wsl虚拟的网卡地址172.20.48.1,代理未设置的情况下,使用wsl是能访问到国内网站的,比如baidu.com,为了让wsl走代理访问国外网站,需要设置wsl环境变量

bash
host_ip=$(cat /etc/resolv.conf |grep "nameserver" |cut -f 2 -d " ") export all_proxy="socks5://$host_ip:7890" export https_proxy="http://${host_ip}:7890" export http_proxy="http://${host_ip}:7890"

host_ip为主机ip,/etc/resolv.conf 中存有wsl的dns地址,也就是主机地址,7890 为主机的代理端口,将上述脚本保存为 .proxyrc,需要使用时 source .proxyrc 启动代理或者直接写入 ~/.bashrc 启动bash时自动运行即可。

为 apt 配置代理

写入 all_proxy 等环境变量后,为保证apt获取包时正常使用,同样需要在 /etc/apt/apt.conf.d/proxy.conf 中写入相关配置,并且由于每次wsl重新启动时dns地址会改变,因此将地址写成bash启动脚本的形式。在用户目录 ~ 下先写好脚本 (位置随意)

bash
cutelemon6@Cutelemon6-laptop:~$ nano update_proxy.sh

写入以下内容:

bash
#!/bin/bash # 读取 /etc/resolv.conf 文件中的 DNS 服务器地址,即为windows为wsl虚拟的网关地址 dns_servers=$(cat /etc/resolv.conf | grep "nameserver" | cut -f 2 -d " ") # 设置代理端口 proxy_port="7890" # hint echo "type password for update proxy:" # 创建或清空 proxy.conf 文件 sudo sh -c 'echo -n "" > /etc/apt/apt.conf.d/proxy.conf' # 写入 proxy.conf 文件 sudo sh -c "echo 'Acquire::http::Proxy \"http://$dns_servers:$proxy_port\";' >> /etc/apt/apt.conf.d/proxy.conf" sudo sh -c "echo 'Acquire::https::Proxy \"http://$dns_servers:$proxy_port\";' >> /etc/apt/apt.conf.d/proxy.conf" echo "Proxy configuration has been updated in /etc/apt/apt.conf.d/proxy.conf"

添加执行权限

bash
chmod +x update_proxy.sh

写入 .bashrc

bash
# add proxy update /home/cutelemon6/update_proxy.sh

注意点

  1. clash--常规--允许局域网接入clash
  2. 检查windows防火墙,如果当前网络是公共网络,需要允许在公共网络下访问clash(入站规则):控制面板--系统和安全--Windows Defender 防火墙--高级设置--入站规则--Clash for Windows 和 clsh-win64 -- (公用网络配置文件)允许连接

其它tips

  1. win + r + resmon打开windows资源监视器--网络--侦听端口,可查看被占用的端口,其中包含了clash代理使用的端口

  2. 可用 telnet [ip] [port] 命令测试wsl能否访问到端口,以下为访问成功的情况

    bash
    cutelemon6@Cutelemon6-laptop:~$ telnet 172.20.48.1 7890 Trying 172.20.48.1... Connected to 172.20.48.1. Escape character is '^]'.

    enter键退出

  3. 如何说明这个局域网中主机相当于是网关?使用 traceroute 命令(其利用icmp差错报告报文--时间超过来设计)

    bash
    cutelemon6@Cutelemon6-laptop:~$ traceroute baidu.com traceroute to baidu.com (39.156.66.10), 30 hops max, 60 byte packets 1 Cutelemon6-laptop.mshome.net (172.20.48.1) 0.317 ms 0.110 ms 0.084 ms 2 10.106.128.1 (10.106.128.1) 2.930 ms 2.988 ms 2.979 ms 3 120.199.254.5 (120.199.254.5) 3.853 ms 3.826 ms 3.801 ms

    第一跳是主机ip,也就说明了在主机与wsl的局域网中充当了网关的角色

    参考资料

    1. 使用 WSL 访问网络应用程序 | Microsoft Learn

    2. WSL2网络代理、防火墙 - 知乎 (zhihu.com)

本文作者:cutelemon6

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!