WireGuard是一款简单、现代且性能卓越的开源VPN工具,使用4000行代码就实现了完整的功能,设计精简,常常被称为下一代的VPN协议。其卓越的性能来自于下面几个方面:

  • 极致的精简:代码量少,从而使得代码漏洞和攻击面少
  • 内核级处理:运行在内核态。而非传统的用户空间方案,大福降低CPU负载和网络的开销延迟。
  • 加密:提前协商加密方式,建立连接后立刻高速加密传输。

其应用场景有:

  • 个人远程访问:在公共网络下,远程访问家庭和公司网络。
  • 异地组网:将企业不同分支机构连接在同一个网络下。
  • 站点到站点组网:连接多个办公地点的网络,使得不同地区的同时如同在一个办公室内工作。
  • 保护云上通信:在kubernetes等容器集群中,加密Pod与节点之间的通信。
  • 物联网IoT:对资源有限的嵌入式设备非常友好。

系统环境:Linux Rocky-Linux 4.18.0-553.89.1.el8_10.x86_64 #1 SMP Fri Dec 12 10:42:53 UTC 2025 x86_64 x86_64 x86_64 GNU/Linux

在 Rocky Linux 上通过容器化部署 WireGuard,主要依赖于 linuxserver/wireguard 这个广受信赖的基础镜像,它能很好地兼顾方便和灵活。这里为你梳理了两种主流方案,你可以根据自己的需求选择:

方案核心特点适用场景代表项目/工具
基础部署 (无Web界面)极简、稳定、资源占用低,通过环境变量或配置文件管理追求性能稳定,熟悉命令行,或需要深度自定义配置的用户linuxserver/wireguard
Web管理面板提供图形化界面,支持动态添加客户端、监控连接、调整配置希望简化管理,需要频繁增减用户或进行可视化管理的中小型团队或个人wg-easy, WGDashboard, Firefly

核心部署步骤

1. 准备工作

  • 安装 Docker 和 Docker Compose: 确保你的 Rocky Linux 系统已安装 Docker CE 和 Docker Compose 插件。
  • 创建项目目录: 为 WireGuard 统一创建一个目录,用来存放配置和数据。例如:sudo mkdir -p /opt/wireguard

2. 开启系统网络转发功能

在部署之前,先在宿主机上开启IPv4转发,这是VPN流量能正常路由的基础:

# 开启 IP 转发
echo 'net.ipv4.ip_forward=1' | sudo tee /etc/sysctl.d/99-wireguard.conf
# 应用配置
sudo sysctl -p /etc/sysctl.d/99-wireguard.conf
在Rocky Linux上部署WireGuard

你还可以通过sysctl net.ipv4.ip_forward确认设置生效(输出应为1)。

3. 选择部署方式

方案A:快速体验 - 通过 docker run 命令部署

这种方法适合快速测试。下面的命令会部署一个为 10 个客户端服务的 WireGuard 服务器:

sudo docker run -d \
  --name=wireguard \
  --cap-add=NET_ADMIN \
  --cap-add=SYS_MODULE \
  -e PUID=1000 \
  -e PGID=1000 \
  -e TZ=Asia/Shanghai \
  -e SERVERURL=your_domain_or_ip \      # 替换为你的服务器公网 IP 或域名
  -e SERVERPORT=51820 \
  -e PEERS=10 \                          # 需要的客户端配置文件数量
  -e PEERDNS=auto \
  -e INTERNAL_SUBNET=10.13.13.0 \
  -p 51820:51820/udp \
  -v /opt/wireguard/config:/config \
  -v /lib/modules:/lib/modules:ro \
  --sysctl="net.ipv4.conf.all.src_valid_mark=1" \
  --restart unless-stopped \
  ghcr.io/linuxserver/wireguard

这条命令在后台(-d)运行一个名为wireguard的容器,授予了其管理网络(NET_ADMIN)和加载内核模块(SYS_MODULE)的,并做了必要的配置。

方案B:推荐方式 - 使用 docker-compose 部署

这是更推荐的部署方式。创建一个 docker-compose.yml 文件,用声明式的方式管理配置,便于日后维护。

容器化部署允许使用任何不依赖 OpenSSL 的高性能加密算法(如 WireGuard 默认的 ChaCha20),完全符合你的性能要求,同时兼具容器化的便捷。

在项目目录 /opt/wireguard 下创建 docker-compose.yml 文件:

services:
  wireguard:
    image: ghcr.io/linuxserver/wireguard:latest
    container_name: wireguard
    cap_add:
      - NET_ADMIN              # 管理网络接口的必要权限
      - SYS_MODULE             # 加载 WireGuard 内核模块
    environment:
      - PUID=1000              # 容器内进程的用户ID,应与宿主机普通用户ID匹配
      - PGID=1000              # 组ID
      - TZ=Asia/Shanghai       # 时区
      - SERVERURL=vpn.example.com # 重要:替换为你的服务器公网 IP 或域名
      - SERVERPORT=51820       # WireGuard 服务端口(UDP)
      - PEERS=5                # 要创建的客户端配置文件数量(如:laptop, phone, etc.)
      - PEERDNS=auto           # 自动配置 DNS
      - INTERNAL_SUBNET=10.13.13.0 # VPN 内部使用的虚拟网络地址
      - ALLOWEDIPS=0.0.0.0/0   # 全部流量走 VPN(全隧道模式)
      - LOG_CONFS=false        # 生产环境建议设为 false,避免敏感信息泄露
    volumes:
      - ./config:/config       # 存放配置文件的目录
      - /lib/modules:/lib/modules:ro # 挂载宿主机内核模块,只读
    ports:
      - "51820:51820/udp"      # 暴露 WireGuard UDP 服务端口
    sysctls:
      - net.ipv4.conf.all.src_valid_mark=1 # 启用策略路由
    restart: unless-stopped    # 容器退出后自动重启

配置完成后,在 docker-compose.yml 所在目录执行以下命令启动服务:

sudo docker compose up -d

说明:

  • image 字段使用了我们熟悉的 linuxserver/wireguard 镜像,它是经过社区验证的稳定选择。
  • cap_add 部分为容器添加了必需的权限。
  • 配置文件会保存在你挂载的 ./config 目录下,查看即可获取客户端的.conf文件或二维码。

进阶体验 - 带 Web 管理面板的部署

如果希望有更直观的管理方式,可以选择 wg-easy 这类带 Web 面板的项目。它同样基于 Docker,部署非常便捷,非常适合需要经常管理客户端的场景。

关键注意事项与最佳实践

  • 必需的权限与内核模块:由于 WireGuard 在内核空间工作,容器必须拥有 NET_ADMINSYS_MODULE 权限,并挂载宿主机的 /lib/modules 目录,才能正确加载内核模块。
  • 容器网络配置:通常使用 ports 映射 51820/udp 即可。当遇到复杂的路由规则时,可考虑 network_mode: host,但这样做会降低容器隔离性。
  • 防火墙规则:务必在宿主机防火墙(如 firewalld)中放行 UDP 51820 端口(firewall-cmd --add-port=51820/udp --permanent),并确保云服务商的安全组策略也允许该端口的入站流量。
  • 安全管理:建议将配置文件目录的权限设置为 700 来保护私钥。同时应严格管理 Web 面板的访问,生产环境建议配置 HTTPS 反向代理。

📌 常见问题排查

  1. 客户端握手失败 (No Handshake)
    故障排查可参考以下思路:
    • 防火墙拦截:首先确认服务器防火墙(firewalld 或云安全组)的 UDP 51820 端口已正确放行。
    • 内核转发未开启:确认宿主机 net.ipv4.ip_forward 已设为 1(见准备步骤)。
    • Endpoint 地址错误:客户端配置文件(.conf)中的 Endpoint = 你的服务器公网IP:51820 必须填写正确。
  2. 客户端能连接但无法访问任何网络
    这通常是流量路由配置错误。
    • 检查服务器 NAT:服务器端的 wg0.conf 需包含 NAT 规则(MASQUERADE),linuxserver/wireguard 镜像在多数情况下会自动处理。
    • 确认客户端 AllowedIPs:检查客户端的 AllowedIPs 设置,若只访问内网则设为 10.13.13.0/24;若需所有流量走 VPN,则设为 0.0.0.0/0
欢迎来到XiaoZou123,这里是一个电脑极客、数码爱好者网站。我平时喜欢关注数码新闻,研究计算机技术。如果你看我头像觉得我是二次元,那我其实还算不上!
最后更新于 2026-09-13