WireGuard简介和配置

2025-11-05 20:31:23
丁国栋
原创 3
摘要:本文记录WireGuard简介和配置。

这是一份关于 WireGuard 的技术文档,涵盖了介绍、解决的问题、应用场景、详细安装配置步骤以及验证方法。


WireGuard 技术文档

版本: 1.0 更新日期: 2023-10-27


一、 简介

WireGuard 是一个开源的、高度安全且极其简单的 VPN 协议和解决方案。它采用最新的加密技术,设计上力求精简(约 4000 行代码,相比 OpenVPN 的 60 万行、IPsec 的 50 万行),目标是提供更快、更简单、更易于管理和更可靠的安全网络连接。WireGuard 运行在 Linux 内核空间,以实现高性能和低延迟,但它也被移植到几乎所有主流的操作系统上,包括 Windows, macOS, iOS, Android, BSD 等。

关键特性:

  • 高性能: 轻量级设计和内核态实现带来了接近线速的性能,资源占用极少。
  • 高安全性: 使用最新且经过广泛审计的加密协议和算法(如 Noise 协议框架、Curve25519、ChaCha20、Poly1305、BLAKE2、SipHash24、HKDF)。
  • 配置简单: 配置简洁易懂,通常只需几行配置即可建立连接。密钥管理也相对直接。
  • 可靠稳定: 代码库小,逻辑清晰,更容易进行安全审计和维护,减少了潜在的安全隐患。
  • 跨平台: 支持几乎所有现代操作系统和设备。
  • 低延迟: 设计上最小化开销,非常适合需要低延迟的场景,如在线游戏和实时视频通话。

二、 WireGuard 解决了什么问题?

WireGuard 旨在解决传统 VPN 协议(如 OpenVPN 和 IPSec)的一些常见痛点:

  1. 复杂性: OpenVPN 和 IPSec 的配置往往非常复杂且容易出错,学习曲线陡峭,配置和维护困难。WireGuard 的配置则简洁明了。
  2. 性能和效率: 传统 VPN 协议在高速、低延迟的网络场景下可能成为瓶颈,资源消耗较高。WireGuard 性能卓越,特别是在高带宽和低延迟方面表现出色。
  3. 安全性: WireGuard 的代码库小,密码学协议现代化,潜在的攻击面更小,更容易进行安全审计,理论上更安全。它也更容易保持最新状态。
  4. 易用性: WireGuard 的目标是让设置和管理 VPN 连接像配置 SSH 一样简单。启动快速,通常在毫秒级完成。
  5. 可靠连接: WireGuard 使用可靠的 UDP 协议传输,并且能够更好地处理网络变化(如切换 WiFi 或移动网络),保持稳定连接。

总结来说,WireGuard 提供了一个更简单、更快、更现代、更安全的 VPN 解决方案,用于保护网络流量、连接远程站点、安全访问内部资源等。


三、 WireGuard 的典型应用场景

WireGuard 可以应用于各种需要安全通信的场景,包括但不限于:

  1. 安全远程访问: 允许员工或用户从外部网络安全地连接到公司内部资源(如文件服务器、应用服务器、数据库),就像他们直接在内网一样。
  2. 站点到站点 VPN: 安全地连接位于不同地理位置的办公室或数据中心的局域网 (LAN),形成一个大的虚拟私有网络。
  3. 云计算互连: 安全地连接不同云服务提供商的 VPC/VNet 或连接本地数据中心到公有云。
  4. 移动用户安全: 保护用户在使用公共 WiFi 或不可信网络时的互联网流量,防止中间人攻击和信息窃取。
  5. 安全物联网连接: 为物联网设备提供安全、轻量级的连接回管理平台或彼此通信。
  6. 绕过地理限制: 虽然主要不是为隐私设计,但可以用于访问受地域限制的内容(但需遵守当地法律和服务的服务条款)。
  7. 安全游戏联机 (LAN over WAN): 为在线游戏创建更安全的点对点或局域网游戏环境。

四、 如何使用 WireGuard (安装与配置步骤 - 以两个 Linux 主机为例)

本部分将以两台运行 Ubuntu Linux 的虚拟机为例,配置一个最简单的点对点 (Point-to-Point) VPN。我们将设置一台为服务器(提供 VPN 服务),另一台为客户端(连接 VPN)。

  • Server: 公共 IP 地址为 1.2.3.4 (假设),我们将赋予其 VPN IP 10.8.0.1/24
  • Client: 无公网 IP (或动态 IP),我们将赋予其 VPN IP 10.8.0.2/32

目标: 客户端通过 WireGuard 连接到服务器后,可以访问服务器(10.8.0.1),并且通过服务器的 NAT 访问互联网(如果需要)。

(一) 安装 WireGuard (Server & Client)

ServerClient 上都需要执行:

# 对于 Ubuntu/Debian (需要 root 权限)
sudo apt update
sudo apt install wireguard
# 对于 CentOS/Red Hat/Fedora (需要 root 权限)
# 首先启用 EPEL 仓库 (CentOS/RHEL < 8 或未启用时)
sudo yum install epel-release
sudo yum install wireguard-tools
# 对于其他发行版,请参考官方安装指南 (https://www.wireguard.com/install/)

(二) 配置 WireGuard 服务端 (Server)

  1. 生成密钥对:

    # 创建密钥存放目录
    sudo umask 077
    sudo mkdir -p /etc/wireguard/keys
    cd /etc/wireguard/keys
    # 生成服务器的私钥
    wg genkey | tee server_privatekey | wg pubkey > server_publickey
    # 生成预共享密钥 (可选但推荐,用于增强安全性)
    wg genpsk > server_psk
  2. 创建配置文件 (例如 wg0.conf) 使用文本编辑器 (如 vimnano) 创建并编辑 /etc/wireguard/wg0.conf,内容如下:

    [Interface]
    # 服务器的私钥 (从 server_privatekey 文件复制过来)
    PrivateKey = <server_private_key>
    # 设置 WireGuard 监听的端口,默认是 UDP 51820
    ListenPort = 51820
    # 配置 NAT (如果需要客户端通过服务器访问互联网)
    PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
    [Peer]
    # 客户端的公钥 (稍后客户端生成)
    PublicKey = <client_public_key>
    # 允许来自此客户端 IP 的连接 (通常是 VPN IP)
    AllowedIPs = 10.8.0.2/32
    # 启用并设置预共享密钥 (如果生成了)
    # PreSharedKey = <shared_key>

    替换说明:

    • <server_private_key>: 用上一步 cat server_privatekey 的输出结果替换。注意:这是敏感信息,不要泄露。
    • <client_public_key>: 稍后客户端生成了公钥后,需要替换成客户端的公钥。先留空,客户端配置完后再补充。
    • PostUp/PostDown: 这些是启用 NAT 的命令。eth0 是服务器连接外网的物理网卡名,请根据实际情况修改 (例如可能是 ens3, ens4, enp0s3 等)。
    • AllowedIPs = 10.8.0.2/32: 允许来自这个 IP 的流量通过 VPN 访问服务器。
  3. 赋予配置文件和密钥安全权限:

    chmod 600 /etc/wireguard/wg0.conf
    chmod 600 /etc/wireguard/keys/*
  4. 启用 IP 转发 (必要): 编辑 /etc/sysctl.conf, 找到并取消注释 (或添加):

    net.ipv4.ip_forward=1

    然后应用设置:

    sudo sysctl -p
  5. 启动 WireGuard 服务并设置开机自启 (使用 wg-quick 工具):

    sudo wg-quick up wg0

    要查看状态:sudo wg show wg0

    设置开机自启:

    sudo systemctl enable wg-quick@wg0

(三) 配置 WireGuard 客户端 (Client)

  1. 在客户端上同样安装 WireGuard (参考 Server 安装步骤)。

  2. 在客户端上生成密钥对:

    sudo umask 077
    sudo mkdir -p /etc/wireguard/keys
    cd /etc/wireguard/keys
    wg genkey | tee client_privatekey | wg pubkey > client_publickey
    # 如果需要,也生成 PreSharedKey (但 Server 配置中也要启用同一个)
    # wg genpsk > sharedkey # (确保两边使用相同的密钥文件内容)
  3. 在客户端上创建配置文件 (例如 wg0-client.conf) 使用文本编辑器创建并编辑 /etc/wireguard/wg0-client.conf

    [Interface]
    # 客户端的私钥
    PrivateKey = <client_private_key>
    # 客户端的 VPN IP 地址
    Address = 10.8.0.2/32
    [Peer]
    # 服务器的公钥 (Server 上 server_publickey 的内容)
    PublicKey = <server_public_key>
    # 目标地址范围,0.0.0.0/0 表示将所有流量都通过 VPN 发送 (路由所有流量)。
    # 如果需要只访问 VPN 资源,可以只写 VPN 子网,例如 10.8.0.0/24
    AllowedIPs = 10.0.0.0/0
    # 服务器的公网 IP 地址 和 监听端口
    Endpoint = 1.2.3.4:51820
    # 启用并设置预共享密钥 (如果在 Server 端启用了,且文件内容相同)
    # PreSharedKey = <shared_key>
    # 开启持久 Keepalive,防止 NAT 超时 (尤其在移动网络或客户端在 NAT 后很有用)
    PersistentKeepalive = 25

    替换说明:

    • <client_private_key>: 用上一步 cat client_privatekey 的输出结果替换。
    • <server_public_key>: 回到 Server 上,用 cat /etc/wireguard/keys/server_publickey 的输出结果替换。
    • Endpoint = 1.2.3.4:51820: 将 1.2.3.4 替换为你服务器的 真实公网 IP 地址51820 是 Server 的监听端口,保持一致。
  4. 赋予配置文件和密钥安全权限:

    chmod 600 /etc/wireguard/wg0-client.conf
    chmod 600 /etc/wireguard/keys/*
  5. 回到服务器,配置 Peer 信息 (Server 上): 现在客户端生成了密钥,需要把客户端的公钥添加到服务器的配置中。编辑 Server 上的 /etc/wireguard/wg0.conf,在 [Peer] 部分:

    [Peer]
    PublicKey = <client_public_key>  # 这里换成客户端生成的公钥
    AllowedIPs = 10.8.0.2/32
    # PreSharedKey = <shared_key>  # 如果在客户端配置了且两边相同,启用并填写

    保存退出。然后应用配置:

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

(四) 启动客户端连接

在客户端上启动 VPN 连接:

sudo wg-quick up wg0-client

(可选) 设置客户端开机自动连接该配置:

sudo systemctl enable wg-quick@wg0-client

五、 验证连接是否成功

执行以下命令查看状态:

# 在客户端执行
sudo wg
# 在服务器执行
sudo wg

客户端 的输出中,你应该能看到类似这样的内容:

interface: wg0
  public key: <client_public_key>
  private key: (hidden)
  listening port: <some_port>
peer: <server_public_key>
  endpoint: 1.2.3.4:51820
  allowed ips: 0.0.0.0/0
  latest handshake: 5 seconds ago
  transfer: 123 B received, 321 B sent
  • latest handshake 显示最近一次成功建立连接的时间。如果这里是几秒钟或几分钟前,并且有传输数据,说明连接正常。

服务器 的输出中,应该能看到 peer 部分有客户端的公钥,并且也有 latest handshake 信息。

进一步测试连通性:

  • 在客户端上 Ping 服务器的 VPN IP:

    ping 10.8.0.1

    你应该能收到回复。

  • (如果配置了 NAT) 在客户端上 Ping 一个公共 DNS 服务器,测试互联网连通性:

    ping 8.8.8.8

    如果能通,说明通过服务器的 NAT 上网成功。

  • 在服务器上 Ping 客户端的 VPN IP:

    ping 10.8.0.2

    这也应该能通。

检查路由 (客户端): 运行 ip routeroute -n。你应该看到一条目标为 0.0.0.0/0 (或 default,但下一跳或 dev 是 wg0,而不是你的物理网卡。这表示你的所有流量都经过了 VPN。


六、 注意事项 (重要!)

  • 防火墙 (Server & Client):
    • 确保服务器防火墙 (ufwfirewalldiptables) 打开了 UDP 端口 51820 (或自定义端口)。
    • 客户端防火墙也要确保允许 VPN 流量 (通常 wg-quick 会自动设置)。
  • NAT 与 动态 IP: 上面的 EndPoint 地址必须是客户端可以连接到的服务器的有效公网 IP。如果服务器的 IP 是动态的 (大多数家用宽带),你需要使用 DDNS 服务并更新客户端的配置。
  • 安全:
    • 保护好你的私钥 (PrivateKey) 和 预共享密钥 (PreSharedKey)!它们是敏感信息,决定了 VPN 的安全性。umask 077 可以确保创建的文件权限安全。
    • 定期更新密钥是推荐做法。
  • 多客户端: 可以为每个客户端创建独立的密钥对,并在服务器的配置中添加多个 [Peer] 部分,并赋予不同的 AllowedIPs。每个客户端也需要自己的配置文件。

这份文档提供了 WireGuard 的核心概念和一个基本的点对点配置指南。根据你的具体需求,配置可能会更复杂。请参考 WireGuard 官方文档 (https://www.wireguard.com/) 和 man wgman wg-quick 获取更高级的配置选项和详细信息。

发表评论
博客分类