wireguard@wireguard-go mac/linux

wireguard-go 是 WireGuard 的用户空间实现,用 Go 语言编写。WireGuard 是一种现代、快速且安全的 VPN 协议,旨在提供比 IPsec 和 OpenVPN 更简单、更高效的解决方案。wireguard-go 主要用于不支持内核模块的平台(如 macOS 或某些 Linux 系统),通过用户空间实现 WireGuard 协议。


仅为镜像

核心特点

  • 跨平台支持:支持 Linux、macOS、FreeBSD、OpenBSD 等系统,但在 Linux 上推荐使用内核模块以获得更好性能。
  • 用户空间实现:无需内核支持,适合无法加载 WireGuard 内核模块的场景。
  • 高性能加密:使用现代加密原语,确保安全性和速度。
  • 简单配置:通过 wg(8) 工具或标准网络命令(如 ip(8)ifconfig(8))进行配置。
  • 限制:在 macOS 上使用 utun 驱动,不支持 sticky sockets 和 fwmarks,且接口名称受限(如 utun[0-9]+utun)。

适用场景

  • 在 macOS 或其他不支持 WireGuard 内核模块的系统上运行 VPN。
  • 开发或测试环境中需要用户空间 VPN 解决方案。
  • 需要轻量、易部署的 VPN 协议。

使用方法

1. 前置条件

  • Go 环境:需要安装最新版本的 Go(推荐使用 go.dev 提供的安装包)。
  • 操作系统:支持 Linux、macOS、FreeBSD、OpenBSD 等。
  • 权限:部分操作需要 root 权限(如创建 TUN 设备)。

2. 安装和编译

  1. 克隆仓库

    1
    2
    git clone https://git.zx2c4.com/wireguard-go
    cd wireguard-go

    或者从 GitHub 镜像克隆:

    1
    2
    git clone https://github.com/WireGuard/wireguard-go
    cd wireguard-go
  2. 编译
    使用 make 命令编译:

    1
    make

    这会生成 wireguard-go 可执行文件。

  3. (可选)安装
    将编译好的二进制文件移动到系统路径:

    1
    sudo cp wireguard-go /usr/local/bin/

3. 运行

wireguard-go 需要指定网络接口名称运行。以下是基本用法:

  1. 基本运行

    1
    sudo wireguard-go <interface-name>

    例如,运行一个名为 wg0 的接口:

    1
    sudo wireguard-go wg0
  2. 前台运行
    默认情况下,wireguard-go 会后台运行。若需前台运行以查看日志,添加 -f--foreground 参数:

    1
    sudo wireguard-go -f wg0
  3. 调试模式
    启用详细日志,设置环境变量 LOG_LEVEL=debug

    1
    LOG_LEVEL=debug sudo wireguard-go -f wg0
  4. macOS 特定配置

    • macOS 使用 utun 驱动,接口名称必须为 utun[0-9]+utun(由内核自动分配)。
    • 若使用 utun 自动分配接口名,可设置环境变量 WG_TUN_NAME_FILE 保存实际接口名:
      1
      2
      3
      export WG_TUN_NAME_FILE=/tmp/wg_interface_name
      sudo wireguard-go utun
      cat /tmp/wg_interface_name # 查看实际接口名

4. 配置 WireGuard

wireguard-go 创建的接口需要通过 wg(8) 工具配置。以下是配置步骤:

  1. 安装 WireGuard 工具
    确保已安装 wireguard-tools(包含 wg 命令)。在 Linux 上:

    1
    2
    sudo apt install wireguard-tools  # Debian/Ubuntu
    sudo yum install wireguard-tools # CentOS/RHEL

    在 macOS 上,可通过 Homebrew 安装:

    1
    brew install wireguard-tools
  2. 生成密钥对
    为接口生成公钥和私钥:

    1
    wg genkey | tee privatekey | wg pubkey > publickey
  3. 创建配置文件
    创建 /etc/wireguard/wg0.conf 文件,示例配置如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    [Interface]
    PrivateKey = <your-private-key>
    ListenPort = 51820
    Address = 10.0.0.1/24

    [Peer]
    PublicKey = <peer-public-key>
    AllowedIPs = 10.0.0.2/32
    Endpoint = <peer-ip>:51820
    • PrivateKey:本地私钥。
    • Address:接口的 IP 地址。
    • PublicKey:对端公钥。
    • AllowedIPs:允许通过 VPN 隧道的 IP 范围。
    • Endpoint:对端的 IP 和端口。
  4. 应用配置
    使用 wg 命令加载配置:

    1
    sudo wg setconf wg0 /etc/wireguard/wg0.conf
  5. 启动接口
    使用标准网络工具激活接口:

    1
    2
    sudo ip link set wg0 up
    sudo ip addr add 10.0.0.1/24 dev wg0
  6. 验证连接
    检查接口状态:

    1
    sudo wg show

    确认是否有数据传输:

    1
    ping 10.0.0.2

5. 注意事项

  • Linux 优先使用内核模块:在 Linux 上,wireguard-go 仅推荐用于测试或特殊场景,优先使用内核模块以获得更好性能。安装内核模块方法见 https://www.wireguard.com/install/
  • macOS 限制
    • 不支持 fwmarks 和 sticky sockets。
    • 接口名称受 utun 驱动限制。
  • 日志管理:调试时使用 LOG_LEVEL=debug,但生产环境建议关闭以减少日志量。
  • 安全性:确保密钥文件权限严格(如 chmod 600 /etc/wireguard/wg0.conf),避免泄露私钥。

6. 高级用法

  • 自动化脚本:结合 wg-quick 简化配置和启动:
    1
    sudo wg-quick up wg0
    注意:wg-quick 可能需要调整以适配 wireguard-go 创建的接口。
  • Docker 部署:可使用 wireguard-go 的 Docker 镜像(如 masipcat/wireguard-go-docker),适合容器化环境。
  • 与其他工具集成:如结合 Pi-hole 或 Unbound 实现带广告拦截的 VPN。

示例:设置点对点 VPN

假设两台设备:

  • 服务器(运行 wireguard-go):IP 为 192.168.1.100,VPN IP 为 10.0.0.1
  • 客户端:VPN IP 为 10.0.0.2
  1. 服务器配置

    1
    2
    3
    4
    5
    6
    7
    8
    [Interface]
    PrivateKey = <server-private-key>
    Address = 10.0.0.1/24
    ListenPort = 51820

    [Peer]
    PublicKey = <client-public-key>
    AllowedIPs = 10.0.0.2/32

    运行:

    1
    2
    3
    4
    sudo wireguard-go -f wg0
    sudo wg setconf wg0 /etc/wireguard/wg0.conf
    sudo ip link set wg0 up
    sudo ip addr add 10.0.0.1/24 dev wg0
  2. 客户端配置(假设也使用 wireguard-go):

    1
    2
    3
    4
    5
    6
    7
    8
    [Interface]
    PrivateKey = <client-private-key>
    Address = 10.0.0.2/24

    [Peer]
    PublicKey = <server-public-key>
    AllowedIPs = 10.0.0.1/32
    Endpoint = 192.168.1.100:51820

    运行类似命令启动客户端。

  3. 测试连接
    从客户端 ping 服务器:

    1
    ping 10.0.0.1

常见问题

  1. 为什么 Linux 上提示使用内核模块?
    wireguard-go 是用户空间实现,性能低于内核模块。在 Linux 内核 5.6 及以上版本,WireGuard 已内置,建议启用内核模块:

    1
    sudo modprobe wireguard
  2. macOS 接口名称错误?
    确保使用 utunutun[0-9]+ 作为接口名,或设置 WG_TUN_NAME_FILE 捕获自动分配的名称。

  3. 如何调试连接问题?

    • 检查日志:LOG_LEVEL=debug
    • 验证配置:wg show 检查公钥和端点。
    • 确保防火墙允许 UDP 端口(如 51820)。