本教程聚焦「自有 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 连接
WireGuardVPN 协议和工具集官方工具包含 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/24WireGuard 服务端 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]

平台安装来源导入方式
WindowsWireGuard 官方安装包Import tunnel(s) from file 或粘贴配置
macOSApp Store / 官方入口导入 .conf 或二维码
AndroidGoogle Play / 官方入口导入文件、二维码或创建隧道
iPhone/iPadApp 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 showIP/端口错误、UDP 未放行、服务未启动
有握手但无内网访问Address、AllowedIPs、wg0 地址Peer 地址重复、路由范围写错
有握手但不能访问外部ip_forward → FORWARD → NAT → DNS转发未开、NAT/接口名错误、DNS 不通
连接一段时间后断PersistentKeepalive、网络切换、MTUNAT 映射过期、移动网络变化、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_IPVPS 公网 IPv4
WG_PORTWireGuard UDP 监听端口
VPN_SUBNET隧道私有网段,例如 10.8.0.0/24
CLIENT_ADDRESS某一客户端隧道地址,例如 10.8.0.2/32

官方资料链接

  1. https://www.wireguard.com/quickstart/
  2. https://www.wireguard.com/install/
  3. https://ubuntu.com/server/docs/how-to/wireguard-vpn/common-tasks/
  4. https://ubuntu.com/server/docs/explanation/intro-to/wireguard-vpn/
  5. https://developers.cloudflare.com/dns/zone-setups/full-setup/setup/
  6. https://developers.cloudflare.com/dns/manage-dns-records/
  7. https://developers.cloudflare.com/dns/proxy-status/

内容边界:本教程只面向你拥有或获授权的 VPS、设备和网络,用于合法的远程访问、私有服务和安全测试。不提供绕过网络封锁、规避平台风控、批量账号运营或其他违反服务条款的配置。