所有文章阅读量次
UP | HOME

VirtualBox Debian12 虚拟机流量走 Windows 主机 WireGuard 完整教程

前置环境说明

  • 宿主机:Windows,安装官方 WireGuard for Windows GUI
  • 虚拟化:VirtualBox
  • 虚拟机:Debian 12 (Bookworm)
  • 目标需求:让 Debian 虚拟机网络流量经由 Windows 上 WireGuard 隧道转发
  • 重要区分两个路线:
    1. 方案A:全局隧道方案|主机 + 虚拟机全部流量走 WireGuard(配置最简单,优先测试)
    2. 方案B:透明路由转发方案|仅虚拟机走 WireGuard,宿主机本身正常直连上网(复杂、隔离性好)

基础概念与底层原理

VirtualBox 三种常用网络模式原理对比

  • 1. 网络地址转换(NAT)【方案A使用】

    VirtualBox 内置 NAT 引擎。虚拟机发包先交给 VirtualBox,VirtualBox 把源IP替换成宿主机网卡IP,再交给 Windows 系统协议栈(TCP/IP 栈)处理。 => 关键点:流量会经过 Windows 的路由表! 如果 Windows 路由表配置了 0.0.0.0/0 走 WireGuard 网卡(wintun),那么 NAT 转发出来的虚拟机流量就跟着路由进入 WireGuard 隧道。 注意:不是虚拟机直接连 WireGuard,是流量经过 Windows 系统路由间接进入隧道。

  • 2. NAT网络(NAT Network)【本教程不推荐】

    VirtualBox 独立虚拟路由器,拥有独立子网、独立DHCP,它的转发逻辑独立于 Windows 主路由表。 它的流量绕过 Windows 系统路由,即便宿主机开了 WireGuard 全局,虚拟机流量也不一定进隧道,路由隔离,不适合本需求。适合多虚拟机互通场景。

  • 3. 桥接模式(Bridged Adapter)【强烈不适合本需求】

    桥接模式等于虚拟机在局域网内是一台独立设备,直接和物理交换机通信,数据包不经过 Windows 协议栈。 宿主机上的 WireGuard 抓不到、管不到桥接虚拟机的流量,无论 WireGuard 怎么配置,流量都会直出物理网卡,无法走宿主机WG隧道。

  • 4. 仅主机(Host-Only)适配器【方案B使用】

    只建立虚拟机 ↔ Windows 宿主机之间的私有局域网,虚拟机不能直接访问外网。 需要 Windows 开启 IP 转发 + NAT伪装,Windows 充当软路由器,接收虚拟机报文,查询本机路由,再转发给 WireGuard 隧道。

WireGuard 核心底层原理

WireGuard 本质是一个三层虚拟隧道(TUN 设备,Windows 下是 Wintun 驱动),不是传统应用层代理(SOCKS5/HTTP)。 它工作在内核网络栈:

  1. Windows 生成一块虚拟网卡(wg 网卡)
  2. WireGuard 读取系统路由表,匹配 AllowedIPs 网段的数据包,封装成 UDP 加密包发给对端服务器
  3. 服务器解密回程包,回传给 Windows,送入系统协议栈

> 重点:WireGuard 不“抓进程”,只看【路由表 + 数据包目标IP】,只要数据包进入本机协议栈、匹配路由,就会被隧道带走。

WireGuard 配置文件详解(.conf)

WireGuard 配置分两大块:[Interface] 本机侧、[Peer] 远端服务器侧 示例模板:

[Interface]
PrivateKey = 本机私钥
Address = 10.0.0.2/24
DNS = 1.1.1.1
MTU = 1420

[Peer]
PublicKey = 服务端公钥
Endpoint = wg-server.example.com:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25

逐项字段解释

  • [Interface] 本机配置
    • PrivateKey:本机WireGuard私钥,密钥对的一半,保密,不能泄露
    • Address:隧道内虚拟内网IP(WG隧道网段IP,不是出口公网IP)
    • DNS:隧道内使用的DNS服务器;建议填写服务端分配的DNS或者1.1.1.1、8.8.8.8
    • MTU:隧道网卡MTU,WireGuard推荐1420;因为UDP封装会增加包头,默认1500容易分片丢包
  • [Peer] 对端节点配置
    • PublicKey:WG服务端公钥,公开信息
    • Endpoint = IP/域名:端口:WireGuard 服务器外网地址+UDP端口
    • PersistentKeepalive = 25:NAT保活,家用宽带、内网环境建议加上,单位秒,防止UDP会话被路由器老化断开

AllowedIPs 深度讲解(重点,你问的 0.0.0.0/0 和 ::/0)

AllowedIPs 是 WireGuard 最重要的字段,有两层作用:

  1. 出方向:本机哪些目标网段的流量,会封装进这个WireGuard隧道发往Peer
  2. 入方向:从这个Peer回来的数据包,源IP必须匹配这个网段,否则丢弃(防欺骗)
  • 0.0.0.0/0

    IPv4 全网段。含义:所有IPv4地址的流量,匹配这条规则,走隧道。

  • ::/0

    IPv6 全网段。`::` 是IPv6的0地址,/0代表所有IPv6地址。含义:所有IPv6流量走隧道。

  • 两种写法对比
    1. AllowedIPs = 0.0.0.0/0 ✅ 全部IPv4流量走隧道 ❌ IPv6流量不受WireGuard控制,遵循系统原有路由,直接走物理网卡,会泄露真实IP
    2. AllowedIPs = 0.0.0.0/0, ::/0 ✅ IPv4 + IPv6 全部流量都进入WireGuard隧道,真正全局隧道,无泄露

    > 注意:AllowedIPs 不是“代理开关”,是内核路由匹配规则;如果只是虚拟机单独走隧道(方案B),这里**不能写0.0.0.0/0**,只写虚拟机网段。

Windows WireGuard GUI 配置文件存放位置

  • 导入隧道之后,GUI原始明文.conf不会自动保存在软件目录;软件内存储是加密DPAPI文件: C:\Program Files\WireGuard\Data\Configurations\ 里面文件无法直接记事本编辑。
  • 正确修改/导出明文:选中隧道 → 右上角 ⋮ → Edit(在线编辑) / Export(导出明文conf)
  • 修改后必须:关闭隧道 → 重新激活隧道,Windows路由表才会刷新生效

方案A:NAT模式 + WireGuard全局隧道【简单,优先测试】

适用场景

愿意让 Windows 宿主机本身也全部走 WireGuard,虚拟机跟随主机路由一起进隧道,部署最简单。

VirtualBox 设置步骤

  1. 关闭 Debian 虚拟机
  2. 设置 → 网卡1:
    • 连接方式:【网络地址转换(NAT)】
    • ❌ 不要选 NAT网络、桥接、仅主机
  3. 其他网卡可以禁用,避免干扰

WireGuard 配置要求

修改 Peer 的 AllowedIPs:

AllowedIPs = 0.0.0.0/0, ::/0

> 如果你路由器没有IPv6、不需要IPv6,只写 0.0.0.0/0 也能用,但存在IPv6流量泄露风险。

操作流程

  1. WireGuard 编辑配置,保存,重启隧道
  2. 启动 Debian12 虚拟机
  3. Debian 内部测试命令
# 查看IPv4出口公网IP
curl -4 ifconfig.me
# 查看IPv6出口公网IP(开启IPv6时使用)
curl -6 ifconfig.me

✅ 成功标准:返回IP = WireGuard服务器出口IP

优缺点

  • 优点:零额外配置、不需要改Windows注册表、不需要配置Debian静态IP、上手最快
  • 缺点:宿主机所有程序全部走WireGuard,宿主机无法直连国内网络

方案B:Host-Only + Windows IP转发 + NAT【仅虚拟机走WG,宿主机正常上网】

适用场景

宿主机保持原有上网路线,只有Debian虚拟机流量单独走WireGuard隧道,隔离度高。 > 这个方案 WireGuard 不能写 AllowedIPs = 0.0.0.0/0!

步骤1:VirtualBox 创建仅主机网卡

VirtualBox 菜单:管理 → 主机网络管理器 → 创建 记录网卡信息示例: 适配器名称:VirtualBox Host-Only Ethernet Adapter Windows侧IP:192.168.56.1/24

虚拟机网卡设置:网卡1 → 连接到:仅主机适配器,选中上面新建网卡

步骤2:Debian12 netplan 静态IP配置

Debian12 默认使用 netplan,编辑yaml

sudo nano /etc/netplan/00-installer-config.yaml

示例配置(严格yaml缩进,2空格!)

network:
  ethernets:
    enp0s3:
      addresses: [192.168.56.10/24]
      gateway4: 192.168.56.1
      nameservers:
	addresses: [1.1.1.1, 8.8.8.8]
  version: 2

应用配置

sudo netplan apply
# 可选:适配WireGuard MTU
ip link set enp0s3 mtu 1420

步骤3:Windows开启IP转发(管理员PowerShell)

# 开启系统IP转发开关,修改注册表
Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters' -Name IpEnableRouter -Value 1 -Type DWord

> 修改后必须重启Windows才生效!

步骤4:Windows NAT 配置(把虚拟机网段流量伪装转发)

# 查看网卡索引,找到WireGuard wintun网卡
Get-NetAdapter
# 创建NAT规则,内部虚拟机网段192.168.56.0/24
New-NetNat -Name WG-VM-NAT -InternalInterfaceAddressPrefix 192.168.56.0/24

步骤5:WireGuard AllowedIPs 写法(方案B重点!)

只把虚拟机网段纳入隧道,不要全局0.0.0.0/0

AllowedIPs = 192.168.56.0/24

> 含义:只有来自192.168.56.0/24(虚拟机)的流量才进WG隧道,宿主机其他流量不走隧道。

验证

Debian内:

ping 192.168.56.1
curl -4 ifconfig.me

优缺点

  • 优点:宿主机、虚拟机网络互相隔离,宿主机不受隧道影响
  • 缺点:配置繁琐、Windows NAT重启容易丢失、需要防火墙放行网段

补充方案C:代理模式 socks5(非透明代理,备选)

不使用路由转发,使用 socks5 代理。WireGuard 跑在主机,代理软件监听局域网 192.168.56.1:1080 Debian 配置环境变量:

export ALL_PROXY=socks5://192.168.56.1:1080
curl ifconfig.me
  • 简单,不用IP转发
  • 缺陷:ping、apt、部分底层工具不读取环境变量,不走代理,属于应用层代理,不是全局透明隧道

通用排错清单

  1. 确认WireGuard隧道状态:GUI内隧道显示【激活】
  2. 路由表检查:Windows管理员cmd `route print`,查看0.0.0.0路由下一跳是否指向wintun网卡
  3. 防火墙:Windows Defender防火墙放行虚拟机网段,禁止拦截转发报文
  4. MTU问题:WireGuard隧道推荐MTU=1420,MTU过大容易网页打不开、apt超时
  5. 桥接模式踩坑提醒:桥接无论如何都不能走宿主机WireGuard,直接放弃
  6. DNS泄露测试:可以在Debian安装 dnsleaktest 验证DNS是否走隧道内DNS

选择决策速查表

需求 方案 VirtualBox网卡模式 AllowedIPs写法
主机虚拟机全部走WG,省事 A 网络地址转换(NAT) 0.0.0.0/0, ::/0
仅虚拟机走WG,主机正常上网 B 仅主机Host-Only 虚拟机网段,如192.168.56.0/24
临时测试、部分软件代理 C Host-Only + socks5 按需

日期: <2026-10-21-294/Wednesday>

作者: pengshao

Created: 2026-10-22 Thu 20:50

Validate