WSL 2 网络配置

2023-11-12

WSL 2 访问局域网内设备

WSL 2 访问本机 Windows

由于 WSL 2 基于 Hyper-V,其与宿主 Windows 的关系可以看作是同一网络下的不同主机。要实现 WSL 2 到 Windows 的通信,首先要让 WSL 2 知道 Windows 的 IP 地址。

在 Windows 中,打开终端,执行 ipconfig,可以看到 WSL 相关的网络信息:


需要注意的是,在没有特殊配置的情况下,电脑的 IP 地址通常会随网络环境的变化而变化,此处及后文的 IP 地址仅供参考,具体 IP 地址需要以自己实际操作时的输出为准。

通过 ipconfig 的输出可以发现,在 Windows-WSL 2 这一体系中,Windows 的 IP 地址为 192.168.176.1

Linux 系统中,/etc/resolv.conf 为 DNS 配置文件,对于 WSL 2 也是如此。在 WSL 2 中,执行 cat /etc/resolv.conf,查看其中的内容:


可以发现,此处指向的 DNS 服务器 IP 为 192.168.176.1,正是 Windows 的 IP,说明 WSL 2 是借助 Windows 去寻找真正的 DNS 服务器的。

可以尝试在 WSL 2 中 ping Windows,即执行 ping `cat /etc/resolv.conf | grep nameserver | awk '{print $2}'`,能 ping 通即表示 WSL 2 能通过网络访问 Windows。

因为每次启动 WSL 2 都会重新分配虚拟网络,可以在 ~/.bashrc 中加入 Windows 网络相关环境变量,便于后续使用:

# Windows 宿主机 IP
WINDOWS_IP=$(grep nameserver /etc/resolv.conf | awk '{print $2}' | head -1)
# Windows 宿主机代理端口
WINDOWS_PROXY_PORT=7890

# 更新 Windows 网络信息
function update_windows_net_info() {
    WINDOWS_IP=$(grep nameserver /etc/resolv.conf | awk '{print $2}' | head -1)
    WINDOWS_PROXY_PORT=7890
}

如果有需要的话,还可以在 update_windows_net_info 中将 Windows 的 IP 地址写入 /etc/hosts

WSL 2 访问非本机 Windows 设备

如果局域网内非本机 Windows 设备开放了防火墙入站,WSL 2 无需额外配置就能直接访问。

局域网内设备访问 WSL 2

本机 Windows 访问 WSL 2

本机 Windows 可以直接通过 localhost 访问 WSL 2。

非本机 Windows 设备访问 WSL 2

要实现局域网内非本机 Windows 设备访问 WSL 2,需要在 Windows 上配置端口转发以及防火墙入站规则。

为了便于操作,可以将配置端口转发和防火墙入站规则的操作封装成函数,在 Windows PowerShell 的配置文件 PROFILE 中添加以下内容:

# 添加 WSL 端口转发以及防火墙入站规则
function Add-WSLPortForwarding ($Port = '23333', $Protocol = 'TCP') {
    $WSLIP = wsl -- hostname -I
    $WSLIP = $WSLIP.Trim()
    netsh interface portproxy add v4tov4 listenport=$Port connectaddress=$WSLIP connectport=$Port
    New-NetFirewallRule -DisplayName "Allow ${Protocol} Inbound Port ${Port}" -Direction Inbound -Action Allow -Protocol $Protocol -LocalPort $Port
}

# 移除 WSL 端口转发以及防火墙入站规则
function Remove-WSLPortForwarding ($Port = '23333', $Protocol = 'TCP') {
    netsh interface portproxy delete v4tov4 listenport=$Port
    Remove-NetFirewallRule -DisplayName "Allow ${Protocol} Inbound Port ${Port}"
}

其中添加和移除函数都有两个参数,端口号和协议。端口号默认为 23333,协议默认为 TCP。

使用时需要以管理员权限执行。参考使用方式如下:

Add-WSLPortForwarding -Port 22 # 开启 TCP 协议 22 端口 的转发
Remove-WSLPortForwarding -Port 22 # 移除 TCP 协议 22 端口 的转发
Add-WSLPortForwarding -Port 23334 -Protocol UDP # 开启 UDP 协议 23334 端口 的转发
Remove-WSLPortForwarding -Port 23334 -Protocol UDP # 移除 UDP 协议 23334 端口 的转发

如果希望通过 ssh 访问 WSL 2,可以参考以下几个步骤:

  1. WSL 2 安装 ssh server

如果 WSL 2 中没有 ssh server,可以通过以下命令安装:

sudo apt install openssh-server
  1. WSL 2 配置 sshd

打开 /etc/ssh/sshd_config 文件,确认以下几个配置:

  • Port:监听端口,默认为 22,如果担心和本机 Windows 冲突也可以修改为其它端口
  • ListenAddress:监听 IP 地址,默认为 0.0.0.0,即所有 IP
  • PasswordAuthentication:是否开启密码认证,默认为 no,如果想通过密码登录就需要设为 yes

修改配置后,需要重启 ssh:

sudo service ssh restart

如果希望 ssh 能开机自启,可以执行:

sudo systemctl enable ssh
  1. 其它设备通过 ssh 访问 WSL 2

先在 Windows 中开启端口转发和防火墙入站:

Add-WSLPortForwarding -Port <sshd_port> # 端口号为 WSL 2 中 sshd 配置的端口号

之后就可以在其它设备中通过 ssh 访问 WSL 2 了:

ssh <username>@<windows_ip> -p <sshd_port>

WSL 2 使用本机 Windows 中的代理

由于种种原因,一般的网络环境访问诸如 github 等网站时往往速度很慢,甚至无法连接,这时就可以使用网络代理。

WSL 2 使用代理通常有两种思路:

  1. 直接在 WSL 2 环境下借助 v2ray 等软件访问代理
  2. WSL 2 将需要使用代理的请求转发至本机 Windows 中配置的代理

可以根据个人需要进行选择。

本文介绍我所使用的第二种的配置方法,前置条件是 WSL 2 能够访问本机 Windows,请先阅读那一部分内容。

Windows 代理客户端配置

Windows 中的代理客户端需要开启允许来自局域网的连接。

以 Clash for Windows 为例,勾选 Allow LAN 即可:


如果是 v2rayN 的话,勾选允许来自局域网的连接即可:


事实上,开启这个选项后,同一局域网中其它非 WSL 2 的设备也都能通过 Windows 在局域网中的 IP 地址和代理端口号来使用代理。

WSL 2 代理配置

接下来介绍两种使用代理的方法,分别是代理环境变量和 proxychains 代理工具。两种方法有各自适用的场景,根据需要选择使用即可。

方法一:代理环境变量

Linux 中有诸如 HTTP_PROXYFTP_PROXY 等环境变量来表示代理,在需要使用代理时给这些环境变量赋值即可。

我将代理环境变量的赋值与删除封装成了函数,用于批量使用代理的场景。

~/.bashrc 中添加以下内容:

# 开启代理
function proxy_on() {
    export HTTP_PROXY="http://${WINDOWS_IP}:${WINDOWS_PROXY_PORT}" # http 或 socks5,取决于代理的协议
    export HTTPS_PROXY="http://${WINDOWS_IP}:${WINDOWS_PROXY_PORT}" # http 或 socks5,取决于代理的协议
    export ALL_PROXY="http://${WINDOWS_IP}:${WINDOWS_PROXY_PORT}" # http 或 socks5,取决于代理的协议
    echo -e "Acquire::http::Proxy \"http://${WINDOWS_IP}:${WINDOWS_PROXY_PORT}\";" | sudo tee -a /etc/apt/apt.conf.d/proxy.conf > /dev/null
    echo -e "Acquire::https::Proxy \"http://${WINDOWS_IP}:${WINDOWS_PROXY_PORT}\";" | sudo tee -a /etc/apt/apt.conf.d/proxy.conf > /dev/null
    proxy_status
}

# 关闭代理
function proxy_off() {
    unset HTTP_PROXY
    unset HTTPS_PROXY
    unset ALL_PROXY
    sudo sed -i -e '/Acquire::http::Proxy/d' /etc/apt/apt.conf.d/proxy.conf
    sudo sed -i -e '/Acquire::https::Proxy/d' /etc/apt/apt.conf.d/proxy.conf
    proxy_status
}

# 代理状态
function proxy_status() {
    echo "HTTP_PROXY:" "${HTTP_PROXY}"
    echo "HTTPS_PROXY:" "${HTTPS_PROXY}"
    echo "ALL_PROXY:" "${ALL_PROXY}"
}

proxy_on 表示开启代理(包括 apt),proxy_off 表示关闭代理,proxy_status 为查看当前代理状态。

使用方法如下:

proxy_on
<command> # 需要使用代理的操作
proxy_off

测试效果如下:


需要注意的是这种方法开启的代理只作用于当前终端会话。

方法二:proxychains 代理工具

proxychains 是为 UNIX 类系统开发的代理工具,支持 HTTP、SOCKS4a/5 等类型的代理。

可以直接通过 apt 进行安装:

sudo apt install proxychains4

proxychains 默认使用 /etc/proxychains4.conf 这一配置文件,我们主要关注底部的代理列表:

[ProxyList]
# add proxy here ...
# meanwile
# defaults set to "tor"
socks4        127.0.0.1 9050

从左到右分别是代理协议、IP 地址、端口。

要使用 Windows 中的代理,就要在 proxychains 的配置文件中写上 Windows 对 WSL 2 开放的 IP 地址,不过需要注意的是,此 IP 地址默认情况下会在每次启动 WSL 2 时动态生成。

与方法一类似,同样是借助函数实现自动配置,在 ~/.bashrc 中添加以下内容:

# 更新 proxychains 代理配置
function update_proxychains_conf() {
    # 删除 ~/.config/proxychains4/proxychains4.conf 中 [ProxyList] 所在行到文件末尾的全部内容
    sed -i '/\[ProxyList\]/,$d' ~/.config/proxychains4/proxychains4.conf
    # 往 ~/.config/proxychains4/proxychains4.conf 文件末尾追加代理配置
    echo "[ProxyList]" | tee -a ~/.config/proxychains4/proxychains4.conf > /dev/null
    echo "http ${WINDOWS_IP} ${WINDOWS_PROXY_PORT}" | tee -a ~/.config/proxychains4/proxychains4.conf > /dev/null
    echo "socks5 ${WINDOWS_IP} ${WINDOWS_PROXY_PORT}" | tee -a ~/.config/proxychains4/proxychains4.conf > /dev/null
}

update_proxychains_conf

alias pc='proxychains4 -f ~/.config/proxychains4/proxychains4.conf'

因为编辑 /etc/ 目录下的文件需要管理员权限,为了避免一进入 WSL 2 就执行 sudo,可以拷贝一份默认配置文件放到当前用户目录下,作为 proxychains 读取的配置文件。

此处以 ~/.config/proxychains4/proxychains4.conf 为例,并设置了一个命令别名来简化使用。

这样就能在每次启动 WSL 2 时自动获取 Windows 网络相关信息并写入 proxychains 配置文件。

使用方法如下:

pc <command> # 需要使用代理的操作

测试效果如下:


问题记录

WSL 2 无法通过网络访问本机 Windows,ping 不通

如果在 WSL 2 中无法 ping 通 Windows,可能是由于默认情况下 Windows 防火墙会阻止 WSL 2 对 Windows 的网络访问。

需要在 Windows 中,以管理员身份打开终端,然后执行以下命令,添加一条防火墙规则允许 WSL 2 对 Windows 的入方向访问:

New-NetFirewallRule -DisplayName "WSL" -Direction Inbound  -InterfaceAlias "vEthernet (WSL)"  -Action Allow

上述命令的示例输出如下:


查看 Windows 防火墙的高级设置,在入站规则中,已经新增了一条名称为 WSL 的规则:


这时再尝试 ping Windows,可以看到已经能 ping 通了:


代理客户端已经开启了允许来自局域网的连接,但 WSL 2 中还是不能连接代理

有可能是 Windows 防火墙规则中没有代理客户端的放行规则。

以 Clash for Windows 为例,防火墙入站规则中需要有相关规则:


如果是 v2rayN 的话,同样需要有相关规则:


其它软件同理。

参考文档

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

Add “allow” rule to Windows firewall for WSL2 network · Issue #4585 · microsoft/WSL (github.com)

haad/proxychains: proxychains - a tool that forces any TCP connection made by any given application to follow through proxy like TOR or any other SOCKS4, SOCKS5 or HTTP(S) proxy. Supported auth-types: “user/pass” for SOCKS4/5, “basic” for HTTP. (github.com)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WSL 2 网络配置 的相关文章

随机推荐

  • Chrome 扩展程序开发

    按chrome开发规范 我们首先建一个文件夹 如D AutoClickDemo 在该文件夹下新建一个名为manifest json的文本文件 并按实际情况放一个图片文件 作为插件的图标 然后新建一个名为myscript js的js脚本文件
  • SQL查询一个表中根据其中一个列的属性来拼接多个列并SELECT INTO 新表显示

    将同一个表中 不同 Group 属性的添加列分成一整行 SELECT INTO VP Temp FROM SELECT DISTINCT A ID A TypeName A ItemType A isBad A sNo sNo1 A Che
  • C++ 类的静态成员详细讲解

    在C 中 静态成员是属于整个类的而不是某个对象 静态成员变量只存储一份供所有对象共用 所以在所有对象中都可以共享它 使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则 保证了安全性还可以节省内存 静态成员的定义或声明要加个关键st
  • C++控制台输入

    我们在刷牛客网的题目时 经常遇到多组输入 执行到文件结束 下面介绍几种写法 1 C语言的输入多个整数 while scanf d n EOF 为End Of File的缩写 通常在文本的最后存在此字符表示资料结束 code 2 C 输入字符
  • PyQt实现图形化界面的视频播放

    PyQt实现图形化界面的视频播放 PyQt是一款流行的Python GUI库 它可以与Python的许多其他工具和库结合使用 OpenCV是一个功能强大的计算机视觉库 可以处理图像和视频 本文将介绍如何结合使用PyQt和OpenCV来创建一
  • SSL单双向认证

    一 TLS SSL协议 HTTPS协议是在HTTP TLS SSL协议组成的可进行加密传输 身份认证的网络协议 旨在保证数据传输过程中的保密性 完整性和安全性 HTTPS在HTTP和TCP之间 增加了TLS SSL协议 正是通过TLS协议
  • Property xxx was accessed during render but is not defined on instance

    vue3 x版本在结合element plus使用如果使用了表单元素以及v model指令会在控制台看到类似的警告 虽然不影响js运行 但是对于强迫症玩家难受的不行 下面我们来看一下这个问题是如何产生的 应该怎么解决 原因 vue3 x版本
  • HDFS加密区加密过程

    HDFS加密区 encryption zone 中的每个文件都使用唯一的数据加密密钥 data encryption key DEK 进行加密 明文DEK被区域级加密密钥 加密区密钥 encryption zone key EZK 加密成加
  • 灵感爆发:An/flash 影片剪辑动画播放一遍后,摆脱paly()的控制

    有一个影片剪辑我只想让他播放一次就停下来 但是我的播放按钮 就一个命令 this play 现在有个矛盾 播放按钮和暂停按钮都在 暂停在影片剪辑动画的中间还好 但是不小心暂停在最后一帧 在播放就会从头 播放按钮只有一个功能就是从当前帧继续播
  • MySQL高阶语句(三)

    一 NULL值 在 SQL 语句使用过程中 经常会碰到 NULL 这几个字符 通常使用 NULL 来表示缺失 的值 也就是在表中该字段是没有值的 如果在创建表时 限制某些字段不为空 则可以使用 NOT NULL 关键字 不使用则默认可以为空
  • Webpack 4.X 配置cdn加载资源

    众所周知 SPA单页应用 首次访问需要加载近全部资源 从而导致首页渲染速度很慢 继而 出现很多性能优化方案 图片 资源懒加载 减少http请求 减小请求资源大小 减少dom操作避免触发回流重绘 gzip压缩 cdn加载等等 今天 我们就具体
  • 使用OpenSSL搭建CA

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 一 SSL TLS 1 机密性 数据加密 对称加密 2 完整性 保证数据不会被篡改 或是因为数据传输丢失 单向加密 提高特征码 附加到数据后 3 可靠性 二 概述 如何实现
  • ubuntu 18.04 校园网连接问题:MAC物理地址不匹配。

    ifconfig belong to net tools net tools have been removed in Ubuntu 18 04 so we need to install net tools by hand Notice
  • Stable Diffusion实现AI绘画,尝试向实际业务迈进...

    前置 由于处于学习初期 懂得较少以及可能会出现理解错误等情况 故而文章仅供参考学习使用 旨在分享知识 共同学习 不能作为依据 如有错误 感谢指出 文章主题分为两部分 学习部分也就理论知识 实践部分主要包括问题及解决方案 一 Stable D
  • less-loader 报错

    当vue页面中初次使用了 lang less 通常会报错 信息比如 Module not found Error Can t resolve xxxxxxxx node modules less loader dist cjs js 此时需
  • 多元线性回归模型可视化

    绘制平面图 绘制 房价 与 房价面积 及 房间数量 之间关系的散点图 import numpy as np import matplotlib pyplot as plt from mpl toolkits mplot3d import A
  • 通俗理解数字签名,数字证书和https

    前言 最近在开发关于PDF合同文档电子签章的功能 大概意思就是在一份PDF合同上签名 盖章 使其具有法律效应 签章有法律效应必须满足两个条件 能够证明签名 盖章者是谁 无法抵赖 PDF合同在签章后不能被更改 在纸质合同中 由于签名字迹的不可
  • 【渗透测试笔记】之【内网渗透——CS流量隐蔽】

    文章目录 1 修改端口特征 2 修改证书特征 2 配置CDN 3 生成自定义配置文件 4 效果演示 1 修改端口特征 vim teamserver 将默认端口修改 Dcobaltstrike server port 54321 2 修改证书
  • C++入门——命名空间

    文章目录 前言 命名空间的定义 命名空间的使用 前言 在c c 中 会有变量 函数以及后面的类 这些名称都要存在于局部的 可能会有冲突 所以使用命名空间的意义就是 对标识符的名称进行本地化 以避免命名冲突或者名字的污染 namespace关
  • WSL 2 网络配置

    文章目录 WSL 2 访问局域网内设备 WSL 2 访问本机 Windows WSL 2 访问非本机 Windows 设备 局域网内设备访问 WSL 2 本机 Windows 访问 WSL 2 非本机 Windows 设备访问 WSL 2