VirtualBox Debian12 虚拟机流量走 Windows 主机 WireGuard 完整教程
前置环境说明
- 宿主机:Windows,安装官方 WireGuard for Windows GUI
- 虚拟化:VirtualBox
- 虚拟机:Debian 12 (Bookworm)
- 目标需求:让 Debian 虚拟机网络流量经由 Windows 上 WireGuard 隧道转发
- 重要区分两个路线:
- 方案A:全局隧道方案|主机 + 虚拟机全部流量走 WireGuard(配置最简单,优先测试)
- 方案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)。 它工作在内核网络栈:
- Windows 生成一块虚拟网卡(wg 网卡)
- WireGuard 读取系统路由表,匹配 AllowedIPs 网段的数据包,封装成 UDP 加密包发给对端服务器
- 服务器解密回程包,回传给 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 最重要的字段,有两层作用:
- 出方向:本机哪些目标网段的流量,会封装进这个WireGuard隧道发往Peer
- 入方向:从这个Peer回来的数据包,源IP必须匹配这个网段,否则丢弃(防欺骗)
- 0.0.0.0/0
IPv4 全网段。含义:所有IPv4地址的流量,匹配这条规则,走隧道。
- ::/0
IPv6 全网段。`::` 是IPv6的0地址,/0代表所有IPv6地址。含义:所有IPv6流量走隧道。
- 两种写法对比
- AllowedIPs = 0.0.0.0/0 ✅ 全部IPv4流量走隧道 ❌ IPv6流量不受WireGuard控制,遵循系统原有路由,直接走物理网卡,会泄露真实IP
- 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 设置步骤
- 关闭 Debian 虚拟机
- 设置 → 网卡1:
- 连接方式:【网络地址转换(NAT)】
- ❌ 不要选 NAT网络、桥接、仅主机
- 其他网卡可以禁用,避免干扰
WireGuard 配置要求
修改 Peer 的 AllowedIPs:
AllowedIPs = 0.0.0.0/0, ::/0
> 如果你路由器没有IPv6、不需要IPv6,只写 0.0.0.0/0 也能用,但存在IPv6流量泄露风险。
操作流程
- WireGuard 编辑配置,保存,重启隧道
- 启动 Debian12 虚拟机
- 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、部分底层工具不读取环境变量,不走代理,属于应用层代理,不是全局透明隧道
通用排错清单
- 确认WireGuard隧道状态:GUI内隧道显示【激活】
- 路由表检查:Windows管理员cmd `route print`,查看0.0.0.0路由下一跳是否指向wintun网卡
- 防火墙:Windows Defender防火墙放行虚拟机网段,禁止拦截转发报文
- MTU问题:WireGuard隧道推荐MTU=1420,MTU过大容易网页打不开、apt超时
- 桥接模式踩坑提醒:桥接无论如何都不能走宿主机WireGuard,直接放弃
- 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 | 按需 |