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.1WireGuard 服务端
peer110.0.0.2其他客户端
peer2(公司内网)10.0.0.3内网网关,转发到 192.168.3.0/24
peer3(Mac)10.0.0.4你的开发机
peer4-510.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.rpm

2. 安装最新内核

# 查看可用的内核版本
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 list

4. 重启系统

reboot

5. 验证内核版本

# 重启后检查内核版本
uname -r
# 应该输出:6.6.12-1.el7.elrepo.x86_64

# 验证 WireGuard 模块是否可用
modprobe wireguard && echo "WireGuard 模块加载成功" || echo "WireGuard 模块加载失败"

常见内核升级问题

问题 1:升级后无法启动

解决方法:

  1. 重启时进入 GRUB 菜单
  2. 选择旧内核(3.10.x)启动
  3. 检查 /boot 分区空间是否足够:df -h /boot
  4. 清理旧内核: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-compose

2. 创建 WireGuard 目录

mkdir -p /opt/wireguard
cd /opt/wireguard

3. 创建 docker-compose.yml

nano docker-compose.yml
version: "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-stopped

4. 启动服务

# 启动容器
docker-compose up -d

# 查看日志
docker-compose logs -f

5. 修改服务器配置

# 编辑服务器配置
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-vpn

2. 创建配置目录

mkdir -p config/wg_confs

3. 创建 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

⚠️ 配置要点:

  1. Address = 10.0.0.3/24 - 使用 /24 而不是 /32
  2. Endpoint - 必须是云服务器的公网 IP:51820
  3. AllowedIPs = 10.0.0.0/24 - 允许接收和转发其他 peer 的流量
  4. PostUp/PostDown - 启用 NAT,让内网流量能转发

4. 创建 docker-compose.yml

nano docker-compose.yml
version: "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-stopped

5. 设置配置文件权限

chmod 600 config/wg_confs/wg0.conf

6. 启动服务

# 启动容器
docker-compose up -d

# 查看日志
docker logs wireguard-company -f

# 查看 WireGuard 状态
docker exec wireguard-company wg show

7. 验证连接

# 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-tools

2. 创建配置文件

# 创建配置目录
sudo mkdir -p /opt/homebrew/etc/wireguard

# 创建配置文件
sudo nano /opt/homebrew/etc/wireguard/wg0.conf

3. 配置内容

[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.conf

5. 连接 VPN

# 启动 WireGuard
sudo wg-quick up wg0

# 查看状态
sudo wg show

# 断开连接
sudo wg-quick down wg0

方法 2:使用 App Store 安装(图形界面)

注:需要使用国外的APPID

  1. 打开 App Store,搜索 "WireGuard"
  2. 安装官方 WireGuard 应用
  3. 打开应用,点击 "Add Tunnel" → "Add Empty Tunnel"
  4. 粘贴上面的配置内容
  5. 点击 "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

解决方法:

  1. 检查云服务器防火墙

    # 在云服务器上确认端口开放
    firewall-cmd --list-all
    firewall-cmd --add-port=51820/udp --permanent
    firewall-cmd --reload
  2. 检查配置文件中的 Endpoint

    # Mac 配置文件中
    Endpoint = <云服务器公网IP>:51820  # 确保 IP 正确
  3. 重启 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 失败

排查步骤:

  1. 检查云服务器配置

    # peer2 的 AllowedIPs 必须包含内网
    cat ./config/wg0.conf | grep -A 3 "peer2"
    
    # 应该看到:
    # AllowedIPs = 10.0.0.3/32, 192.168.3.0/24
  2. 检查 peer2 是否在线

    # 在云服务器上
    docker-compose exec wireguard wg show | grep -A 6 "<peer2公钥>"
    
    # 必须有 endpoint 和 latest handshake
  3. 检查公司内网服务器能否访问内网

    # 在公司内网服务器上
    docker exec wireguard-company ping 192.168.3.168
  4. 检查 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

解决方法:

  1. 检查 Endpoint 配置

    cat config/wg_confs/wg0.conf | grep Endpoint
    
    # 应该是:
    Endpoint = <云服务器公网IP>:51820  # 不是 127.0.0.1
  2. 检查公司防火墙

    # 测试能否连接云服务器
    nc -vuz <云服务器IP> 51820
  3. 重启容器

    docker restart wireguard-company
    docker logs wireguard-company --tail=30

问题 4:Surge 代理干扰

症状:

  • 时通时断
  • 路由冲突

解决方法:

  1. 完全退出 Surge(不是暂停,是退出应用)
  2. 修改 Mac 配置,只路由内网

    AllowedIPs = 10.0.0.0/24, 192.168.3.0/24  # 不要用 0.0.0.0/0
  3. 重启 WireGuard

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

问题 5:CentOS 7 内核模块加载失败

症状:

modprobe: FATAL: Module wireguard not found

解决方法:

  1. 确认内核版本

    uname -r
    # 必须是 5.6+ 或 6.6.12+
  2. 重新安装内核和 devel 包

    yum --enablerepo=elrepo-kernel install kernel-ml kernel-ml-devel -y
    reboot
  3. 检查模块

    modprobe wireguard
    lsmod | grep wireguard

问题 6:Docker 容器网络问题

症状:

  • 容器无法访问宿主机内网
  • IP 转发不生效

解决方法:

  1. 使用 host 网络模式

    # docker-compose.yml
    network_mode: host
  2. 启用 IP 转发

    sysctls:
      - net.ipv4.ip_forward=1
      - net.ipv4.conf.all.forwarding=1
  3. 重启容器

    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 是否正确

总结

关键配置点

  1. CentOS 7 必须升级内核到 6.6.12+
  2. 云服务器 peer2 的 AllowedIPs 必须包含内网网段
  3. 公司内网 peer2 的 Endpoint 必须是云服务器公网 IP
  4. Mac 的 AllowedIPs 必须包含内网网段
  5. 避免 Surge 等代理软件干扰

架构优势

✅ 无需 FRP,配置简单
✅ 延迟低,性能好
✅ 点对点加密,安全性高
✅ 易于维护和排查

注意事项

⚠️ 确保云服务器防火墙开放 UDP 51820
⚠️ 定期检查内核模块加载状态
⚠️ 监控 peer2 连接状态(它是内网网关)
⚠️ 备份配置文件和密钥

标签: none

添加新评论