背景

  • WireGuard:是一个现代化的基于Linux内核态运行的高效、优雅的跨平台VPN实现方案;底层协议采用UDP进行数据传输
  • wg-easy:是一个使用Vue+wireguard开发的快速启动、管理、监控wg服务的docker镜像
  • 需求:
    • 异地组网:n台互相在异地的机器相互组成一个局域网并各自拥有自己在该虚拟内网中的独立ip地址,实现无障碍安全互访
    • 无公网ip:这里不做标题党,具体的网络拓扑是:
      • 1台具备公网ip的服务器
      • n-1台不具备公网ip并且藏在无数层NAT之后的机器

解决方案

总体思路

  • 使用具备公网ip的服务器作为wg服务端,所有在vpn内的机器直接通过该设备进行流量转发
  • wg-easy启动在公网ip服务器,并统一通过面板为客户机下发配置文件
  • 其他设备直接本机安装wg作为客户端

启动服务端(具备公网ip的机器)

这里采用docker-compose的方式进行启动,由于wg-easy具备一个漂亮的管理面板,故使用traefik对其进行管理

  • 建立启动配置文件
version: "3.8"
services:
  wg-easy:
    environment:
      # ⚠️ Required:
      # Change this to your host's public address
      - WG_HOST=<ur host domain>
      # - WG_DEFAULT_DNS=192.168.2.1
      - WG_ALLOWED_IPS=<set default ACL in the clients>

      # Optional:
      - PASSWORD=<web ui's password>
      # - WG_PORT=51820
      - WG_DEFAULT_ADDRESS=10.8.0.x
      # - WG_MTU=1420

    image: weejewel/wg-easy
    container_name: wg_easy
    volumes:
      - <path_to_host>:/etc/wireguard
    # ports:
      # - "51820:51820/udp" # control port(main)
      # - "51821:51821/tcp" # web ui port
    network_mode: "host" # ⚠️Required
    restart: unless-stopped
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    labels:
      - traefik.enable=true
      - traefik.http.routers.wg_easy.rule=Host(`<url rule for traefik>`)
      - traefik.http.routers.wg_easy.middlewares=redirect
      - traefik.http.routers.wg_easy.tls=true
      - traefik.http.routers.wg_easy.tls.certresolver=sample
      - traefik.http.middlewares.redirect.redirectscheme.scheme=https
      - traefik.http.middlewares.redirect.redirectscheme.permanent=true
      - traefik.http.services.wg_easy.loadbalancer.server.port=51821
  • 启动wg-easy:docker-compose up -d

  • 查看log可以使用:docker-compose logs -f wg_easy

  • Note:由于wg运行在linux内核态,故其强依赖于5.x.x的linux内核。强烈建议首先检查uname -r是否为5.x.x,否则需要进行一个内核升级

  • 启动成功后访问host:5000,输入密码进入wg服务端后台管理

建立子网客户机,下发客户端配置文件

  • 进入后台后点击+NEW添加新客户机
  • 输入完成后点击下载,获取客户机的配置文件,留待备用

客户端安装wireguard(不具备公网ip的机器)

  • wg支持全平台,可以在官网找到全平台的安装方式

同样的,该处如果为linux,则强依赖与目标机内核版本

  • windows直接添加配置文件之后启动即可,回到服务端后台可以看到两台设备已经建立连接并具备各自的独立ip,服务机ip默认为x.x.x.1
  • 对于linux
    • 需要将刚刚下载的配置文件放置在/etc/wireguard下,重命名为你想要使用的虚拟网卡名
    • wg(linux)给出两种优雅的启动方式:
      • systemd(推荐,可以配置开机自启):systemctl start wg-quick@配置文件名
      • wg-quick:wg-quick up 配置文件名
  • 回到服务端后台,可以看到两台设备已经建立连接并具备各自的独立ip,服务机ip默认为x.x.x.1

踩坑指南

  • 目前发现的一个问题,如果在服务机上开启了ufw,即便是放通了wg的主配置端口也会存在子网设备无法互访的问题,暂未排查出问题,解决方案即是关闭ufw;初步推断是wg在进行内网打洞/转发的时候使用了不同的端口(此时服务端相当于一个网关设备),但是被ufw全数阻挡了
  • 有调研发现大陆境内的udp被运营商限速
  • 当服务机是墙外机器(即流量需要过墙)时,有几率会被识别,因为不同于frp等内网穿透工具,wg具有明显且易用的xx上网特征