自建 WireGuard VPN 服务器实战|Windows Server + WS4W 图形化管理(附一键脚本)

远程办公、跨地域团队协作、安全访问内网……这些场景下,一台完全由自己掌控的 VPN 服务器,往往比商用方案更让人放心。本文带你用 WireGuard + WS4W 在 Windows Server 上从零搭建一套生产可用的 VPN,全程图形化管理,文末附一键部署脚本。
一、为什么选 WireGuard + WS4W?
先说结论:WS4W 负责"好管",WireGuard 负责"能跑"。
•WireGuard:新一代 VPN 协议,核心代码仅约 4000 行(OpenVPN/IPSec 的零头),速度快、延迟低、内核级加密,已是 Linux 内核原生支持的主流方案。•WS4W(Wg Server for Windows):一款开源的 Windows 图形化管理界面,让你不用手敲 .conf 配置文件,点一点就能管理服务端和所有客户端。
相比商用 VPN,自建的好处很直接:流量不经第三方、不限速、不限设备数、密钥完全自主可控。
二、整体架构
这套方案采用 Hub-Spoke(中心辐射) 拓扑:
•服务端(Hub):部署在公网 Windows Server 上,拥有固定公网 IP,监听 UDP 端口(本文用 51820)。•客户端(Peer):各类终端通过加密隧道接入服务端,彼此之间也能互访。
它的工作链路非常清晰:
你在 WS4W 界面操作
↓ 自动生成配置文件
WireGuard 内核读取配置
↓ 建立加密隧道
处理流量转发,Peer 之间互通简单说,WS4W 只是“方向盘”,真正跑起来的是 WireGuard 内核。

三、环境信息
以一套典型生产环境为例(文中所有 IP 均为示例占位,请替换为你自己的):
项目 值 操作系统 Windows Server 2019 Datacenter 公网 IP <你的公网IP> WireGuard 接口名 wg_server 监听端口 51820 (UDP) 服务端 VPN 地址 10.253.0.1/24 (主网段)
本文采用双网段(
10.253.0.0/24+192.168.100.0/24)配置,便于按部门/环境做隔离。单网段用法完全一致,去掉第二个网段即可。
四、四步完成基础安装

步骤 1:安装 WireGuard 内核
WireGuard 是底层 VPN 驱动,必须先装。
1.访问官网下载页:https://www.wireguard.com/install/2.运行安装程序,一路默认即可。3.验证安装:
wg --version
# 应显示 wireguard-tools v1.x.x步骤 2:安装 WS4W 管理界面
1.前往 GitHub 仓库下载:https://github.com/micahmo/WgServerforWindows2.在 Releases 页面下载最新版 .exe 安装程序。3.运行安装,默认路径 C:\Program Files (x86)\WS4W\,会自动创建桌面快捷方式。4.验证进程是否在运行:
Get-Process | Where-Object { $_.ProcessName -like '*WgServer*' }
Test-Path "C:\Program Files (x86)\WS4W\WgServerforWindows.exe"
# 应返回 True步骤 3:配置服务端
打开 WS4W,进入 Server Configuration,按下表填写:
参数 值 说明 Name myserver 服务端名称,自定义 ListenPort 51820 监听端口,建议用非标准端口 Address 10.253.0.1/24, 192.168.100.1/24 服务端 VPN 地址(双网段) AllowedIPs 10.253.0.0/24, 192.168.100.0/24 允许的 VPN 子网 Endpoint <你的公网IP>:51820 客户端连接地址 PrivateKey / PublicKey 自动生成 保存即可
点击 Save,WS4W 会生成服务端配置文件。
步骤 4:添加客户端并导出
进入 Client Configuration → Add Client,为每个终端填写名称、VPN 地址、DNS 等,然后 Save & Generate Config。WS4W 会自动:
•生成客户端密钥对(PrivateKey + PublicKey)•生成 PresharedKey(额外加密层,推荐开启)•生成可导出的客户端配置
导出时可选三种格式:
•.conf**** 文件:供桌面端 WireGuard 导入•二维码:手机扫码直接导入•ZIP 包:批量分发
一个导出给用户的客户端配置长这样(密钥已脱敏):
[Interface]
Address = 10.253.0.4/24, 192.168.100.4/24
PrivateKey = <客户端私钥>
DNS = 114.114.114.114
[Peer]
PublicKey = <服务端公钥>
PresharedKey = <预共享密钥>
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = <你的公网IP>:51820
PersistentKeepalive = 25💡 小白提示:
AllowedIPs = 0.0.0.0/0表示所有流量都走 VPN(全局代理);如果只想访问内网,把它改成 VPN 子网(如10.253.0.0/24)即可。
五、⚠️ 三个必做的关键配置(最容易踩坑)

很多人装完发现"连不上"或"能连但互访不了",90% 是漏了下面三步。 它们无法通过 WS4W 界面完成,需要用管理员 PowerShell 执行。
关键配置 1:放行防火墙
否则外部请求根本进不来。以管理员身份打开 PowerShell:
# 1. 放行 WireGuard 监听端口(UDP 入站)
New-NetFirewallRule -DisplayName "wg-udp51820" `
-Direction Inbound -Protocol UDP -LocalPort 51820 -Action Allow `
-ErrorAction SilentlyContinue | Out-Null
# 2. 放行 VPN 子网入站(Peer 间互通)
New-NetFirewallRule -DisplayName "WireGuard Allow Inbound" `
-Direction Inbound -Action Allow `
-LocalAddress 10.253.0.0/24, 192.168.100.0/24 `
-ErrorAction SilentlyContinue | Out-Null
# 3. 放行 VPN 子网出站(TCP + UDP)
New-NetFirewallRule -DisplayName "WG-Out-TCP" `
-Direction Outbound -Protocol TCP `
-RemoteAddress 10.253.0.0/24, 192.168.100.0/24 -Action Allow `
-ErrorAction SilentlyContinue | Out-Null
New-NetFirewallRule -DisplayName "WG-Out-UDP" `
-Direction Outbound -Protocol UDP `
-RemoteAddress 10.253.0.0/24, 192.168.100.0/24 -Action Allow `
-ErrorAction SilentlyContinue | Out-Null关键配置 2:启用接口级 IP 转发
这一步决定 Peer 之间能不能互访。 不开启的话,每个客户端只能访问服务端,访问不了其他客户端。
# 启用 wg_server 接口的 IP 转发
Set-NetIPInterface -InterfaceAlias 'wg_server' -Forwarding Enabled
# 验证
Get-NetIPInterface -InterfaceAlias 'wg_server' | Select-Object InterfaceAlias, Forwarding
# Forwarding 必须显示 Enabled关键配置 3:持久化(重启不失效)
坑中之坑:上一步的 Set-NetIPInterface 设置不会持久化,服务器一重启,转发就会变回 Disabled,然后整个 VPN 又不通了。
解决办法:创建一个开机自动执行的计划任务。
$action = New-ScheduledTaskAction -Execute "PowerShell.exe" `
-Argument "-Command `"Set-NetIPInterface -InterfaceAlias 'wg_server' -Forwarding Enabled`""
$trigger = New-ScheduledTaskTrigger -AtStartup
$settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries
Register-ScheduledTask -TaskName "WG-Server-Forwarding" `
-Action $action -Trigger $trigger -Settings $settings `
-Description "WireGuard Server 接口级 IP 转发" `
-RunLevel Highest -Force
# 验证任务状态应为 Ready
Get-ScheduledTask -TaskName 'WG-Server-Forwarding' | Select-Object TaskName, State六、一键部署脚本
把下面内容保存为 deploy-wg-server.ps1,右键"以管理员身份运行",它会自动完成"检查权限 → 启用转发 → 配置防火墙 → 创建计划任务 → 输出状态报告":
# WireGuard VPN Server 部署脚本(WS4W 版)
param(
[switch]$SkipFirewall,
[switch]$SkipForwarding,
[switch]$SkipScheduledTask
)
# 1. 检查管理员权限
if (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) {
Write-Host "请以管理员身份运行此脚本!" -ForegroundColor Red; pause; exit 1
}
# 2. 启用 IP 转发
if (-not $SkipForwarding) {
try {
Set-NetIPInterface -InterfaceAlias 'wg_server' -Forwarding Enabled -ErrorAction Stop
Write-Host "✓ IP 转发已启用" -ForegroundColor Green
} catch {
Write-Host "⚠ 未找到 wg_server 接口,请先在 WS4W 中启动 WireGuard 服务" -ForegroundColor Yellow
}
}
# 3. 配置防火墙规则
if (-not $SkipFirewall) {
$rules = @(
@{ Name="wg-udp51820"; Dir="Inbound"; Proto="UDP"; Port=51820 },
@{ Name="WireGuard Allow Inbound"; Dir="Inbound"; Addr="10.253.0.0/24","192.168.100.0/24" },
@{ Name="WG-Out-TCP"; Dir="Outbound"; Proto="TCP"; Addr="10.253.0.0/24","192.168.100.0/24" },
@{ Name="WG-Out-UDP"; Dir="Outbound"; Proto="UDP"; Addr="10.253.0.0/24","192.168.100.0/24" }
)
foreach ($r in $rules) {
if ($r.Port) {
New-NetFirewallRule -DisplayName $r.Name -Direction $r.Dir -Protocol $r.Proto `
-LocalPort $r.Port -Action Allow -ErrorAction SilentlyContinue | Out-Null
} elseif ($r.Dir -eq "Inbound") {
New-NetFirewallRule -DisplayName $r.Name -Direction Inbound -Action Allow `
-LocalAddress $r.Addr -ErrorAction SilentlyContinue | Out-Null
} else {
New-NetFirewallRule -DisplayName $r.Name -Direction Outbound -Protocol $r.Proto `
-RemoteAddress $r.Addr -Action Allow -ErrorAction SilentlyContinue | Out-Null
}
Write-Host "✓ $($r.Name)" -ForegroundColor Green
}
}
# 4. 创建持久化计划任务
if (-not $SkipScheduledTask) {
$action = New-ScheduledTaskAction -Execute "PowerShell.exe" `
-Argument "-Command `"Set-NetIPInterface -InterfaceAlias 'wg_server' -Forwarding Enabled`""
Register-ScheduledTask -TaskName "WG-Server-Forwarding" `
-Action $action -Trigger (New-ScheduledTaskTrigger -AtStartup) `
-Settings (New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries) `
-RunLevel Highest -Force | Out-Null
Write-Host "✓ 计划任务已创建" -ForegroundColor Green
}
# 5. 状态报告
Write-Host "`n=== 状态报告 ===" -ForegroundColor Cyan
wg show
Get-NetIPInterface -InterfaceAlias 'wg_server' -ErrorAction SilentlyContinue |
Select-Object InterfaceAlias, Forwarding | Format-Table -AutoSize
Write-Host "`n部署完成!" -ForegroundColor Green后续维护时可加参数跳过已完成的步骤:
.\deploy-wg-server.ps1 -SkipFirewall # 只重做转发+计划任务
.\deploy-wg-server.ps1 -SkipForwarding # 只重做防火墙+计划任务七、启动与验证
回到 WS4W 主界面,点击 Start Service,状态变为 Running 即成功。命令行验证:
wg show
# 应显示 wg_server 接口及已接入的 Peer 列表八、日常运维速查
操作 怎么做 添加客户端 WS4W → Client Configuration → Add Client 禁用/删除客户端 客户端列表中操作 IsEnabled / Delete 重新生成密钥 清空 PrivateKey 字段 → Save(自动重生成) 导出配置 选中客户端 → Export → 选格式 查看在线状态 主界面 Status 窗口实时显示
常用命令行:
wg show # 整体状态
wg show wg_server transfer # 各 Peer 流量统计
wg show wg_server latest-handshakes # 最近握手时间(判断活跃度)
net stop WireGuardTunnel$wg_server # 停止服务
Restart-Service WireGuardTunnel$wg_server # 重启服务九、故障排查速查表

症状 多半是 怎么解 wg show 无输出 服务没启动 WS4W 里 Start Service 客户端握手超时 防火墙没放行 检查 UDP 51820 入站规则 能连服务端,不能访问其他 Peer IP 转发没开 执行关键配置 2 重启后又不能互访 转发没持久化 检查计划任务(关键配置 3) 新加客户端后其他人掉线 IP 冲突 检查各客户端 Address 是否唯一
十、安全建议
•最小权限:只给真正需要的账号,定期清理闲置客户端。•密钥管理:私钥绝不外泄;怀疑泄露时立即重生成密钥对并重新分发。•PresharedKey:强烈建议开启,提供额外一层加密。•非标准端口:用 51820 而不是默认的 51820,减少被扫到的概率。•定期审计:用 wg show 检查在线 Peer,发现异常及时处理。
资源与下载
项目 地址 WireGuard 官方 https://www.wireguard.com/install/ WS4W 项目 https://github.com/micahmo/WgServerforWindows WS4W Releases https://github.com/micahmo/WgServerforWindows/releases
核心要点再强调一遍:WS4W 是管理工具,WireGuard 是运行基础;装完别忘防火墙、IP 转发、持久化这三件套,你的 VPN 就能稳定跑起来了。有问题欢迎留言交流 👋