V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
tuoov
V2EX  ›  宽带症候群

请教我设置 WSL2 网络代理

  •  1
     
  •   tuoov · 225 天前 · 3927 次点击
    这是一个创建于 225 天前的主题,其中的信息可能已经有所发展或是发生改变。

    尝试给 WSL 设置代理,试了这两种方法都没有成功,哪位 V 友能帮我指点指点?

    一、设置 wslconfig

    [wsl2]
    networkingMode=mirrored
    firewall=true
    dnsTunneling=true
    autoProxy=true
    

    设置之后启动 WSL 报错: 不支持镜像网络模式,正在回退到 NAT 网络

    二、设置 http_proxy

    host_ip=$(cat /etc/resolv.conf |grep "nameserver" |cut -f 2 -d " ")
    
    export http_proxy='http://192.168.10.1:18888'
    export https_proxy='http://192.168.10.1:18888'
    

    设置之后执行 wget www.google.com, 一直在Connecting to 192.168.10.1:18888。 我代理软件开启了 “Allow LAN” 选项,防火墙设置了专业网络和公共网络都可通信。实在不知道还能怎么办了

    第 1 条附言  ·  225 天前

    感谢各位的帮助,设置 http_proxy 的方式暂时能用了。

    如果你遇到了这个问题,请参考:

    1. 在 WSL 中执行 ip route show | grep -i default | awk '{ print $3}', 返回的 IP 是 Windows 宿主机的 IP。它的值应该和在 Windows 中执行 ipconfg 返回的 WSL 的 IPv4 地址相同
    2. export http_proxy='http://{第一步中的 IP 地址}:port', 执行 wget www.google.com, 应该能访问成功
    3. 开启 Clash 的 Tun 模式无效(但你的情况可能不一样)
    4. 这是我的 Windows 和 WSL 版本,这个版本无法通过配置 .wslconfig 解决代理问题。如果你想用这种方法,记得检查版本:
    WSL 版本: 2.2.1.0
    Windows 版本: 10.0.19045.4170
    
    第 2 条附言  ·  29 天前
    目前最佳方案: https://github.com/sakai135/wsl-vpnkit
    不需要改配置写脚本,按照 readme 执行即可。
    29 条回复    2024-10-06 10:17:19 +08:00
    justsomac
        1
    justsomac  
       225 天前
    系统太旧,不支持,升级系统
    Goooooos
        2
    Goooooos  
       225 天前
    确认下宿主机的 IP ,我的可以正常访问宿主机的 socks5 代理
    storyxc
        3
    storyxc  
       225 天前
    可以参考下 /t/975098
    tuoov
        4
    tuoov  
    OP
       225 天前
    @Goooooos 除了看 `/etc/resolv.conf`还有什么办法可以检查宿主机 IP 吗?
    Goooooos
        5
    Goooooos  
       225 天前   ❤️ 1
    @tuoov

    ip route show
    body007
        6
    body007  
       225 天前   ❤️ 1
    直接 ipconfig 找到 win 系统的 WSL 网卡 ip ,在 wsl 里面用这个 ip ,我这边可以成功。

    yushiro
        7
    yushiro  
       225 天前 via iPhone
    wsl 里面装个 v2raya ,默认全局代理,不需要配置任何环境变量
    chinaguaiu
        8
    chinaguaiu  
       225 天前
    老实说我就是像你这么干的,就是每次启动 wsl 都要看/etc/resolv.conf 很折磨
    chinaguaiu
        9
    chinaguaiu  
       225 天前
    你不妨确认一下代理软件的端口有没有设置好,仔细看一下,可能端口被重置掉了
    chensuixiang
        10
    chensuixiang  
       225 天前
    //注意写本机地址
    export ALL_PROXY="http://本机 ip:7890"
    //测试
    curl https://www:google.com
    //取消代理
    export ALL_PROXY=

    我之前是这样的,本机开的 clash 端口 7890 ,然后到 wsl2 上输入上面 export 命令。缺点是一次性的,每次重启 wsl2 如果要代理都得手动输入一遍。至于 Allow LAN 开不开,忘了,不过之前我确实可行的
    uliah
        11
    uliah  
       225 天前   ❤️ 1
    可以在 profile 或 bashrc 里面获取一下网关

    GATEWAY=`ip route show default|awk '{print $3}'`

    tee ~/.ssh/config <<EOF
    Host opendev.org
    User git
    ProxyCommand nc -v -x ${GATEWAY}:1081 %h %p
    EOF

    tee ~/.gitconfig <<EOF
    [credential]
    helper = store
    [gitreview]
    username = hailu
    [https]
    proxy = http://${GATEWAY}:1081
    [http]
    proxy = http://${GATEWAY}:1081
    EOF

    export HTTP_PROXY=http://${GATEWAY}:1081
    export HTTPS_PROXY=http://${GATEWAY}:1081
    SuperMaskv
        12
    SuperMaskv  
       225 天前   ❤️ 1
    ```bash
    #!/bin/sh
    hostip=$(cat /etc/resolv.conf | grep nameserver | awk '{ print $2 }')
    wslip=$(hostname -I | awk '{print $1}')
    port=10800

    PROXY_HTTP="http://${hostip}:${port}"

    set_proxy(){
    export http_proxy="${PROXY_HTTP}"
    export HTTP_PROXY="${PROXY_HTTP}"

    export https_proxy="${PROXY_HTTP}"
    export HTTPS_proxy="${PROXY_HTTP}"

    git config --global http.proxy "${PROXY_HTTP}"
    git config --global https.proxy "${PROXY_HTTP}"
    }

    unset_proxy(){
    unset http_proxy
    unset HTTP_PROXY
    unset https_proxy
    unset HTTPS_PROXY
    git config --global --unset http.proxy
    git config --global --unset https.proxy
    }

    test_setting(){
    echo "Host ip:" ${hostip}
    echo "WSL ip:" ${wslip}
    echo "Current proxy:" $https_proxy
    }

    if [ "$1" = "set" ]
    then
    set_proxy

    elif [ "$1" = "unset" ]
    then
    unset_proxy

    elif [ "$1" = "test" ]
    then
    test_setting
    else
    echo "Unsupported arguments."
    fi
    ```bash
    这段脚本是我自己在用的,同时设置了 shell 的代理和 git 的代理。
    启用代理就`. ./proxy.sh set` ,禁用就`. ./proxy unset`,查看当前状态就`. ./proxy test`
    kaleido
        13
    kaleido  
       225 天前
    没人用 clash 的 tun 吗,啥也不用设置,打开 tun 模式就完了
    mclxly
        14
    mclxly  
       225 天前
    我每次按需手动执行:

    export http_proxy=socks5://[宿主机 IP]:2080 https_proxy=socks5://[宿主机 IP]:2080
    cslive
        15
    cslive  
       225 天前
    打开 tun 模式完事
    alexsz
        16
    alexsz  
       225 天前
    供参考:
    我使用 win11 + clash-verge + WSL2 ,系统代理模式
    WSL2 的网络代理工作正常
    我的.wslconfig 文件内容如下:
    [experimental]
    autoMemoryReclaim=gradual
    networkingMode=mirrored
    dnsTunneling=true
    firewall=false
    autoProxy=true
    selca
        17
    selca  
       225 天前
    proxychains4
    Goooooos
        18
    Goooooos  
       225 天前
    @chinaguaiu 不需要,新版 wsl2 宿主机 ip 不会乱变

    而且把 OP 的第二部的代码放到.bashrc 也行


    export hostip=$(cat /etc/resolv.conf |grep -oP '(?<=nameserver\ ).*')
    export https_proxy="http://${hostip}:7890"
    export http_proxy="http://${hostip}:7890"
    eaststarpen
        19
    eaststarpen  
       225 天前
    我有一个暴力做法

    wsl 的环境变量是包含 windows host 的环境变量的; 就是说可以直接在 wsl bash 里运行 windows 命令

    我之前的做法是 ipconfig.exe 获取宿主机 ip, 而且可以直接通过管道同时运行 Windows 和 wsl 指令, 如 "ipconfig.exe | grep -i ipv4"
    heiher
        20
    heiher  
       225 天前
    我之前在 WSL2 上实测过 tun2socks 方式可以: https://github.com/heiher/hev-socks5-tunnel
    MortonL
        21
    MortonL  
       225 天前
    使用的 clash 的 tun 模式
    eaststarpen
        22
    eaststarpen  
       225 天前
    但是不管是 tun 还是设置 http_proxy 环境变量, 总有一些应用无法代理, 或者代理效果不理想 (主要是 neovim update 和 npm install; 我 git 和 npm 都设置代理变量了); 我后来的做法是路由器透明代理
    zed1018
        23
    zed1018  
       225 天前
    不支持 mirrored network 是因为你系统版本太老了
    sjkdsfkkfd
        24
    sjkdsfkkfd  
       225 天前
    一律建议在路由器上搞代理,完全透明,支持任何设备,任何环境
    listenerri
        25
    listenerri  
       225 天前 via Android   ❤️ 1
    推荐下我的方法,用着挺爽,我是在 .bashrc 里声明两个交互式函数:
    - http-proxy-set 用于普通 linux 下设置代理,默认值 127.0.0.1:1080 ,临时要用其他的就手动输入,不然直接回车就行
    - http-proxy-set-wsl 用于在 wsl 里设置代理,默认值 IP 取自 wsl 网关,也就是 win 主机本身,一般直接回车

    链接分别为:
    - https://github.com/listenerri/dotfiles/blob/0a8e14a2aa6dbea3477af39dee53b7538fcf2a47/bashrc#L287
    - https://github.com/listenerri/dotfiles/blob/0a8e14a2aa6dbea3477af39dee53b7538fcf2a47/bashrc#L306

    再赠送一个 http-proxy-unset:
    - https://github.com/listenerri/dotfiles/blob/0a8e14a2aa6dbea3477af39dee53b7538fcf2a47/bashrc#L328

    三个函数定义其实都在同一个文件里,挨着呢
    dxcqcv
        26
    dxcqcv  
       130 天前
    研究了好久,如果用 socks5 和 privoxy 代理的话,要记得开启`listen-address 0.0.0.0:8118`
    pierrec
        27
    pierrec  
       128 天前
    借楼问个关联问题,网上爬文设置了镜像网络,但是宿主机器无法通过浏览器访问容器的镜像了,镜像网络是生效的,因为 immich 的 remote machine learning 工作了。在设置镜像网络之前是没法工作的,但是可以通过 HTTP://localhost:port 访问 porainer 。不知道有什么解决方案,或者有什么关键词。折腾一天了。

    虽然初衷只是帮助孱弱的 nas 识别人面,但有可能的话,还是像看看怎么彻底设置好。

    win11 ,23h2 ,wsl 最新版,cfw 不是 tun 模式,docker desktop 使用代理是没问题的。
    pierrec
        28
    pierrec  
       128 天前
    @pierrec 暂时成功使用 ip 访问了,不需要禁用 iptable ,不用 host 模式创建容器。
    Limoncrist
        29
    Limoncrist  
       32 天前   ❤️ 1
    @kaleido it worked !
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2376 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 16:08 · PVG 00:08 · LAX 08:08 · JFK 11:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.