如何配置 WireGuard VPN 隧道:一步一步操作和常见错误分析
- 笔记
- 2025-05-02
- 3135热度
- 5评论
背景
随着网络安全和数据隐私的日益重要,虚拟私人网络(VPN)已成为保护数据传输的常见方法。WireGuard 是一个现代、快速且简洁的 VPN 协议,广受欢迎。在这篇博客中,我将记录配置 WireGuard VPN 隧道的整个过程,包括遇到的错误以及一些重要的配置细节。
操作环境
- Peer1:运行在香港的服务器,使用公网 IP,充当 WireGuard 服务器。
- Peer2:运行在内网环境中的服务器,使用 NAT 转发的公网 IP,无法被海外服务主动连接,但可以主动连接到海外服务器,充当 WireGuard 客户端。
操作步骤
1. 安装 WireGuard
首先,我在两台服务器上安装了 WireGuard。
- 在 Debian/Ubuntu 系统 上,使用以下命令安装:
sudo apt update sudo apt install wireguard - 在 CentOS/RHEL 系统上,使用以下命令安装:
sudo yum install epel-release sudo yum install wireguard-tools
2. 生成公私钥对
WireGuard 使用公钥/私钥对进行身份验证。对于每台设备(Peer),我们都需要生成一对密钥。
- 生成密钥:在每台设备上运行以下命令:
wg genkey | tee privatekey | wg pubkey > publickey这会生成一对密钥:
privatekey:私钥,保密。publickey:公钥,分享给对等方(Peer)。
- 查看生成的密钥:
- 查看 私钥:
cat privatekey - 查看 公钥:
cat publickey
- 查看 私钥:
确保每个设备的私钥和公钥被正确保存,并在配置文件中正确使用。
3. 配置 WireGuard
接下来,我开始配置 WireGuard 接口。每台机器的配置文件都应该包含其私钥以及对等端(Peer)的公钥和相关网络设置。
Peer1 配置文件
[Interface]
PrivateKey = <peer1_private_key> # peer1 的私钥
Address = 10.0.0.1/24
ListenPort = 51820
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
[Peer]
PublicKey = <peer2_public_key> # peer2 的公钥
Endpoint = <peer2_public_ip>:51820
AllowedIPs = 10.0.0.2/32
PersistentKeepalive = 25
Peer2 配置文件
[Interface]
PrivateKey = <peer2_private_key> # peer2 的私钥
Address = 10.0.0.2/24
ListenPort = 51820
[Peer]
PublicKey = <peer1_public_key> # peer1 的公钥
Endpoint = <peer1_public_ip>:51820
AllowedIPs = 10.0.0.1/32
PersistentKeepalive = 25
4. 启用 IP 转发
为了让 WireGuard 隧道能够转发流量,您需要在每台设备上启用 IP 转发。IP 转发允许操作系统将接收到的数据包从一个网络接口转发到另一个网络接口,确保 VPN 流量能够在两台设备之间正确路由。
启用 IP 转发
- 临时启用 IP 转发:使用以下命令临时启用 IPv4 和 IPv6 的 IP 转发:
sudo sysctl -w net.ipv4.ip_forward=1 sudo sysctl -w net.ipv6.ip_forward=1 - 永久启用 IP 转发:为了使 IP 转发在系统重启后依然有效,修改系统配置文件
/etc/sysctl.conf:sudo nano /etc/sysctl.conf找到以下行并取消注释:
net.ipv4.ip_forward=1 net.ipv6.ip_forward=1然后应用更改:
sudo sysctl -p
这样,IP 转发将在系统每次重启后自动启用。
5. 启动 WireGuard 接口
使用以下命令启动 WireGuard 接口:
sudo wg-quick up wg0
该命令会创建并启动一个名为 wg0 的接口,配置文件中指定了网络设置和路由规则。
6. 检查 WireGuard 接口状态
通过以下命令查看 WireGuard 接口的状态,确认连接是否正常:
sudo wg show
此命令会显示 WireGuard 接口的状态,包括已建立的连接、传输的数据量等。
7. 测试连接
在成功启动 WireGuard 后,我测试了从 peer1 到 peer2 的 ping 通性,以及 peer2 是否能接收到通过 WireGuard 隧道发送的 UDP 数据包。
ping 10.0.0.2 # 从 peer1 ping 10.0.0.2
ping 10.0.0.1 # 从 peer2 ping 10.0.0.1
这些测试成功表明 WireGuard 隧道已经建立并可以进行通信。
遇到的错误及解决方法
在配置过程中,我遇到了几个常见的错误,下面是一些主要问题的分析和解决方案。
1. 错误:端口已被占用
在尝试使用 nc 测试 UDP 51820 端口时,出现了 Address already in use 的错误。这是因为 WireGuard 已经在该端口上监听流量。
解决方法:我首先停止了 WireGuard 接口(wg-quick down wg0),然后运行 nc 来监听端口。在完成测试后,我重新启动了 WireGuard 接口(wg-quick up wg0)恢复连接。
2. 错误:配置文件中公钥和私钥配错
在最初的配置文件中,我错误地将 peer1 的私钥和 peer2 的公钥配置混淆了。实际配置中,应该是 peer1 使用 peer2 的公钥,反之亦然。
解决方法:我重新编辑了配置文件,确保每个对等方使用正确的公钥和私钥。
3. 错误:ping 不通
在初次测试时,peer1 无法 ping 通 peer2,反之亦然。这通常是由于 AllowedIPs 配置错误或者防火墙设置不当导致的。
解决方法:我检查了 AllowedIPs 配置,确保每个对等方都能通过 WireGuard 隧道访问对方的虚拟 IP 地址。此外,我还确认了防火墙规则允许 UDP 51820 流量通过。
sudo ufw allow 51820/udp # 或使用 iptables
设置 WireGuard 接口自启动
为了确保 WireGuard 接口在系统重启后自动启动,我们需要启用 systemd 服务来管理 WireGuard。
使用以下命令启用 WireGuard 自启动:
sudo systemctl enable wg-quick@wg0
这样,在系统重启后,WireGuard 接口会自动启动。您也可以手动启动或停止 WireGuard 接口:
- 启动接口:
sudo wg-quick up wg0 - 停止接口:
sudo wg-quick down wg0
修改配置并重启服务
如果您需要修改 WireGuard 配置(例如更改 AllowedIPs、Endpoint 或者密钥),请按照以下步骤操作:
- 编辑配置文件:使用文本编辑器(如
nano或vim)编辑 WireGuard 配置文件/etc/wireguard/wg0.conf:sudo nano /etc/wireguard/wg0.conf - 保存并关闭文件。
- 重启 WireGuard 服务:在修改配置后,您需要重启 WireGuard 服务以应用新的配置:
sudo systemctl restart wg-quick@wg0也可以使用以下命令重新加载配置并重启接口:
sudo wg-quick down wg0 sudo wg-quick up wg0
通过这些步骤,您可以在任何时候修改配置并确保更改生效。
注意事项
- 正确配置密钥对:确保每台设备都使用其自己的私钥和对等方的公钥。
- 防火墙和路由配置:确保防火墙允许 UDP 51820 流量,并且 IP 转发已启用。
- 使用 NAT 时端口转发:如果某个设备处于 NAT 后,需要确保端口转发规则已正确设置。
- 正确设置
AllowedIPs:在配置文件中,AllowedIPs用来定义对等方的 IP 地址范围。确保每个设备能正确路由到对方的虚拟 IP 地址。
如果你有任何问题或需要进一步的帮助,欢迎在评论区留言,我会尽量回答!
对于那台不能被海外主动访问的内网服务器,我现在采取直接使用 tailcalse 来建立虚拟内网的方式,因为这管理更加便捷,所以不是重要数据的话,可以试试 —— 2025.10.17
很难找到, 如此温暖又有信息量的博客。谢谢。
确实少有, 没有多余矫饰的表达。敬意。
我关注这样的资源, 充满真情实感。你的内容 就是 最好的例子。干得好。
Hi would you mind letting me know which hosting company you’re utilizing? I’ve loaded your blog in 3 completely different internet browsers and I must say this blog loads a lot faster then most. Can you recommend a good internet hosting provider at a reasonable price? Many thanks, I appreciate it!
本地服务器+AKI转发+清羽云CDN
我本地的机子没公网IP,我使用tailscale跟AKI的大宽带香港机子组虚拟内网,能P2P直连,然后用AKI的机子进行反代理。
最后使用清羽云的CDN,他家不用实名认证,俩家的商品都是物美价廉,下面是我的aff链接:
https://akile.io/register?aff_code=4b747e2a-2136-4be3-b678-d470b262f0bf
https://www.qyyhl.com/aff/LFEZWSVO