全部指南
本页内容
要使用 WireGuard 在 VPS 上自建 VPN,请安装 wireguard/etc/wireguard/wg0.confwg-quick@wg0
以下步骤将在运行 SERVER_IPeth0
开始之前:WireGuard VPS 需要什么
- 一台拥有公网 IPv4 地址的 VPS。每个套餐都包含一个独立 IPv4 地址和一个 /64 IPv6 地址段。
- 通过 SSH 登录的 root 权限。
- 每台设备上的 WireGuard 应用。WireGuard 安装页面列出了适用于 Windows、macOS、iOS 和 Android 的官方应用;Linux 电脑使用
软件包。wireguard-tools
最小的套餐就够用。WireGuard 运行在 Linux 内核中,占用内存很少,因此 Dinghy 套餐(1 个 vCPU、
选择离您较近的地区可以保持浏览速度;选择其他国家的地区则会改变服务器所适用的法律。选择之前,请在网络页面比较延迟,并阅读我们关于用离岸 VPS 搭建 VPN 的指南。与所有无需 KYC 的 VPS 一样,您的账户只需邮箱地址和密码,并使用加密货币付款。
我们的可接受使用政策将 VPN 列为受欢迎的用途之一。您设备的流量会以服务器的 IP 地址发出,因此通过隧道发出的滥用行为会被视为来自您的服务器:请只向您信任的人提供访问权限。出站 25 端口默认关闭。
在 Ubuntu 或 Debian 上安装 WireGuard
要在
apt update
apt install -y wireguard ufw qrencode
wg --version
wireguardwgwg-quickufwiptablesqrencode
生成服务器和客户端密钥
cd /etc/wireguard
umask 077
wg genkey | tee server.key | wg pubkey > server.pub
wg genkey | tee laptop.key | wg pubkey > laptop.pub
umask 077/etc/wireguardwg genkeywg pubkey
每台设备使用一个以设备命名的密钥对,这样可以单独吊销某台设备,而不影响其他设备。您也可以在设备本机上生成其密钥,只将公钥复制到服务器。
编写 WireGuard 服务器配置
WireGuard 服务器的全部配置都在一个文件中。首先找出承载服务器互联网流量的网络接口:
ip route show default
deveth0ens3enp1s0$(cat ...)
cat > /etc/wireguard/wg0.conf <<EOF
[Interface]
Address = 10.8.0.1/24
ListenPort = 51820
PrivateKey = $(cat /etc/wireguard/server.key)
PostUp = iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
PostDown = iptables -t nat -D POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
[Peer]
# laptop
PublicKey = $(cat /etc/wireguard/laptop.pub)
AllowedIPs = 10.8.0.2/32
EOF
chmod 600 /etc/wireguard/wg0.conf
- 地址
- 服务器在隧道内的地址。私有地址段
可容纳 253 台设备。10.8.0.0/24 - ListenPort
- 设备连接的 UDP 端口;51820 是 WireGuard 官方示例中使用的端口。
- PrivateKey
- 服务器的私钥,因此该文件必须保持仅 root 可读。
- PostUp 和 PostDown
- 隧道启动和停止时由
通过 bash 执行的命令,详见其手册页。这里用它们添加和删除 NAT 规则,使设备以服务器的 IPv4 地址访问互联网。wg-quick - [Peer]
- 每台设备一个配置段。对于源地址不在其
范围内的设备数据包,WireGuard 一律丢弃,并将这种设计称为加密密钥路由(Cryptokey Routing)。AllowedIPs
启用 IP 转发
只有在开启转发后,Linux 才会在网络接口之间传递数据包,而根据内核文档,转发默认是关闭的。请立即开启,并设置为每次启动时自动开启:
echo 'net.ipv4.ip_forward = 1' > /etc/sysctl.d/99-wireguard.conf
sysctl --system
sysctl net.ipv4.ip_forward
最后一条命令必须输出 net.ipv4.ip_forward = 1sysctl --system/etc/sysctl.d
配置防火墙放行规则
先放行 SSH,以免启用 UFW 后连接被切断,然后放行 WireGuard 端口和隧道的出站路由:
ufw allow 22/tcp
ufw allow 51820/udp
ufw route allow in on wg0 out on eth0
ufw enable
ufw status verbose
如果您已按照加固指南更改了 SSH 端口,请放行您自己的 SSH 端口,而不是 22。ufw enableydeny (routed)routeeth0
使用 nftables 代替 UFW
如果您沿用加固指南中自己的 /etc/nftables.confwg0.confPostUpPostDowninputudp dport 51820 accept
table inet wg-nat {
chain postrouting {
type nat hook postrouting priority srcnat;
ip saddr 10.8.0.0/24 oifname "eth0" masquerade
}
}
检查文件,然后加载:
nft -c -f /etc/nftables.conf
nft -f /etc/nftables.conf
写在文件中的 NAT 规则在重新加载后依然有效。如果由 PostUpflush ruleset
启动隧道并设置开机自启
systemctl enable --now wg-quick@wg0
wg show
wg-quick@wg0wg0.confwg0PostUpwg showlistening port: 51820journalctl -u wg-quick@wg0 -b
添加客户端
笔记本或台式电脑:使用配置文件
在服务器上编写笔记本电脑的配置文件,并用您服务器的 IPv4 地址替换 SERVER_IP
umask 077
cat > /etc/wireguard/laptop.conf <<EOF
[Interface]
PrivateKey = $(cat /etc/wireguard/laptop.key)
Address = 10.8.0.2/32
DNS = 9.9.9.9
[Peer]
PublicKey = $(cat /etc/wireguard/server.pub)
Endpoint = SERVER_IP:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25
EOF
- AllowedIPs = 0.0.0.0/0, ::/0
- 所有流量都经过隧道。即使服务器没有 IPv6,也请保留
:这样 IPv6 流量会进入隧道并在其中被丢弃,而不会绕过隧道泄漏出去。::/0 - DNS
- 9.9.9.9 是 Quad9,它会拦截恶意软件域名并验证 DNSSEC;您也可以使用任何您信任的解析器。DNS 查询在隧道内传输。
- PersistentKeepalive = 25
- 防止家用路由器和移动网络断开连接。WireGuard 快速入门将 25 秒称为“一个合理的间隔,适用于各种各样的防火墙”。
在笔记本电脑上复制该文件(如果加固后已禁止 root 登录,请通过您的 sudo 用户复制),然后从服务器上删除笔记本电脑的私钥和配置文件,服务器只需要公钥:
scp root@SERVER_IP:/etc/wireguard/laptop.conf .
rm /etc/wireguard/laptop.key /etc/wireguard/laptop.conf
在 Windows 和 macOS 上,在 WireGuard 应用中导入该文件。在 Linux 上,将其复制到 /etc/wireguard/wg-quick up laptopDNSopenresolv
手机:扫描二维码
手机需要在服务器上拥有自己的密钥、地址和 [Peer]
cd /etc/wireguard
umask 077
wg genkey | tee phone.key | wg pubkey > phone.pub
cat >> /etc/wireguard/wg0.conf <<EOF
[Peer]
# phone
PublicKey = $(cat /etc/wireguard/phone.pub)
AllowedIPs = 10.8.0.3/32
EOF
systemctl reload wg-quick@wg0
仿照 laptop.confphone.confphone.key10.8.0.3/32
qrencode -t ansiutf8 < /etc/wireguard/phone.conf
使用 WireGuard 应用的扫描二维码功能进行扫描,然后从服务器上删除 phone.keyphone.conf
添加 IPv6(可选)
为设备提供 IPv6 最简单的方法,是在隧道内使用私有地址段,并像 IPv4 一样将其转换为服务器的公网 IPv6 地址;这样所有设备会共享该地址。私有地址段以 fdfd8c:5e2a:91b4::/64systemctl stop wg-quick@wg0wg0.confAddress
Address = 10.8.0.1/24, fd8c:5e2a:91b4::1/64
PostUp = ip6tables -t nat -A POSTROUTING -s fd8c:5e2a:91b4::/64 -o eth0 -j MASQUERADE
PostDown = ip6tables -t nat -D POSTROUTING -s fd8c:5e2a:91b4::/64 -o eth0 -j MASQUERADE
在两端都为每台设备分配 IPv6 地址,例如在其 [Peer]AllowedIPs = 10.8.0.2/32, fd8c:5e2a:91b4::2/128,在设备自己的配置文件中写入 Address = 10.8.0.2/32, fd8c:5e2a:91b4::2/128。然后启用 IPv6 转发并重新启动隧道:
echo 'net.ipv6.conf.all.forwarding = 1' >> /etc/sysctl.d/99-wireguard.conf
sysctl --system
systemctl start wg-quick@wg0
如果使用 nftables,请改为在 wg-natip6 saddr fd8c:5e2a:91b4::/64 oifname "eth0" masquerade。也可以使用您 /64 地址段中的公网地址,但视该地址段路由到服务器的方式而定,通常需要配置邻居发现(NDP)代理。
检查泄漏
在已连接的设备上(而不是在服务器上)检查以下三项:
- 公网 IP。IP 查询网站显示的必须是您服务器的 IPv4 地址(如果添加了 IPv6,还包括其 IPv6 地址),绝不能是您家中的地址。
- DNS。DNS 泄漏测试列出的必须只有您在
行中所填服务的解析器,而不是您互联网服务提供商的解析器。DNS - IPv6.如果隧道中没有配置 IPv6,则根本不应出现任何 IPv6 地址。如果显示了您家中的 IPv6 地址,请检查设备的
是否包含AllowedIPs 。::/0
此时在服务器上,wg showlatest handshaketransfer
保持 WireGuard VPS 更新并添加更多客户端
WireGuard 的更新随内核和 wireguard-toolswg-quick@wg0/etc/wireguard
- 添加其他设备:使用下一个空闲地址(
,依此类推)重复手机的步骤。10.8.0.4/32 - 应用对等端变更:
会执行systemctl reload wg-quick@wg0 ,根据 wg 手册,这样做“具有不中断当前对等端会话的好处”。wg syncconf - 移除设备:删除其
配置段并重新加载。其密钥会立即失效。[Peer] - 可选:使用
生成一个wg genpsk ,并在对等端的两侧同时设置,即可增加对称密钥加密,“以实现后量子抗性”。PresharedKey
故障排查
没有握手
如果 wg showlatest handshake
- 服务正在运行:
;systemctl status wg-quick@wg0 - UFW 已放行
。有些网络会封锁 UDP,而 WireGuard 没有 TCP 模式,因此也请通过移动数据网络进行测试;51820/udp - 设备的
中地址和端口正确;Endpoint - 密钥已交叉配置:设备的配置文件中是服务器的公钥,而服务器的
配置段中是设备的公钥。[Peer]
有握手但没有流量
有握手但无法访问网站,说明服务器没有转发流量或没有进行地址转换。请检查:
输出 1;sysctl net.ipv4.ip_forward- NAT 规则中的接口名称与
显示的一致。名称错误恰恰会导致这种症状,ip route show defaultiptables -t nat -L POSTROUTING -n -v中的计数器可以显示规则是否匹配。请按上文所述,在停止隧道后再进行修正; - UFW 中有
规则;route allow - 设备的
与服务器上为其配置的Address 一致;AllowedIPs - 域名解析正常。如果
能通,但网站无法访问,请修正ping 9.9.9.9 行。DNS
部分网站能打开,部分卡住:MTU 问题
wg-quick[Interface]MTU = 1380
常见问题
在 VPS 上自建 VPN 合法吗?
为自己运行 VPN 是服务器的一种普通用途,我们的可接受使用政策也将 VPN 列为所有套餐都欢迎的用途之一。您可以通过它做什么,取决于您所在地以及服务器所在地的法律,因此请了解您所在司法管辖区的规定。来自隧道的流量会以您服务器的 IP 地址发出。
一台 WireGuard 服务器能支持多少台设备?
本指南中的 10.8.0.0/24top
WireGuard 会保留日志吗?
WireGuard 不写入任何连接日志。隧道运行期间,它会在内存中保存每台设备最近一次的 IP 地址和端口(可通过 wg showwg-quick
WireGuard 使用哪个端口?
使用您通过 ListenPortListenPortEndpoint