tags:

  • wsl
  • vscode
  • 网络配置
    date: 2024-01-31
    number headings: auto, first-level 1, max 6, start-at 1, 1.1

wsl的最新版已经支持用图形化界面进行桥接设置,本教程仅适用于旧版

– 更新于2024.10.11

0.1 参考

[WSL 2] NIC Bridge mode 🖧 (Has TCP Workaround🔨) · Issue #4150 · microsoft/WSL (github.com)
WSL2 使用桥接网络上网与DNS的配置_wsl dns设置-CSDN博客
wsl2 + bridge 固定ip终极方案 - ywhb - 博客园 (cnblogs.com)
WSL2使用桥接网络,并指定IP - 流年灬似氺 - 博客园 (cnblogs.com)
Win11将WSL做SSH服务器,实现通过局域网SSH远程连接到WSL上,并且开机自动启动,手把手教学_wsl ssh-CSDN博客

1 目标

WSL 2 在物理机上进行了 NAT,而不是将其桥接到主机的同一局域网。我的目标是让 WSL 2 中的 Ubuntu 中运行的服务可以从本地网络上的任何位置访问。

2 创建虚拟网桥

2.1 开启 Hype-V

前提:使用windows 专业版,家庭版请参考这里

在控制面板中启用Hyper-V

请添加图片描述

2.2 使用Hyper-V 管理器配置虚拟交换机

在开始菜单搜索Hyper-V管理器

请添加图片描述
请添加图片描述

新建一个虚拟交换机,选择外部

请添加图片描述

请添加图片描述

名称可以自定义,这里设置为WslBridge, 选择自己要桥接到的网卡名称

请添加图片描述

3 配置 wsl2 为桥接模式

3.1 在windows中配置

在文件资源管理器的地址栏输入`%UserProfile%

请添加图片描述

新建.wslconfig,此文件默认为空,修改其中内容为下

[wsl2]
networkingMode=bridged  # 设置桥接模式
vmSwitch=WslBridge      # Hyper-V中建立的虚拟交换机名        
dhcp=false              # 关闭动态IP
[boot]
systemd=true            # 启用systemctl命令

启动wsl

3.2 在wsl中配置

执行 sudo vim /usr/lib/systemd/network/wsl_external.network 修改如下

注意 :当在.wslconfig中设置dhcp=false时会读取 /lib/systemd/network/wsl_external.network 的网络配置

[Match] 
Name=eth0 
[Network] 
Description=Ubuntu 
DHCP=false 
Address=192.168.1.137/24 # 设置为自己想设置的静态ip地址
Gateway=192.168.1.254    # 本地网关地址
DNS=8.8.8.8, 114.114.114.114

重启网络

sudo systemctl enable systemd-networkd # 设置网络服务开机自启动
sudo systemctl restart systemd-networkd

你会发现eth0已经为自定义的网络了

4 修改并固定DNS设置

直接使用桥接可能导致无法使用域名进行网络请求,需要修改DNS配置

4.1 修改DNS服务器

打开/etc/systemd/resolved.conf

取消注释 [Resolve] 里 DNS 那行,然后改成

DNS=8.8.8.8 114.114.114.114

重启域名解析服务

systemctl restart systemd-resolved
systemctl enable systemd-resolved

建立软链接

mv /etc/resolv.conf /etc/resolv.conf.bak ln -s /run/systemd/resolve/resolv.conf /etc/

4.2 注

为什么不直接更改 /etc/resolv.conf
直接更改后,重启 WSL 会自动恢复

4.3 固定dns设置

关闭wsl2的自动生成resolv.conf,避免覆盖刚刚建立的软链接

/etc/wsl.confvs加入

[network] 
generateResolvConf = false

4.4 重启wsl

wsl --shutdown

5 桥接模式下wsl2的ssh配置

桥接模式下,vscode中的wsl插件会无法正常工作,所以需要配置wsl的ssh连接,如果想查看如何在Nat模式下,从外部用ssh服务访问wsl,可以查看这里)

5.1 在WSL上安装OpenSSH

首先需要重装openssh,因为wsl中自带的ssh服务器无法正常工作,在wsl中执行如下命令

sudo apt-get remove openssh-server
sudo apt-get install openssh-server

卸载旧版本,安装新版本

5.2 修改ssh的配置文件

sudo vi /etc/ssh/sshd_config

将下面三项设置成(原本是被注释掉的):

  • Port 22
  • PermitRootLogin Yes
  • PasswordAuthentication Yes

5.3 重启ssh服务

sudo service ssh --full-restart

5.4 配置wsl开机自动启动ssh服务

sudo systemctl enable ssh

如果要关闭ssh的开机启动,运行以下命令

sudo systemctl disable ssh

6 配置vscode连接wsl

ifconig 查看wsl当前的ip地址

请添加图片描述

使用remote-ssh插件连接wsl

请添加图片描述

7 恢复Nat模式

在日常使用中,我们可能需要切换回nat模式

  1. .wslconfig中的配置信息修改为如下
[wsl2]
networkingMode=nat
vmSwitch=Default Switch
autoProxy=false
dnsTunneling=false
dhcp=true # 允许动态分配
ipv6=true
  1. 在控制面板中禁用虚拟网卡WslBridge,即之前创建的虚拟交换机后

请添加图片描述

  1. 重启以太网(禁用后再启用)
  2. 在wsl中执行`sudo rm /usr/lib/systemd/network/wsl_external.network
  3. 重启wsl
wsl --shutdown & wsl

8 写在最后

若无需外部访问wsl,推荐使用镜像模式,有关镜像模式的详情请看这里
想了解wsl的桥接模式原理,可以点击这里

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐