wireguard@wireguard-go mac/linux
wireguard-go
是 WireGuard 的用户空间实现,用 Go 语言编写。WireGuard 是一种现代、快速且安全的 VPN 协议,旨在提供比 IPsec 和 OpenVPN 更简单、更高效的解决方案。wireguard-go
主要用于不支持内核模块的平台(如 macOS 或某些 Linux 系统),通过用户空间实现 WireGuard 协议。
GitHub 上的仓库 https://github.com/WireGuard/wireguard-go
仅为镜像
核心特点
- 跨平台支持:支持 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
2git clone https://git.zx2c4.com/wireguard-go
cd wireguard-go或者从 GitHub 镜像克隆:
1
2git clone https://github.com/WireGuard/wireguard-go
cd wireguard-go编译:
使用make
命令编译:1
make
这会生成
wireguard-go
可执行文件。(可选)安装:
将编译好的二进制文件移动到系统路径:1
sudo cp wireguard-go /usr/local/bin/
3. 运行
wireguard-go
需要指定网络接口名称运行。以下是基本用法:
基本运行:
1
sudo wireguard-go <interface-name>
例如,运行一个名为
wg0
的接口:1
sudo wireguard-go wg0
前台运行:
默认情况下,wireguard-go
会后台运行。若需前台运行以查看日志,添加-f
或--foreground
参数:1
sudo wireguard-go -f wg0
调试模式:
启用详细日志,设置环境变量LOG_LEVEL=debug
:1
LOG_LEVEL=debug sudo wireguard-go -f wg0
macOS 特定配置:
- macOS 使用 utun 驱动,接口名称必须为
utun[0-9]+
或utun
(由内核自动分配)。 - 若使用
utun
自动分配接口名,可设置环境变量WG_TUN_NAME_FILE
保存实际接口名:1
2
3export WG_TUN_NAME_FILE=/tmp/wg_interface_name
sudo wireguard-go utun
cat /tmp/wg_interface_name # 查看实际接口名
- macOS 使用 utun 驱动,接口名称必须为
4. 配置 WireGuard
wireguard-go
创建的接口需要通过 wg(8)
工具配置。以下是配置步骤:
安装 WireGuard 工具:
确保已安装wireguard-tools
(包含wg
命令)。在 Linux 上:1
2sudo apt install wireguard-tools # Debian/Ubuntu
sudo yum install wireguard-tools # CentOS/RHEL在 macOS 上,可通过 Homebrew 安装:
1
brew install wireguard-tools
生成密钥对:
为接口生成公钥和私钥:1
wg genkey | tee privatekey | wg pubkey > publickey
创建配置文件:
创建/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>:51820PrivateKey
:本地私钥。Address
:接口的 IP 地址。PublicKey
:对端公钥。AllowedIPs
:允许通过 VPN 隧道的 IP 范围。Endpoint
:对端的 IP 和端口。
应用配置:
使用wg
命令加载配置:1
sudo wg setconf wg0 /etc/wireguard/wg0.conf
启动接口:
使用标准网络工具激活接口:1
2sudo ip link set wg0 up
sudo ip addr add 10.0.0.1/24 dev wg0验证连接:
检查接口状态: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
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
4sudo 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客户端配置(假设也使用
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运行类似命令启动客户端。
测试连接:
从客户端 ping 服务器:1
ping 10.0.0.1
常见问题
为什么 Linux 上提示使用内核模块?
wireguard-go
是用户空间实现,性能低于内核模块。在 Linux 内核 5.6 及以上版本,WireGuard 已内置,建议启用内核模块:1
sudo modprobe wireguard
macOS 接口名称错误?
确保使用utun
或utun[0-9]+
作为接口名,或设置WG_TUN_NAME_FILE
捕获自动分配的名称。如何调试连接问题?
- 检查日志:
LOG_LEVEL=debug
。 - 验证配置:
wg show
检查公钥和端点。 - 确保防火墙允许 UDP 端口(如 51820)。
- 检查日志: