自建 WireGuard 的工作量很小:两组密钥、一份服务端配置、一条地址转换规则、一个放行的 UDP 端口。下面以 Debian/Ubuntu 为例,把服务端和客户端从头配一遍。自建意味着出口地址就是你的云服务器地址,需要遵守云服务商的使用条款和所在地的法律。

准备工作
需要一台有公网 IPv4 的 Linux 服务器、root 权限,以及一个放行 UDP 51820 的安全组规则。先安装软件包:apt install wireguard。Linux 5.6 以上的内核自带 WireGuard 模块,软件包提供 wg 和 wg-quick 两个管理工具。
服务端配置
生成两组密钥
服务端和客户端各需要一对密钥。先执行 umask 077,再用 wg genkey | tee server.key | wg pubkey > server.pub 生成服务端密钥,客户端同理。私钥文件权限必须是只有所有者可读,公钥可以安全地发给对端。
编写 wg0.conf
在 /etc/wireguard/wg0.conf 里写入下面的内容,其中 eth0 要换成服务器实际的出口网卡名:
[Interface]
Address = 10.8.0.1/24
ListenPort = 51820
PrivateKey = <服务端私钥>
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
[Peer]
PublicKey = <客户端公钥>
AllowedIPs = 10.8.0.2/32开启转发并放行端口
把 net.ipv4.ip_forward=1 写入 /etc/sysctl.d/99-wireguard.conf 并执行 sysctl --system,再用 ufw allow 51820/udp 或云平台安全组放行 UDP 端口。然后 systemctl enable --now wg-quick@wg0 启动并设置开机自启。
客户端配置
[Interface]
PrivateKey = <客户端私钥>
Address = 10.8.0.2/32
DNS = 1.1.1.1
[Peer]
PublicKey = <服务端公钥>
Endpoint = <服务器公网地址>:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25AllowedIPs 写 0.0.0.0/0 表示全部 IPv4 流量走隧道;只想访问服务器所在的内网时,把它改成对应网段即可。DNS 指定一个在隧道内可达的解析器,避免查询泄露到本地网络。

关键配置项对照
| 配置项 | 服务端 | 客户端 |
|---|---|---|
| Address | 10.8.0.1/24 | 10.8.0.2/32 |
| ListenPort | 51820 | 不需要 |
| Endpoint | 不需要 | 服务器公网地址:51820 |
| AllowedIPs | 客户端的隧道地址 | 0.0.0.0/0 或指定网段 |
| PersistentKeepalive | 不需要 | 25(位于 NAT 后时) |
验证与常见问题
客户端启动后,在两端都执行 wg show,应该能看到 latest handshake 和收发字节数在增加。再用 curl -4 https://ifconfig.me 确认出口地址已经变成服务器的公网地址。
握手成功但上不了网怎么办
优先检查三件事:ip_forward 是否为 1、NAT 规则里的网卡名是否和实际出口网卡一致、客户端 DNS 是否可达。这三项占了绝大部分故障,分层排查的方法可以参考《连上了 VPN 却打不开网页》。
怎么给第二台设备增加接入
为新设备再生成一对密钥,分配一个新的隧道地址(如 10.8.0.3/32),在服务端再加一个 [Peer] 块即可,用 wg syncconf 可以在不断开现有连接的情况下重新加载。
自建的出口地址有什么特点
出口地址属于云服务器的数据中心地址段,部分网站会对这类地址做额外的验证。这是自建方案和住宅出口的区别之一,使用前要有心理预期。




