本教程聚焦「自有 VPS + WireGuard」这一条合规的远程访问路线:适合个人设备安全访问自己的服务器、家庭网络或私有服务。重点放在原理、逐步配置、密钥管理、转发/NAT、客户端导入、验证和排错。
⚠️ 安全边界:本教程不提供用于绕过网络封锁、规避平台风控、批量账号运营或隐藏违法流量的配置。请只在你拥有或获授权的 VPS、设备和网络上使用。
你将完成什么
- 理解 VPS、WireGuard、Peer、AllowedIPs、Endpoint 和 PersistentKeepalive。
- 选择一台适合练习的 VPS,并完成购买前测试。
- 在 Ubuntu 上安装官方 WireGuard 工具,生成服务端和客户端密钥。
- 配置一个最小可用的「单客户端访问 VPN」的 wg0 隧道。
- 开启 IPv4 转发和 NAT,让客户端通过 VPS 访问外部网络。
- 在 Windows、Android、iPhone/macOS 导入配置并验证。
- 使用日志、握手时间、路由、DNS 和端口检查故障。
一、先理解:自建 VPN 到底是什么
自建 VPN 不是「买 VPS 后复制一条命令」这么简单。它是一条加密网络通道:客户端和 VPS 之间建立隧道,客户端把指定流量交给 VPS,再由 VPS 访问你授权使用的私有服务或互联网。
客户端(电脑 / 手机)
│ 加密 WireGuard 隧道
▼
VPS:wg0 虚拟网卡 ── 服务器转发 / NAT ── 目标网络或互联网
核心术语
| 术语 | 在本教程中的含义 | 你需要记住什么 |
|---|---|---|
| VPS | 一台租用的远程 Linux 服务器 | 有公网 IP,负责接收 WireGuard 连接 |
| WireGuard | VPN 协议和工具集 | 官方工具包含 wg 与 wg-quick |
| Peer | 一个对等端 | 服务端和每台客户端都是独立 Peer |
| PrivateKey | 私钥 | 只保存在本机或对应设备,绝不公开 |
| PublicKey | 公钥 | 可以放在对端配置中,用于识别 Peer |
| AllowedIPs | 该 Peer 负责的地址/路由范围 | 服务端和客户端的含义不同,不能随便复制 |
| Endpoint | 对端可访问地址 | 客户端通常填 VPS 公网 IP:UDP 端口 |
| Handshake | 最近一次握手时间 | 判断隧道是否真正建立的重要指标 |
WireGuard 官方 Quick Start 介绍了用 wg/ip 配置接口、生成密钥和查看状态;Ubuntu 官方文档说明 wg-quick 是可管理接口,并可通过 systemd 设置开机自动启动。[1][3][4]
二、购买 VPS:为 WireGuard 节点选对基础设施
WireGuard 本身很轻量,练习用 VPS 不需要高配。比 CPU 更重要的是:公网 IPv4、稳定网络、UDP 可用、服务商允许 VPN/隧道用途、控制台和退款政策清楚。
步骤 1|确认公网 IPv4
购买页面确认有独立公网 IPv4。没有公网 IPv4 时,客户端无法直接通过普通方式连接,排错难度会明显增加。
步骤 2|确认 UDP 可用
WireGuard 默认使用 UDP。确认云平台安全组、防火墙和服务商网络允许你使用自定义 UDP 端口。
步骤 3|选择 Ubuntu LTS
本教程以 Ubuntu LTS 为例。不同发行版的包名、服务管理和防火墙命令可能不同。
步骤 4|确认用途条款
阅读服务商 Acceptable Use Policy,确认个人 VPN、远程访问或私有网络用途被允许。
步骤 5|先月付测试
先测试 SSH、UDP 握手、重启恢复和实际访问,再考虑长期付费。
步骤 6|记录救援方式
保存控制台、Web Console、救援模式、快照和退款入口,避免 SSH 配错后无法恢复。
购买后记录表
| 项目 | 填写你的实际值 |
|---|---|
| 服务商 | ____________ |
| VPS 公网 IPv4 | ____________ |
| 系统版本 | Ubuntu __________ |
| SSH 用户 | root / 普通用户:____________ |
| SSH 端口 | ____________ |
| WireGuard UDP 端口 | 例如 51820,实际使用:____________ |
| 退款截止时间 | ____________ |
| 控制台 / 救援入口 | ____________ |
⚠️ 不要在 PDF 或截图里填真实密钥:本教程的所有地址、密钥、域名和密码都使用占位符。你的 PrivateKey、VPS 密码、SSH 私钥和客户端配置二维码不能发给别人,也不要提交到 GitHub。
三、购买后先做服务器安全初始化
不要刚拿到服务器就执行来源不明的一键脚本。先登录、更新、备份、建立普通账号和防火墙,再安装 WireGuard。
1. 第一次 SSH 登录
ssh root@203.0.113.10
第一次连接时会显示主机指纹。只有在确认 IP 和服务器来源正确后才接受。密码输入时通常不会回显,这是正常现象。
2. 初始化检查
uname -a
cat /etc/os-release
ip addr
ip route
df -h
free -h
3. 安全初始化顺序
步骤 1|更新系统
先更新安全补丁。更新前确认有快照或救援控制台。
步骤 2|创建普通管理员
日常使用普通用户,必要时使用 sudo;不要长时间用 root 运行应用。
步骤 3|配置 SSH 密钥
在本地生成密钥,将公钥放到服务器,开启新会话测试成功后再关闭密码登录。
步骤 4|设置防火墙策略
先允许 SSH,再允许 WireGuard UDP 端口;最后根据 VPN 转发需求配置 FORWARD/NAT。
步骤 5|保存当前状态
记录 SSH 端口、用户名、防火墙规则和快照编号;修改网络前保留控制台救援路径。
⚠️ 防止把自己锁在服务器外:关闭 SSH 密码登录前,必须打开第二个终端验证密钥登录成功。防火墙修改也要先确认当前 SSH 会话不会被切断。
四、安装 WireGuard 并生成密钥
WireGuard 官方提供各平台安装方式;Ubuntu 可使用系统包安装 wireguard。官方文档也说明 wg-quick 负责接口的启动、地址和路由等常见配置。[1][2][4]
sudo apt update
sudo apt install -y wireguard wireguard-tools
生成服务端私钥和公钥:
sudo install -m 700 -d /etc/wireguard
cd /etc/wireguard
umask 077
wg genkey | sudo tee server_private.key | wg pubkey | sudo tee server_public.key
生成客户端密钥:
wg genkey | tee client1_private.key | wg pubkey > client1_public.key
chmod 600 client1_private.key
💡 密钥关系:服务端配置中放——服务端 PrivateKey + 客户端 PublicKey;客户端配置中放——客户端 PrivateKey + 服务端 PublicKey。不要把 PrivateKey 填到对端的 PublicKey 字段。
五、规划 VPN 地址和端口
本教程使用文档示例网段,避免与 VPS、家庭路由或公司内网冲突。实际部署时请选择你自己的私有网段。
| 项目 | 示例值 | 说明 |
|---|---|---|
| VPN 网段 | 10.8.0.0/24 | 隧道内的虚拟地址范围 |
| 服务端地址 | 10.8.0.1/24 | WireGuard 服务端 wg0 地址 |
| 客户端地址 | 10.8.0.2/32 | 第一台客户端的固定隧道地址 |
| 监听端口 | 51820/UDP | 可自定义;云安全组和 UFW 要同步放行 |
| 公网接口 | eth0(示例) | 实际可能是 ens3、enp1s0 等,先用 ip route 查 |
| DNS | 由你选择的可信 DNS | 如果要把 DNS 纳入隧道,需额外验证客户端行为 |
查看默认公网接口:
ip route get 1.1.1.1
# 从输出中找到 dev 后面的接口名,例如 eth0 或 ens3
为什么不直接使用 VPS 的公网 IP 作为客户端地址? WireGuard 隧道应该使用独立的私有地址段。公网 IP 用作 Endpoint,私有地址用于隧道内通信;两者作用不同。
六、编写服务端配置 wg0.conf
服务端配置包含 Interface 和 Peer 两部分。下面是结构模板,所有密钥使用占位符;不要把这份模板当成可直接复制的真实配置。
[Interface]
Address = 10.8.0.1/24
ListenPort = 51820
PrivateKey = SERVER_PRIVATE_KEY
# 下面的 PostUp/PostDown 用于转发/NAT,接口名和防火墙方案要按你的系统调整
PostUp = ...
PostDown = ...
[Peer]
# client1
PublicKey = CLIENT1_PUBLIC_KEY
AllowedIPs = 10.8.0.2/32
保存文件并限制权限:
sudo chmod 600 /etc/wireguard/wg0.conf
sudo wg-quick up wg0
sudo wg show
sudo ip addr show wg0
💡 AllowedIPs 的关键点:服务端对单个客户端通常填写该客户端的隧道地址 /32,避免两个客户端使用同一个地址。多个客户端就添加多个 Peer,每个 Peer 使用不同的地址和 PublicKey。
七、开启转发和 NAT:让客户端能够访问外部网络
WireGuard 隧道建立后,客户端能否访问外部网络取决于服务器是否允许转发,以及是否把 VPN 地址转换成公网地址。
1. 临时确认内核转发状态
sysctl net.ipv4.ip_forward
如果返回 0,说明 IPv4 转发未开启。生产环境应通过 /etc/sysctl.d/ 建立持久配置,并重新加载。具体防火墙/NAT 命令应按 Ubuntu 版本、UFW/nftables/iptables 方案和公网接口调整。
2. NAT 的概念
客户端 10.8.0.2
↓ WireGuard wg0
服务端 10.8.0.1
↓ 转发 + NAT
公网接口 eth0 → 互联网
3. 配置时必须确认的 5 件事
步骤 1|公网接口名称
不要照抄 eth0。使用 ip route get 1.1.1.1 查实际接口。
步骤 2|转发开关
确认 IPv4 forwarding 持久开启,并理解重启后的状态。
步骤 3|防火墙 FORWARD
允许 wg0 与公网接口之间的必要转发,不要直接把所有内网端口暴露出去。
步骤 4|NAT/MASQUERADE
只对 VPN 私有网段和正确公网接口做 NAT,避免误伤其他流量。
步骤 5|云平台安全组
除了 VPS 内部防火墙,还要在云平台放行 WireGuard UDP 端口。
⚠️ 不要把「所有流量」当默认选项:客户端 AllowedIPs 写成
0.0.0.0/0会把全部 IPv4 流量交给 VPN,DNS、银行、公司系统和本地设备访问都可能受影响。初次配置建议先使用分流/私网测试范围,确认链路正确后再决定是否需要全隧道。
八、编写客户端配置
客户端需要自己的 PrivateKey、服务端 PublicKey、服务端公网 Endpoint 和自己的隧道地址。
[Interface]
PrivateKey = CLIENT1_PRIVATE_KEY
Address = 10.8.0.2/32
DNS = 10.8.0.1
[Peer]
PublicKey = SERVER_PUBLIC_KEY
Endpoint = 203.0.113.10:51820
AllowedIPs = 10.8.0.0/24
PersistentKeepalive = 25
初次测试使用 10.8.0.0/24 只验证隧道内网。确认握手和服务器访问正常后,再根据你的合法使用场景增加需要的网段。
九、客户端安装和导入
WireGuard 官方提供 Windows、macOS、Android、iOS 和 Linux 安装入口。[2]
| 平台 | 安装来源 | 导入方式 |
|---|---|---|
| Windows | WireGuard 官方安装包 | Import tunnel(s) from file 或粘贴配置 |
| macOS | App Store / 官方入口 | 导入 .conf 或二维码 |
| Android | Google Play / 官方入口 | 导入文件、二维码或创建隧道 |
| iPhone/iPad | App Store / 官方入口 | 导入文件、二维码或 AirDrop |
| Linux | 发行版包管理器 | wg-quick up wg0 |
导入前检查
- 客户端 PrivateKey 是客户端自己的私钥。
- 服务端 PublicKey 与服务端实际文件一致。
- Endpoint 是 VPS 公网 IP 或域名加 UDP 端口。
- Address 不与其他 Peer 重复。
- AllowedIPs 与你的测试目标一致。
- 配置文件权限合适,不能放在公开共享目录。
十、启动、验证和停用
# Linux 服务端
sudo wg-quick up wg0
sudo wg show
sudo wg-quick down wg0
# 设置开机启动
sudo systemctl enable wg-quick@wg0
sudo systemctl status wg-quick@wg0
Ubuntu 官方文档说明,可以使用 systemctl 管理 wg-quick 接口,并设置开机自动启动;修改 Peer 时可优先使用 reload,涉及地址、路由或 PostUp/PostDown 等变化时再考虑 restart。[3]
十一、WireGuard 节点故障排查
| 现象 | 检查顺序 | 常见原因 |
|---|---|---|
| 客户端无握手 | Endpoint → UDP 安全组 → UFW → wg show | IP/端口错误、UDP 未放行、服务未启动 |
| 有握手但无内网访问 | Address、AllowedIPs、wg0 地址 | Peer 地址重复、路由范围写错 |
| 有握手但不能访问外部 | ip_forward → FORWARD → NAT → DNS | 转发未开、NAT/接口名错误、DNS 不通 |
| 连接一段时间后断 | PersistentKeepalive、网络切换、MTU | NAT 映射过期、移动网络变化、MTU 不合适 |
| 一个客户端正常另一个不行 | PublicKey、AllowedIPs、地址分配 | 复制配置未换密钥或地址冲突 |
| 重启后失效 | systemctl status、journalctl | 未启用服务、自定义脚本失败 |
| 访问变慢 | 路由、带宽、CPU、MTU、目标服务 | 线路拥堵、带宽共享、分片或目标端限制 |
1. 首先看握手
sudo wg show
# 重点看 latest handshake、transfer-rx、transfer-tx
如果完全没有 latest handshake,先不要查 NAT;问题还在 Endpoint、UDP 端口、防火墙、密钥或客户端配置层。
2. 再看接口和路由
ip addr show wg0
ip route
sudo ss -lunp | grep 51820
sudo journalctl -u wg-quick@wg0 --no-pager -n 80
3. 最后查转发和 DNS
- 确认客户端能 ping/访问 10.8.0.1(如果防火墙允许)。
- 确认服务器能访问外部目标。
- 确认客户端 DNS 设置合理。
- 确认全隧道场景下 DNS 不被本地网络泄漏。
十二、安全加固和维护
自建 VPN 节点本质上是公网服务器。隧道加密并不等于服务器自动安全。
步骤 1|保护私钥
服务端和客户端私钥分开保存;任何一台设备丢失时,只撤销对应 Peer,不必更换所有设备。
步骤 2|每台设备一个 Peer
不要让多台设备共用同一份客户端配置,否则无法单独撤销和定位流量。
步骤 3|最小开放端口
公网只放行 SSH(最好限制来源)和 WireGuard UDP;网站端口按需要开放。
步骤 4|管理端口不公开
不要把面板、数据库、Redis、Docker API 等管理服务暴露到公网。
步骤 5|定期更新系统
关注 Ubuntu 安全更新、WireGuard 工具和云平台通知;更新前保留快照。
步骤 6|备份配置但要加密
备份 wg0.conf 时脱敏或加密;不要把私钥和二维码放到公开网盘。
步骤 7|监控异常流量
关注握手、流量、CPU、内存、磁盘和登录失败;出现异常时先停用对应 Peer。
步骤 8|遵守服务条款
只在允许的用途、设备和网络上使用,不用于攻击、盗版、诈骗、绕过平台规则或隐藏违法行为。
⚠️ 撤销丢失设备:删除服务器 wg0.conf 中对应客户端的 [Peer],或使用 wg set 临时移除,然后 reload/restart;同时删除该设备本地配置。不要只「换个名字」,要撤销旧 PublicKey。
十三、上线前检查清单
| 项目 | 完成标准 |
|---|---|
| VPS | 公网 IPv4、UDP 可用、服务条款允许、快照和救援入口可用。 |
| 系统 | 系统更新完成、时间正常、普通管理员和 SSH 密钥可用。 |
| WireGuard | 服务端和客户端密钥一一对应;每个 Peer 地址唯一。 |
| 网络 | 安全组、UFW/FORWARD、转发和 NAT 按实际接口配置。 |
| 客户端 | Endpoint、端口、AllowedIPs、DNS 和 Keepalive 已核对。 |
| 验证 | wg show 有最新握手,收发流量增长,目标地址可访问。 |
| 恢复 | wg-quick 服务已设置开机启动,重启后重新验证。 |
| 安全 | 私钥未泄露,管理端口未暴露,丢失设备有撤销方案。 |
最终建议:先做「单客户端 + 仅访问隧道内网」的最小实验,确认握手、地址和路由正确,再逐步增加转发范围。每增加一个功能,都保留一次可回滚的配置。
十四、官方资料
- WireGuard 官方 Quick Start:接口、密钥、Peer 和基础启动方式。[1]
- WireGuard 官方 Installation:Windows、macOS、Ubuntu、Android、iOS 等安装入口。[2]
- Ubuntu WireGuard 文档:wg-quick、systemd 自动启动、reload/restart 和常见任务。[3][4]
- Cloudflare DNS 文档:更换 NS、DNSSEC、A/AAAA/CNAME、代理状态和 DNS-only/Proxied 的区别。[5][6][7]
十五、结论
VPS 自建 WireGuard 的正确学习顺序是:
买 VPS → SSH 加固 → 安装 WireGuard → 生成密钥 → 配置 wg0 → 开启转发/NAT → 导入客户端 → 检查握手 → 测试路由/DNS → 设置开机启动 → 备份和维护
不要把重点放在「哪条命令最神奇」,而要理解每一层出了问题如何验证。能看懂握手、路由、端口、转发、NAT 和日志,才是真正掌握了自建 VPN 节点。
资料来源和版本说明:本教程以 WireGuard、Ubuntu Server 和 Cloudflare 官方文档为主要依据;示例地址、私钥、域名和端口均为占位符。具体命令会因发行版、防火墙方案、云平台安全组和客户端版本变化,请以当前官方文档为准。
附录:配置占位符与原始资料
请把下面占位符替换为你自己的值;不要把真实密钥粘贴到公开文档或截图中。
| 占位符 | 含义 |
|---|---|
| SERVER_PRIVATE_KEY | 服务端私钥,只放服务端 |
| SERVER_PUBLIC_KEY | 服务端公钥,放到客户端 Peer |
| CLIENT1_PRIVATE_KEY | 第一台客户端私钥,只放客户端 |
| CLIENT1_PUBLIC_KEY | 第一台客户端公钥,放到服务端 Peer |
| VPS_PUBLIC_IP | VPS 公网 IPv4 |
| WG_PORT | WireGuard UDP 监听端口 |
| VPN_SUBNET | 隧道私有网段,例如 10.8.0.0/24 |
| CLIENT_ADDRESS | 某一客户端隧道地址,例如 10.8.0.2/32 |
官方资料链接
- https://www.wireguard.com/quickstart/
- https://www.wireguard.com/install/
- https://ubuntu.com/server/docs/how-to/wireguard-vpn/common-tasks/
- https://ubuntu.com/server/docs/explanation/intro-to/wireguard-vpn/
- https://developers.cloudflare.com/dns/zone-setups/full-setup/setup/
- https://developers.cloudflare.com/dns/manage-dns-records/
- https://developers.cloudflare.com/dns/proxy-status/
内容边界:本教程只面向你拥有或获授权的 VPS、设备和网络,用于合法的远程访问、私有服务和安全测试。不提供绕过网络封锁、规避平台风控、批量账号运营或其他违反服务条款的配置。