
商业 VPN 要你相信的,不过是一页营销文案。自建 VPN 则用掌控权取代了这份信任:服务器归你所有,密钥由你生成,日志策略由你来定(也就是不留日志),出口 IP 也只属于你一个人,而不是挤在一个早被各家反欺诈厂商标记过的共享 IP 池里。WireGuard 让这件事变得切实可行——它只有大约 4,000 行代码,自 Linux 5.6 起就内置于内核,一条能用的隧道只需十来行配置。
本指南会在一台免 KYC VPS 上搭出一个完整的 WireGuard 服务器——这台 VPS 用门罗币(Monero,XMR)支付,无需证件,无需手机号,也无需验证邮箱。你会依次完成这些事:开通机器;通过 IP 转发和 nftables NAT 配好网络;手写服务端与客户端配置,把每一行都弄明白;为笔记本和手机各添加一个 peer;最后接上 kill switch(断网保护),确保隧道一旦掉线,也不会有任何流量泄漏出去。
为什么选 WireGuard,又为什么要用自己的服务器
VPN 的选择大致有三种:商业 VPN、在自己的机器上跑 OpenVPN,或者在自己的机器上跑 WireGuard。对大多数有隐私意识的用户来说,第三种胜出。
WireGuard 与 OpenVPN 对比
- 代码量:WireGuard 约 4,000 行,一个下午就能审计完。OpenVPN 加上它依赖的 OpenSSL,则远超 100,000 行——攻击面要大得多。
- 加密:WireGuard 只内置一套固定的现代加密套件(Curve25519、ChaCha20-Poly1305、BLAKE2s)。没有加密算法协商,也就不存在可能被配错的弱算法降级。OpenVPN 的灵活性,恰恰也是它容易让人踩坑的地方。
- 速度:WireGuard 运行在内核中,一次往返即可完成握手。在配置不高的 VPS 上,它就能跑满 1 Gbps;而运行在用户空间的 OpenVPN,在同样的硬件上通常上限低得多。
- 漫游:WireGuard 是无连接的(UDP)。从 Wi-Fi 切换到 LTE,隧道照常继续——对手机来说再理想不过。
自建 VPN 与商业 VPN
商业 VPN 卖给你的,是共享 IP 池里的一个名额,同一个池子里还有成千上万的其他用户——其中不乏滥用者。这类 IP 池早就被流媒体平台、银行和反欺诈厂商打上了标记,而你要相信的,是一句无从验证的“无日志”承诺。自建的 WireGuard 出口则能给你一个无人碰过的干净专属 IP、一套由你定为“零记录”的日志策略,以及只有你持有的密钥。代价是:这个 IP 显然就是一个固定地址,用作私人出口再好不过,想混进人群里却很糟糕。如果需要“藏身人群”式的匿名,请在上面再叠一层 Tor。想知道哪种任务适合哪种工具,请看自建 VPN 的应用场景。
开通一台免 KYC VPS 作为出口
挑一个离你想对外显示的所在位置最近的地区。CryptoVpsHost 在雷克雅未克(REK)、苏黎世(ZRH)、布加勒斯特(OTP)和巴黎(PAR)都部署了完全相同的 AMD EPYC 硬件。个人 VPN 用 S1 套餐(2 vCPU / 4 GB DDR5 / 80 GB NVMe Gen5,每月 $5 起)绰绰有余——WireGuard 非常轻量,在 1 Gbps 链路被占满之前,CPU 很少会成为瓶颈。
- 账户:邮箱加密码,仅此而已。无需证件,无需手机号,无需验证邮箱,也没有人机验证。用一次性邮箱就行。
- 付款:用 Monero(XMR)给余额充值——约 30 秒到账——或者使用支持的 8 种币种中的任意一种。之后每次部署都从余额中扣款。充值 $100 时可获得 +30% 的赠送额度。
- 系统镜像:选择 Debian 13 或 Ubuntu 24.04。两者的内核都已内置 WireGuard 模块。
- 部署:构建时间的中位数约为 47 秒。你会拿到 root 权限和一个干净的 IP。
如果你一条命令都不想手敲,可以前往下单页面;下面的全部内容,同样可以直接放进 cloud-init / 首次启动(first-boot)字段。
安装 WireGuard 并启用 IP 转发
以 root 身份通过 SSH 登录,安装所需工具。在 Debian/Ubuntu 上:
apt update && apt install -y wireguard wireguard-tools nftables
# turn the box into a router
cat > /etc/sysctl.d/99-wireguard.conf <<'EOF'
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1
EOF
sysctl --system现在生成服务端密钥对。umask 077 可以保证私钥不会被系统上的其他用户读取:
cd /etc/wireguard
umask 077
wg genkey | tee server_private.key | wg pubkey > server_public.key
cat server_private.key # you'll paste this into wg0.conf
cat server_public.key # clients need this查出公网网卡的名称(NAT 规则要用)和你的公网 IP:
ip route get 1.1.1.1 | awk '{print $5; exit}' # e.g. eth0 or ens3
curl -4 ifconfig.co # your public IPv4私钥只能留在服务器上。免 KYC VPS 的 root 密码是以 AES-256 加密形式静态存储的,但你的 VPN 密钥只属于你自己——切勿把服务端私钥粘贴到客户端里。
编写服务端配置(wg0.conf)
创建 /etc/wireguard/wg0.conf。这里使用 10.8.0.0/24 作为隧道子网,IPv6 使用 fd86:ea04:1115::/64。把 SERVER_PRIVATE_KEY 换成你生成的值,把 eth0 换成上一步查到的真实网卡名。
[Interface]
Address = 10.8.0.1/24, fd86:ea04:1115::1/64
ListenPort = 51820
PrivateKey = SERVER_PRIVATE_KEY
# NAT: masquerade tunnel traffic out the public NIC
PostUp = nft add table inet wg; \
nft add chain inet wg postrouting '{ type nat hook postrouting priority 100 ; }'; \
nft add rule inet wg postrouting oifname "eth0" masquerade
PostDown = nft delete table inet wg
# --- peers are appended below, one [Peer] per client ---PostUp 里的规则就是整个 NAT 层——它改写离开隧道的数据包,让它们看起来像是从 VPS 的公网 IP 发出的;与之配对的 PostDown 则在停止时把这些规则干净地拆除。如果你更习惯用 ufw,可以改为运行 ufw route allow in on wg0 out on eth0,并在 /etc/ufw/before.rules 中添加一段 masquerade 规则;不过上面这种 nftables 写法不需要任何额外文件。
放行 WireGuard 端口并启动隧道:
ufw allow 51820/udp # if using ufw
systemctl enable --now wg-quick@wg0
wg show # confirm the interface is up生成密钥,并为每台设备添加 peer
每个客户端(笔记本、手机)都要有自己的一对密钥。为图省事,可以在服务器上代为生成;更好的做法是直接在设备上生成,这样私钥就永远不会离开设备。在客户端上执行:
umask 077
wg genkey | tee client_private.key | wg pubkey > client_public.key然后把一段 [Peer] 配置块追加到服务端的 wg0.conf 里,其中填入客户端的公钥。每个 peer 都需要一个唯一的隧道 IP:
[Peer]
# laptop
PublicKey = CLIENT_PUBLIC_KEY
AllowedIPs = 10.8.0.2/32, fd86:ea04:1115::2/128
[Peer]
# phone
PublicKey = PHONE_PUBLIC_KEY
AllowedIPs = 10.8.0.3/32, fd86:ea04:1115::3/128应用这次改动,且不中断现有隧道:
wg syncconf wg0 <(wg-quick strip wg0)请留意这里的不对称:在服务端,AllowedIPs 是分配给每个客户端的、范围很窄的隧道 IP(一条路由 / ACL 条目);在客户端,AllowedIPs 则是范围很宽的 0.0.0.0/0(也就是哪些流量要走隧道)。把这两者搞混,是 WireGuard 最常见的错误,没有之一。
客户端配置、各平台用法与 kill switch(断网保护)
在客户端上创建 wg0.conf(或者把内容粘贴进应用里)。Endpoint 填你的 VPS 公网 IP 加监听端口。AllowedIPs = 0.0.0.0/0, ::/0 会把所有流量都路由进 VPN:
[Interface]
PrivateKey = CLIENT_PRIVATE_KEY
Address = 10.8.0.2/32, fd86:ea04:1115::2/128
DNS = 9.9.9.9, 2620:fe::fe
[Peer]
PublicKey = SERVER_PUBLIC_KEY
Endpoint = YOUR_VPS_IP:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25- Linux:保存到
/etc/wireguard/wg0.conf,然后执行wg-quick up wg0。PersistentKeepalive = 25能让隧道在 NAT 后面保持存活。 - macOS / Windows:安装官方的 WireGuard 应用,导入配置文件或扫描二维码。
- iOS / Android:从应用商店安装 WireGuard。在服务器上用
qrencode -t ansiutf8 < client.conf(需先执行 apt install qrencode)生成二维码,扫一下就行——不用打字。
Kill switch(断网保护)
由于客户端的 AllowedIPs 是 0.0.0.0/0, ::/0,wg-quick 会自动装上一套基于路由的 kill switch:它把隧道设为默认路由,并添加一条 fwmark 规则,丢弃所有目的地不是隧道的数据包。一旦 WireGuard 停止,这条默认路由随之消失,流量会直接断掉(fail closed),而不会从你的真实网卡漏出去。若想在 Linux 上做得更严格,可以再添加 PostUp/PreDown 的 nftables 规则:除 wg0 以及发往你 endpoint 的握手包之外,阻断所有出站流量。移动端应用把这项功能做成了名为“Block untunneled traffic / Exclude private IPs”的开关——请务必打开。
验证出口 IP 现在已经是你的 VPS:curl -4 ifconfig.co 应当返回服务器的地址,而不是你的 ISP 的地址。想要一台经过加固、常年在线的机器,请看 SSH 加固指南。
- 开通一台免 KYC VPS
只用邮箱和密码注册账户,用 Monero(XMR)给余额充值,然后在你选定的地区部署一台运行 Debian 13 或 Ubuntu 24.04 的 S1 VPS(每月 $5 起)。构建约 47 秒完成,你将获得 root 权限,以及一个干净的专属 IP。
- 安装 WireGuard
apt update && apt install -y wireguard wireguard-tools nftables qrencode。WireGuard 模块已随内核提供,无需编译任何东西。 - 启用 IP 转发
把
net.ipv4.ip_forward = 1和net.ipv6.conf.all.forwarding = 1写入/etc/sysctl.d/99-wireguard.conf,再运行sysctl --system。这会让 VPS 变成一台路由器,从而能把你的流量转发到互联网。 - 生成服务端密钥对
在
/etc/wireguard目录下运行umask 077; wg genkey | tee server_private.key | wg pubkey > server_public.key。私钥永远只留在服务器上;公钥则写进每个客户端的配置。 - 编写带 NAT 规则的 wg0.conf
创建
/etc/wireguard/wg0.conf,写入[Interface]配置块(Address 10.8.0.1/24、ListenPort 51820 以及你的私钥),并在公网网卡上加一条PostUp的 nftables masquerade 规则。在防火墙中放行 UDP 51820。 - 为每台设备添加一个 peer
在每台设备上各生成一对密钥,然后把一段
[Peer]配置块追加到服务端配置中,填入客户端的公钥和一个唯一的隧道 IP(例如 10.8.0.2/32)。用wg syncconf wg0 <(wg-quick strip wg0)热应用。 - 启动隧道并连接客户端
在服务器上运行
systemctl enable --now wg-quick@wg0。在每个客户端上设置AllowedIPs = 0.0.0.0/0, ::/0和Endpoint = YOUR_VPS_IP:51820并启动连接——手机上则扫描qrencode生成的二维码。 - 验证并启用 kill switch
在客户端上运行
curl -4 ifconfig.co,它应当返回 VPS 的 IP。在应用中启用“Block untunneled traffic”(或依靠 wg-quick 基于默认路由的 fail closed 机制),这样即使隧道掉线,也不会有流量泄漏。