使用 WireGuard 搭建异地服务器内网

详细教程:使用 WireGuard 在多个异地服务器之间建立安全的 VPN 内网,包括配置步骤、最佳实践和实际应用场景

为什么需要组建内网?

在分布式部署场景中,多台异地服务器之间建立安全的通信通道具有重要价值:

  • 简化权限管理:内网通信可以免去复杂的公网权限校验
  • 提升安全性:避免敏感服务暴露在公网上
  • 优化性能:内网通信延迟更低,带宽更稳定

实际应用场景

以 Docker 服务为例,如果需要将位于广州的服务器的 Docker Daemon socket 分享给位于深圳的服务器操作:

WireGuard 简介

WireGuard 是一种现代化的 VPN 解决方案,具有以下优势:

  • 简单高效:配置简单,性能优异
  • 内核级实现:运行在内核空间,效率更高
  • 现代加密:使用最新的加密算法

适用场景

WireGuard 采用全互联(Full Mesh)拓扑结构,每台机器都需要配置其他所有机器为 peer。例如 ABC 三台机器组建内网:

  • A 机器配置 B、C 为 peer
  • B 机器配置 A、C 为 peer
  • C 机器配置 A、B 为 peer

适用性:适合少量机器(通常 ≤ 10 台)的场景,机器数量过多时建议考虑其他方案。

环境准备

系统要求

  • 内核版本:Linux 5.x 或更高版本
  • 操作系统:支持 WireGuard 的 Linux 发行版

安装 WireGuard

# Ubuntu/Debian
sudo apt update && sudo apt install wireguard-tools

# CentOS/RHEL
sudo yum install wireguard-tools

# 或使用 EPEL
sudo yum install epel-release
sudo yum install wireguard-tools

配置步骤

1. 生成密钥对

cd /etc/wireguard
umask 077
wg genkey | tee privatekey | wg pubkey > publickey

2. 创建配置文件

编辑 /etc/wireguard/wg0.conf

[Interface]
Address = 192.168.2.1/24
ListenPort = 1234
PrivateKey = <本机私钥>

[Peer]
PublicKey = <服务器2的公钥>
AllowedIPs = 192.168.2.2/32
Endpoint = <服务器2公网IP>:1234
PersistentKeepalive = 60

[Peer]
PublicKey = <服务器3的公钥>
AllowedIPs = 192.168.2.3/32
Endpoint = <服务器3公网IP>:1234
PersistentKeepalive = 60

配置说明

  • Address:本机在内网中的 IP 地址和网段
  • ListenPort:WireGuard 监听端口
  • PrivateKey:本机私钥(从 privatekey 文件读取)
  • PublicKey:对端服务器的公钥
  • AllowedIPs:路由规则,指定访问哪些 IP 时转发到该 peer
  • Endpoint:对端服务器的公网地址和端口
  • PersistentKeepalive:NAT 穿透心跳间隔(秒)

3. 启动服务

# 启动 WireGuard 接口
sudo wg-quick up wg0

# 停止 WireGuard 接口
sudo wg-quick down wg0

# 查看状态
sudo wg show

4. 设置开机自启

sudo systemctl enable wg-quick@wg0

验证连接

# 检查接口状态
ip addr show wg0

# 测试连通性
ping 192.168.2.2
ping 192.168.2.3

# 查看路由表
ip route show table all | grep wg0

故障排查

常见问题

  1. 连接失败

    • 检查防火墙设置
    • 确认端口是否开放
    • 验证密钥配置
  2. NAT 穿透问题

    • 调整 PersistentKeepalive 值
    • 检查服务器是否在 NAT 后面
  3. 路由问题

    • 确认 AllowedIPs 配置正确
    • 检查系统路由表

安全建议

  • 定期更换密钥对
  • 使用非标准端口
  • 配置防火墙规则
  • 监控网络流量

参考资源

使用 Hugo 构建
主题 StackJimmy 设计