远程访问方案(二):WireGuard点对点组网实战
AI摘要
本文提供了一个完整的WireGuard组网方案指南,包括架构说明、CentOS 7内核升级、云服务器配置、公司内网配置、客户端配置(Mac)、验证与测试以及常见问题排查。文章详细介绍了如何配置网络拓扑、IP地址规划、安装Docker和Docker Compose、创建WireGuard目录和配置文件、启动服务、修改服务器配置、设置内网路由权限等。同时,还提供了客户端配置方法,包括使用Homebrew和App Store安装WireGuard,并配置连接。最后,文章还提供了验证与测试方法和常见问题排查,以确保组网方案的稳定性和安全性。
目录
架构说明
网络拓扑
客户端 Mac (10.0.0.4)
↓ WireGuard 隧道
云服务器 (10.0.0.1)
↓ WireGuard 隧道
公司内网网关 peer2 (10.0.0.3)
↓ 本地网络
公司内网设备 (192.168.3.0/24)IP 地址规划
| 设备 | VPN IP | 说明 |
|---|---|---|
| 云服务器 | 10.0.0.1 | WireGuard 服务端 |
| peer1 | 10.0.0.2 | 其他客户端 |
| peer2(公司内网) | 10.0.0.3 | 内网网关,转发到 192.168.3.0/24 |
| peer3(Mac) | 10.0.0.4 | 你的开发机 |
| peer4-5 | 10.0.0.5-6 | 预留 |
CentOS 7 内核升级(重要)
⚠️ 为什么要升级内核?
CentOS 7 默认内核版本为 3.10.x,不支持 WireGuard 内核模块。必须升级到 5.6+ 内核才能正常使用 WireGuard。
升级步骤
1. 导入 ELRepo 仓库
# 导入 GPG 密钥
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
# 安装 ELRepo 仓库
rpm -Uvh https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm2. 安装最新内核
# 查看可用的内核版本
yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
# 安装 kernel-ml(mainline stable)
yum --enablerepo=elrepo-kernel install kernel-ml kernel-ml-devel -y
# 推荐版本:kernel-ml-6.6.12-1.el7.elrepo.x86_64
# 手动下载地址:https://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/3. 设置默认启动内核
# 查看当前所有内核
awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
# 输出示例:
# 0 : CentOS Linux (6.6.12-1.el7.elrepo.x86_64) 7 (Core)
# 1 : CentOS Linux (3.10.0-1160.el7.x86_64) 7 (Core)
# 设置默认启动第一个内核(6.6.12)
grub2-set-default 0
# 验证配置
grub2-editenv list4. 重启系统
reboot5. 验证内核版本
# 重启后检查内核版本
uname -r
# 应该输出:6.6.12-1.el7.elrepo.x86_64
# 验证 WireGuard 模块是否可用
modprobe wireguard && echo "WireGuard 模块加载成功" || echo "WireGuard 模块加载失败"常见内核升级问题
问题 1:升级后无法启动
解决方法:
- 重启时进入 GRUB 菜单
- 选择旧内核(3.10.x)启动
- 检查
/boot分区空间是否足够:df -h /boot - 清理旧内核:
yum remove kernel-3.10.0-xxx
问题 2:Docker 容器无法启动
解决方法:
# 重新加载 Docker 服务
systemctl daemon-reload
systemctl restart docker
# 检查 Docker 状态
systemctl status docker问题 3:网络模块加载失败
解决方法:
# 确保安装了 kernel-ml-devel
yum --enablerepo=elrepo-kernel install kernel-ml-devel -y
# 重启后重新加载模块
modprobe wireguard云服务器配置
1. 安装 Docker 和 Docker Compose
# 安装 Docker
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.io
# 启动 Docker
systemctl start docker
systemctl enable docker
# 安装 Docker Compose
curl -L "https://github.com/docker/compose/releases/download/v2.20.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose2. 创建 WireGuard 目录
mkdir -p /opt/wireguard
cd /opt/wireguard3. 创建 docker-compose.yml
nano docker-compose.ymlversion: "3.8"
services:
wireguard:
image: linuxserver/wireguard:latest
container_name: wireguard
cap_add:
- NET_ADMIN
- SYS_MODULE
environment:
- PUID=1000
- PGID=1000
- TZ=Asia/Shanghai
- SERVERURL=<云服务器公网IP> # 改成你的云服务器公网 IP
- SERVERPORT=51820
- PEERS=5 # 客户端数量
- PEERDNS=223.5.5.5 # 阿里 DNS
- INTERNAL_SUBNET=10.0.0.0/24
- ALLOWEDIPS=0.0.0.0/0
- LOG_CONFS=true
volumes:
- ./config:/config
- /lib/modules:/lib/modules:ro
ports:
- "51820:51820/udp"
sysctls:
- net.ipv4.conf.all.src_valid_mark=1
- net.ipv4.ip_forward=1
restart: unless-stopped4. 启动服务
# 启动容器
docker-compose up -d
# 查看日志
docker-compose logs -f5. 修改服务器配置
# 编辑服务器配置
nano ./config/wg0.conf关键修改:给 peer2 添加内网路由权限
[Interface]
Address = 10.0.0.1
ListenPort = 51820
PrivateKey = <服务器私钥>
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth+ -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth+ -j MASQUERADE
[Peer]
# peer1
PublicKey = <peer1公钥>
PresharedKey = <peer1预共享密钥>
AllowedIPs = 10.0.0.2/32
[Peer]
# peer2 - 公司内网网关(⚠️ 重要:必须添加内网网段)
PublicKey = <peer2公钥>
PresharedKey = <peer2预共享密钥>
AllowedIPs = 10.0.0.3/32, 192.168.3.0/24 # 添加内网网段
[Peer]
# peer3 - Mac 客户端
PublicKey = <peer3公钥>
PresharedKey = <peer3预共享密钥>
AllowedIPs = 10.0.0.4/32
[Peer]
# peer4
PublicKey = <peer4公钥>
PresharedKey = <peer4预共享密钥>
AllowedIPs = 10.0.0.5/32
[Peer]
# peer5
PublicKey = <peer5公钥>
PresharedKey = <peer5预共享密钥>
AllowedIPs = 10.0.0.6/32⚠️ 核心配置说明:
AllowedIPs = 10.0.0.3/32, 192.168.3.0/24- 这一行至关重要!- 服务器需要知道 192.168.3.0/24 网段通过 peer2 (10.0.0.3) 转发
- 没有这个配置,其他客户端无法访问公司内网
6. 重启容器
docker-compose restart
# 验证配置
docker-compose exec wireguard wg show公司内网配置
前提条件
- ✅ CentOS 7 已升级到内核 6.6.12+
- ✅ 服务器能访问外网
- ✅ 能访问公司内网 192.168.3.0/24
1. 创建 WireGuard 目录
mkdir -p /root/company-vpn
cd /root/company-vpn2. 创建配置目录
mkdir -p config/wg_confs3. 创建 WireGuard 配置文件
nano config/wg_confs/wg0.conf[Interface]
PrivateKey = <peer2的私钥> # 从云服务器 config/peer2/peer2.conf 获取
Address = 10.0.0.3/24
DNS = 223.5.5.5
# 重要:启用 IP 转发和 NAT
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
[Peer]
PublicKey = <服务器公钥> # 从云服务器配置获取
PresharedKey = <peer2预共享密钥>
Endpoint = <云服务器公网IP>:51820 # 直接连接云服务器
AllowedIPs = 10.0.0.0/24 # 允许转发 VPN 网段流量
PersistentKeepalive = 25⚠️ 配置要点:
Address = 10.0.0.3/24- 使用 /24 而不是 /32Endpoint- 必须是云服务器的公网 IP:51820AllowedIPs = 10.0.0.0/24- 允许接收和转发其他 peer 的流量PostUp/PostDown- 启用 NAT,让内网流量能转发
4. 创建 docker-compose.yml
nano docker-compose.ymlversion: "3.8"
services:
wireguard:
image: linuxserver/wireguard:latest
container_name: wireguard-company
cap_add:
- NET_ADMIN
- SYS_MODULE
environment:
- PUID=1000
- PGID=1000
- TZ=Asia/Shanghai
volumes:
- ./config:/config
- /lib/modules:/lib/modules:ro
sysctls:
- net.ipv4.conf.all.src_valid_mark=1
- net.ipv4.ip_forward=1
- net.ipv4.conf.all.forwarding=1
network_mode: host # 使用 host 网络模式,便于访问宿主机内网
restart: unless-stopped5. 设置配置文件权限
chmod 600 config/wg_confs/wg0.conf6. 启动服务
# 启动容器
docker-compose up -d
# 查看日志
docker logs wireguard-company -f
# 查看 WireGuard 状态
docker exec wireguard-company wg show7. 验证连接
# 1. 检查 WireGuard 状态
docker exec wireguard-company wg show
# 期望输出(关键部分):
# peer: <服务器公钥>
# endpoint: <云服务器IP>:51820
# allowed ips: 10.0.0.0/24
# latest handshake: X seconds ago ← 必须有这个
# transfer: X KiB received, X KiB sent ← 双向有数据
# 2. 测试 ping 云服务器
docker exec wireguard-company ping -c 4 10.0.0.1
# 3. 测试访问本地内网
docker exec wireguard-company ping -c 4 192.168.3.168客户端配置(Mac)
方法 1:使用 Homebrew 安装(命令行)
1. 安装 WireGuard
# 安装 WireGuard 工具
brew install wireguard-tools2. 创建配置文件
# 创建配置目录
sudo mkdir -p /opt/homebrew/etc/wireguard
# 创建配置文件
sudo nano /opt/homebrew/etc/wireguard/wg0.conf3. 配置内容
[Interface]
PrivateKey = <你的Mac私钥> # 从云服务器 config/peer3/peer3.conf 获取
Address = 10.0.0.4/32
DNS = 223.5.5.5
[Peer]
PublicKey = <服务器公钥>
PresharedKey = <peer3预共享密钥>
Endpoint = <云服务器公网IP>:51820
AllowedIPs = 10.0.0.0/24, 192.168.3.0/24 # 只路由 VPN 和内网流量
PersistentKeepalive = 25⚠️ AllowedIPs 配置说明:
10.0.0.0/24, 192.168.3.0/24- 只路由 VPN 和公司内网(推荐)0.0.0.0/0- 所有流量走 VPN(可能与 Surge 等代理冲突)
4. 设置权限
sudo chmod 600 /opt/homebrew/etc/wireguard/wg0.conf5. 连接 VPN
# 启动 WireGuard
sudo wg-quick up wg0
# 查看状态
sudo wg show
# 断开连接
sudo wg-quick down wg0方法 2:使用 App Store 安装(图形界面)
注:需要使用国外的APPID
- 打开 App Store,搜索 "WireGuard"
- 安装官方 WireGuard 应用
- 打开应用,点击 "Add Tunnel" → "Add Empty Tunnel"
- 粘贴上面的配置内容
- 点击 "Activate" 激活连接
验证与测试
1. 检查连接状态
在 Mac 上
# 查看 WireGuard 状态
sudo wg show
# 期望输出:
# interface: utun7
# public key: <你的公钥>
# private key: (hidden)
# listening port: xxxxx
#
# peer: <服务器公钥>
# preshared key: (hidden)
# endpoint: <云服务器IP>:51820
# allowed ips: 10.0.0.0/24, 192.168.3.0/24
# latest handshake: 10 seconds ago ← 必须有
# transfer: 1.2 KiB received, 2.3 KiB sent ← 双向有数据在云服务器上
# 查看所有 peer 状态
docker-compose exec wireguard wg show
# 应该看到 peer2 和 peer3 都在线
# 都有 endpoint、latest handshake 和双向 transfer在公司内网服务器上
# 查看连接状态
docker exec wireguard-company wg show
# 应该显示与云服务器的连接正常2. 测试连通性
从 Mac 测试
# 1. 测试云服务器
ping 10.0.0.1
# 2. 测试公司内网网关
ping 10.0.0.3
# 3. 测试公司内网设备
ping 192.168.3.168
ping 192.168.3.1
# 4. 使用 traceroute 查看路径
traceroute 192.168.3.168
# 期望路径:
# 1 10.0.0.1 (云服务器)
# 2 10.0.0.3 (公司内网网关)
# 3 192.168.3.168 (目标设备)3. 完整链路测试
# === Mac 终端 ===
# 持续 ping 测试稳定性
ping 192.168.3.168
# === 同时在另一个终端监控 ===
watch -n 2 'sudo wg show'常见问题排查
问题 1:Mac 无法连接云服务器
症状:
transfer: 0 B received, X KiB sent
没有 latest handshake解决方法:
检查云服务器防火墙
# 在云服务器上确认端口开放 firewall-cmd --list-all firewall-cmd --add-port=51820/udp --permanent firewall-cmd --reload检查配置文件中的 Endpoint
# Mac 配置文件中 Endpoint = <云服务器公网IP>:51820 # 确保 IP 正确重启 WireGuard
sudo wg-quick down wg0 sudo wg-quick up wg0
问题 2:能连接 VPN 但无法访问内网
症状:
ping 10.0.0.1 成功
ping 10.0.0.3 成功
ping 192.168.3.168 失败排查步骤:
检查云服务器配置
# peer2 的 AllowedIPs 必须包含内网 cat ./config/wg0.conf | grep -A 3 "peer2" # 应该看到: # AllowedIPs = 10.0.0.3/32, 192.168.3.0/24检查 peer2 是否在线
# 在云服务器上 docker-compose exec wireguard wg show | grep -A 6 "<peer2公钥>" # 必须有 endpoint 和 latest handshake检查公司内网服务器能否访问内网
# 在公司内网服务器上 docker exec wireguard-company ping 192.168.3.168检查 Mac 的 AllowedIPs
# Mac 配置文件中 AllowedIPs = 10.0.0.0/24, 192.168.3.0/24 # 必须包含内网网段
问题 3:peer2 无法连接云服务器
症状:
# 在公司内网服务器上
docker exec wireguard-company wg show
# 显示 0 B received 或没有 latest handshake解决方法:
检查 Endpoint 配置
cat config/wg_confs/wg0.conf | grep Endpoint # 应该是: Endpoint = <云服务器公网IP>:51820 # 不是 127.0.0.1检查公司防火墙
# 测试能否连接云服务器 nc -vuz <云服务器IP> 51820重启容器
docker restart wireguard-company docker logs wireguard-company --tail=30
问题 4:Surge 代理干扰
症状:
- 时通时断
- 路由冲突
解决方法:
- 完全退出 Surge(不是暂停,是退出应用)
修改 Mac 配置,只路由内网
AllowedIPs = 10.0.0.0/24, 192.168.3.0/24 # 不要用 0.0.0.0/0重启 WireGuard
sudo wg-quick down wg0 sudo wg-quick up wg0
问题 5:CentOS 7 内核模块加载失败
症状:
modprobe: FATAL: Module wireguard not found解决方法:
确认内核版本
uname -r # 必须是 5.6+ 或 6.6.12+重新安装内核和 devel 包
yum --enablerepo=elrepo-kernel install kernel-ml kernel-ml-devel -y reboot检查模块
modprobe wireguard lsmod | grep wireguard
问题 6:Docker 容器网络问题
症状:
- 容器无法访问宿主机内网
- IP 转发不生效
解决方法:
使用 host 网络模式
# docker-compose.yml network_mode: host启用 IP 转发
sysctls: - net.ipv4.ip_forward=1 - net.ipv4.conf.all.forwarding=1重启容器
docker-compose down docker-compose up -d
监控和维护
实时监控连接状态
# Mac 上
watch -n 2 'sudo wg show'
# 云服务器上
watch -n 2 'docker-compose exec wireguard wg show'
# 公司内网服务器上
watch -n 2 'docker exec wireguard-company wg show'日志查看
# 云服务器
docker-compose logs -f wireguard
# 公司内网
docker logs -f wireguard-company定期检查
# 检查所有 peer 状态
docker-compose exec wireguard wg show
# 关注:
# 1. 是否有 latest handshake(超过 3 分钟说明连接断了)
# 2. transfer 数据是否在增长
# 3. endpoint 是否正确总结
关键配置点
- CentOS 7 必须升级内核到 6.6.12+
- 云服务器 peer2 的 AllowedIPs 必须包含内网网段
- 公司内网 peer2 的 Endpoint 必须是云服务器公网 IP
- Mac 的 AllowedIPs 必须包含内网网段
- 避免 Surge 等代理软件干扰
架构优势
✅ 无需 FRP,配置简单
✅ 延迟低,性能好
✅ 点对点加密,安全性高
✅ 易于维护和排查
注意事项
⚠️ 确保云服务器防火墙开放 UDP 51820
⚠️ 定期检查内核模块加载状态
⚠️ 监控 peer2 连接状态(它是内网网关)
⚠️ 备份配置文件和密钥