在树莓派上搭建 WireGuard VPN 服务器
一步步在家里的树莓派上搭建小型 WireGuard 服务器:可达性检查、密钥、服务器与对端配置、端口转发、测试与日常维护。
阅读约 10 分钟更新于 2026年10月15日作者:XPASS Editorial Team

在树莓派上搭建 WireGuard 服务器,是最让人有成就感的小型网络项目之一。花一块普通开发板的钱,加一个电源适配器和一个晚上的时间,你就拥有了一扇通往自己家的私人入口:在咖啡馆里访问家里网络的文件,在酒店 Wi-Fi 上先把手机流量送回家再出去,或者管理没有公网地址的设备。这个协议足够精简,即便是老一点的板子也能应付一般的家庭带宽。
本文从零开始搭建服务器。假设你的树莓派运行着较新的 Raspberry Pi OS Lite,通过网线连接路由器,并且对终端有基本的熟悉。下面所有的地址、密钥和主机名都是占位示例。如果你还在犹豫是自己架设还是购买服务,建议先读 自建 VPN 与商业 VPN,因为两者解决的是不同的问题。
你要搭建的是什么,不是什么
先把目标说清楚,因为它会影响之后的每个选择。
| 你能得到 | 你得不到 |
|---|---|
| 从手机或笔记本到家庭网络的加密通路 | 让你看起来身处另一个国家的方法 |
| 用内网地址访问家里的设备 | 对家里网络运营商的匿名性 |
| 共享 Wi-Fi 上的保护,因为本地网络只能看到隧道 | 对钓鱼、弱密码或恶意软件的防护 |
| 对密钥和软件的完全掌控 | 由别人替你维护的服务 |
唯一的出口是你家的网络连接。你通过隧道访问的网站看到的是你家的地址,速度则受限于家里的上传速率,因为来自外部的所有流量都要经由它返回。对许多人来说这正合适;对另一些人而言,这是出行时更倾向于商业服务的理由。如果想了解这个协议为什么如此紧凑,可以阅读 WireGuard 白皮书。

先确认你的家可以被访问到
家用服务器最常见的失败,发生在安装任何软件之前:外部世界根本到不了你的路由器。请先检查这一点。
- 在路由器的状态页面找到 WAN 地址。
- 打开任意一个显示公网 IP 的页面并比较。如果两者一致,说明你有公网地址。如果路由器显示的是 100.64.x.x 到 100.127.x.x,或者是私有地址段,则说明运营商让许多用户共用一个公网地址,这叫作运营商级 NAT,其保留地址段在 RFC 6598 中有说明。这种情况下端口转发无法到达你。
- 如果地址是公网的,但每隔几天就变,请使用动态域名(dynamic DNS)。很多路由器内置此功能,树莓派上也有小型客户端。你要在客户端配置中填写的是域名而不是数字。
- 检查路由器是否位于另一台路由器之后,例如运营商光猫加你自己的路由器。这就是双重 NAT,你需要在两层上都转发端口,或者把第一层设为桥接模式。
- 如果这些术语对你很陌生,请阅读 什么是公网 IP 地址。
不少运营商可以应要求提供公网地址,有时需要付费。如果做不到,自建服务器就是不合适的工具,托管服务更合适。
安装并生成密钥
更新系统并安装工具:
sudo apt update && sudo apt full-upgrade -y
sudo apt install -y wireguard qrencode
用严格的权限创建存放密钥的目录,并生成服务器的密钥对:
sudo -i
umask 077
cd /etc/wireguard
wg genkey | tee server.key | wg pubkey > server.pub
私钥只留在树莓派上,公钥则填入每一个客户端。千万不要把私钥贴到聊天、工单或截图里。选择一个不与家庭网络重叠的私有隧道网段。如果家里用的是 192.168.1.0/24,就从 RFC 1918 的私有地址块中选择类似 10.44.0.0/24 的网段。服务器为 10.44.0.1,客户端依次获得 .2、.3 等地址。
编写服务器配置
创建 /etc/wireguard/wg0.conf:
[Interface]
Address = 10.44.0.1/24
ListenPort = 51820
PrivateKey = SERVER_PRIVATE_KEY
PostUp = nft add table ip wgnat; nft add chain ip wgnat post '{ type nat hook postrouting priority 100 ; }'; nft add rule ip wgnat post ip saddr 10.44.0.0/24 oifname "eth0" masquerade
PostDown = nft delete table ip wgnat
把 SERVER_PRIVATE_KEY 替换成 server.key 的内容。两行钩子命令只在隧道启动期间添加地址转换,使客户端可以经由树莓派访问互联网和你的局域网,对网络来说树莓派就像一台普通电脑。如果你只想让客户端访问树莓派本身,可以删掉这两行。
永久开启转发:
echo 'net.ipv4.ip_forward=1' > /etc/sysctl.d/90-forward.conf
sysctl --system
然后按照管理 WireGuard 服务的方法,把它作为系统服务运行:
systemctl enable --now wg-quick@wg0
wg show
此时 wg show 会列出接口但没有对端,这是正常的。
转发端口并开放防火墙
在路由器上创建端口转发规则,把 UDP 51820 送到树莓派的固定地址。请用 UDP 而不是 TCP,因为 WireGuard 不使用 TCP。相关的风险和习惯在 VPN 端口转发详解 中有说明,值得浏览一下。给树莓派做 DHCP 保留,让它的地址不再变化。
如果树莓派上运行了防火墙,只放行必需的内容:来自本地网络的 SSH,以及来自任何地方的 UDP 51820,其余全部关闭。WireGuard 的设计是刻意保持安静的:对于没有有效密钥的发送者,它不会回应任何数据包,因此端口扫描不会像许多其他 VPN 服务那样暴露出服务器正在运行。
添加对端:笔记本与手机
每台设备都有自己的密钥对和隧道地址。在树莓派上为手机生成密钥:
cd /etc/wireguard
wg genkey | tee phone.key | wg pubkey > phone.pub
在服务器上登记这个对端,把下面的内容追加到 wg0.conf:
[Peer]
PublicKey = PHONE_PUBLIC_KEY
AllowedIPs = 10.44.0.2/32
在不中断现有连接的情况下应用:
wg syncconf wg0 <(wg-quick strip wg0)
然后编写客户端文件 phone.conf:
[Interface]
PrivateKey = PHONE_PRIVATE_KEY
Address = 10.44.0.2/32
DNS = 10.44.0.1
[Peer]
PublicKey = SERVER_PUBLIC_KEY
Endpoint = myhome.example.net:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
AllowedIPs 这一行是关键决定。使用 0.0.0.0/0 时,手机的全部流量都会回家,适合公共 Wi-Fi;使用 10.44.0.0/24, 192.168.1.0/24 时,只有隧道和家里的地址走隧道,其余流量使用手机自己的网络。DNS 一行需要该地址上有可用的解析器,比如树莓派上运行的小型解析器,否则请改指向路由器的地址。把配置显示为二维码,再用官方 WireGuard 应用扫描:
qrencode -t ansiutf8 < phone.conf
用完后,如果不需要备份,就把 phone.conf 和私钥从树莓派上删除。笔记本的做法相同,只是导入文件而不是扫码。

测试与故障排查
测试时请让手机使用移动数据,而不是家里的 Wi-Fi,因为只有这样测试才真正跨越了互联网。然后检查:
| 症状 | 可能原因 | 处理办法 |
|---|---|---|
wg show 里没有握手 |
端口没到树莓派、endpoint 错误或运营商级 NAT | 重新检查转发规则、域名和公网地址 |
| 有握手但隧道内上不了网 | 缺少转发或 NAT | 确认 ip_forward 为 1 且 nft 表存在 |
| 有握手但访问不到家里设备 | AllowedIPs 缺少家庭网段,或设备拦截了隧道网段 | 补上网段,检查设备防火墙 |
| 有的网站卡住,有的正常 | MTU 对你的线路来说过高 | 在客户端加 MTU = 1380 后测试 |
| 好几天正常,之后失败 | 动态地址变了 | 检查动态域名的更新 |
| 移动数据可用,某个咖啡馆不行 | 那个网络限制 UDP | 改用移动数据或其他网络 |
在树莓派上用 wg show 可以查看每个对端最近一次握手和数据计数,一眼就能看出哪台设备在工作。WireGuard 速度测试 一文介绍了如何不自欺欺人地测量吞吐量。
加固与维护
互联网上的服务器是一份责任,哪怕规模很小。
- 保持树莓派更新。每月更新一次,愿意的话开启自动安全更新。
- 使用 SSH 密钥并关闭密码登录。除非确有必要,不要把 SSH 转发到互联网。
- 每台设备使用独立的对端条目,卖掉或丢失的设备要删除对应条目并应用更改。
- 把服务器私钥和配置备份到离线且加密的地方。没有它们,你就得为所有客户端重新签发。
- 一旦怀疑泄漏,就轮换密钥:生成新的密钥对,更新两端,并删除旧的。
- 注意电源和存储。存储卡一旦损坏,服务器和你的远程访问都会一起消失。
- 记住你是运营者。如果别人也使用你的服务器,他们通过你家网络所做的事要由你负责,所以对端名单要精简且可信。
常见错误
- 跳过可达性检查,结果花了几个小时去排查软件。
- 转发了 TCP 而不是 UDP。
- 多台设备共用同一个客户端密钥,导致它们抢占同一个会话。
- 选择了与家里或咖啡馆网络重叠的隧道网段。
- 把私钥放进聊天消息。
- 以为服务器能对自己的网络运营商隐藏你的活动。
- 忘了速度受家里上传速率限制。
总结
在树莓派上搭建 WireGuard 服务器归结为五步:确认你的家可以被访问到,生成密钥,编写带有转发和地址转换的简短服务器配置,转发一个 UDP 端口,并把每台设备作为独立对端添加。用移动数据测试,保持树莓派更新,把密钥文件当作机密对待。最终你会得到一条完全由自己掌控的、通往自己网络的私人通路。
如果你不想自己运营另一端,价格页面 展示了可配合免费 VPNclient 应用使用的预付通行证,使用方法见 Linux 设置指南。
常见问题
在家运行 WireGuard 服务器必须有公网 IP 吗?
你需要一个外界能够访问到的地址。如果运营商让许多用户共用一个地址(运营商级 NAT),从外部进行端口转发就行不通,需要换用其他办法,例如由你自己控制的中继。可以把路由器的 WAN 地址与“查询我的 IP”页面显示的地址对比一下。
WireGuard 使用哪个端口?
常见的默认值是 UDP 51820,但这只是习惯。你可以在 ListenPort 一行里选择别的 UDP 端口,并在路由器上转发同一个端口。
服务器能看到我的哪些流量?
树莓派是你自己掌控的隧道另一端。离开隧道前往互联网的流量看起来像来自你家的网络。这有利于在外访问家里,但并不能让你对家里的网络运营商隐身。
怎样添加我的手机?
在树莓派上生成密钥对和客户端配置,把手机作为对端加入并分配独立的隧道地址,再用 qrencode 把配置显示成二维码,在 WireGuard 应用中扫描。之后删除配置文件。
这和商业 VPN 一样吗?
不一样。自建服务器让你能访问家庭网络,并在公共 Wi-Fi 下获得受保护的通路,但出口只有一个,就是你的家。商业服务由别人运营,取舍不同,对比文章里有详细说明。
参考资料
关于作者

Bob Kanokphon Thongdee
- XPASS VPN 创始人
- eSIMonline.asia 联合创始人
- 7 年以上网络营销经验
- Cojourney Visa 与 Cojourney Travel 创始人
继续阅读

VPN 安全
WireGuard 与 OpenVPN 有什么区别
WireGuard 和 OpenVPN 都能建立加密隧道,但设计、复杂度和灵活性不同。本文用通俗的方式比较,并说明该怎样选择。
阅读约 9 分钟

VPN 基础
Mesh VPN 是什么:安全连接你自己的设备
Mesh VPN 让你自己的设备直接互联,而消费级 VPN 把流量送往服务商的服务器。本文说明两者的区别、组成部分,以及各自适用的场景。
阅读约 9 分钟


