如何配置 WireGuard VPN 隧道:一步一步操作和常见错误分析

背景

随着网络安全和数据隐私的日益重要,虚拟私人网络(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),我们都需要生成一对密钥。

  1. 生成密钥:

    在每台设备上运行以下命令:

    wg genkey | tee privatekey | wg pubkey > publickey

    这会生成一对密钥:

    • privatekey:私钥,保密。

    • publickey:公钥,分享给对等方(Peer)。

  2. 查看生成的密钥:

    • 查看 私钥

      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 转发
  1. 临时启用 IP 转发:

    使用以下命令临时启用 IPv4 和 IPv6 的 IP 转发:

    sudo sysctl -w net.ipv4.ip_forward=1
    sudo sysctl -w net.ipv6.ip_forward=1
  2. 永久启用 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 后,我测试了从 peer1peer2 的 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 配置(例如更改 AllowedIPsEndpoint 或者密钥),请按照以下步骤操作:

  1. 编辑配置文件

    使用文本编辑器(如 nanovim)编辑 WireGuard 配置文件 /etc/wireguard/wg0.conf

    sudo nano /etc/wireguard/wg0.conf
  2. 保存并关闭文件

  3. 重启 WireGuard 服务

    在修改配置后,您需要重启 WireGuard 服务以应用新的配置:

    sudo systemctl restart wg-quick@wg0

    也可以使用以下命令重新加载配置并重启接口:

    sudo wg-quick down wg0
    sudo wg-quick up wg0

通过这些步骤,您可以在任何时候修改配置并确保更改生效。


注意事项

  1. 正确配置密钥对:确保每台设备都使用其自己的私钥和对等方的公钥。

  2. 防火墙和路由配置:确保防火墙允许 UDP 51820 流量,并且 IP 转发已启用。

  3. 使用 NAT 时端口转发:如果某个设备处于 NAT 后,需要确保端口转发规则已正确设置。

  4. 正确设置 AllowedIPs:在配置文件中,AllowedIPs 用来定义对等方的 IP 地址范围。确保每个设备能正确路由到对方的虚拟 IP 地址。


总结

通过 WireGuard 我成功配置了两台设备间的安全 VPN 隧道。在配置过程中,我遇到了一些常见的错误,主要是密钥配置错误和防火墙问题。通过逐步排查和修正,我成功解决了这些问题,并确保了两台设备间的连接畅通。

WireGuard 简洁、高效,是

构建 VPN 隧道的理想选择。如果你也想配置类似的 VPN 隧道,按照本文的步骤进行操作,相信你也能顺利完成配置。


如果你有任何问题或需要进一步的帮助,欢迎在评论区留言,我会尽快回答!