在 Alpine 內安裝 WireGuard VPN (Docker)

  • 採用 weejewel/wg-easy 的 docker image
  • 執行以下語法

    vi docker-compose.yml

    修改以下有標註 #optional 的參數

    version: "3.8"
    services:
      wg-easy:
        environment:
          # Required:
          # Change this to your host's public address
          - WG_HOST=wgvpn.ichiayi.com
    
          # Optional:
          - PASSWORD=myPassword
          - WG_PORT=51820
          - WG_DEFAULT_ADDRESS=10.13.12.x
          - WG_DEFAULT_DNS=192.168.11.6
          # - WG_MTU=1420
          # - WG_ALLOWED_IPS=192.168.15.0/24, 10.0.1.0/24
          # - WG_PRE_UP=echo "Pre Up" > /etc/wireguard/pre-up.txt
          # - WG_POST_UP=echo "Post Up" > /etc/wireguard/post-up.txt
          # - WG_PRE_DOWN=echo "Pre Down" > /etc/wireguard/pre-down.txt
          # - WG_POST_DOWN=echo "Post Down" > /etc/wireguard/post-down.txt
    
        image: weejewel/wg-easy
        container_name: wg-easy
        volumes:
          - ./etc_wireguard:/etc/wireguard
        ports:
          - "51820:51820/udp"
          - "51821:51821/tcp"
        restart: unless-stopped
        cap_add:
          - NET_ADMIN
          - SYS_MODULE
        sysctls:
          - net.ipv4.ip_forward=1
          - net.ipv4.conf.all.src_valid_mark=1
  • 啟動服務

    docker compose up -d

  • 可以使用瀏覽器 http://server-ip:51821 輸入設定密碼(myPassword)登入管理介面進行 vpn 使用者管理
  • 詳細設定參數請參考 - https://github.com/wg-easy/wg-easy#options
  • Exp. 將原本 Listen Port udp/51820 改成 udp/123 (預設 ntp port)

    vi docker-compose.yml

    修改以下 ports 設定

    :
          - WG_PORT=51820
    :
        ports:
          - "123:51820/udp"
    :
  1. host Alpine 升級到 3.19 之後啟動時 log 出現

    :
    iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT;
    modprobe: can't change directory to '/lib/modules': No such file or directory
    modprobe: can't change directory to '/lib/modules': No such file or directory
    iptables v1.8.3 (legacy): can't initialize iptables table `nat': Table does not exist (do you need to insmod?)
    Perhaps iptables or your kernel needs to be upgraded.
    :

  • 採用 linuxserver/wireguard 的 docker image
  • 執行以下語法

    vi docker-compose.yml

    修改以下有標註 #optional 的參數

    version: "2.1"
    services:
      wireguard:
        image: lscr.io/linuxserver/wireguard:latest
        container_name: wireguard
        cap_add:
          - NET_ADMIN
          - SYS_MODULE #optional
        environment:
          - PUID=1000
          - PGID=1000
          - TZ=Asia/Taipei
          - SERVERURL=auto #optional
          - SERVERPORT=51820 #optional
          - PEERS=1 #optional
          - PEERDNS=auto #optional
          - INTERNAL_SUBNET=10.13.13.0 #optional
          - ALLOWEDIPS=0.0.0.0/0 #optional
          - PERSISTENTKEEPALIVE_PEERS= #optional
          - LOG_CONFS=true #optional
        volumes:
          - ./data/config:/config
          - /lib/modules:/lib/modules #optional
        ports:
          - 51820:51820/udp
        sysctls:
          - net.ipv4.conf.all.src_valid_mark=1
        restart: always
  • 啟動服務

    docker compose up -d

  • Exp. 將原本 Listen Port udp/51820 改成 udp/123 (預設 ntp port)

    vi docker-compose.yml

    修改以下 ports 設定

    :
        ports:
          - 123:51820/udp
    :
  • 另外對於產生 peer 設定檔範本也需要修改

    vi data/config/templates/peer.conf

    將 Endpoint 的 port 改成 123

    :
    [Peer]
    :
    Endpoint = ${SERVERURL}:123
    :
  • Exp. 將原本 environment 的 PEERS=1 改成要建立 Client 的 id 清單, Exp. jonathan,lin,lin2,stanley,jerry

    vi docker-compose.yml

    修改如下設定

    :
        environment:
        :
          - PEERS=jonathan,lin,lin2,stanley,jerry
    :
  • 重新啟動 docker compose 就會在 ./data/config/ 內建立出 peer_jonathan, peer_lin, peer_lin2, peer_stanley, peer_jerry 目錄

    wgvpn:~# docker compose up -d --force-recreate
    [+] Running 1/1
     ✔ Container wireguard  Started                                                                                                                                                         5.3s
    wgvpn:~# ls ./data/config/
    coredns         peer_jerry      peer_jonathan   peer_jonathan2  peer_lin        peer_lin2       peer_lintsai    peer_stanley    server          templates       wg_confs

  • 提供給 Client key 的兩個方式 Exp. lin2
    1. 連線檔案方式

      wgvpn:~# cat ./data/config/peer_lin2/peer_lin2.conf

    2. QRCode 的方式

      wgvpn:~# docker exec -it wireguard /app/show-peer lin2

  • Exp. 將原本 environment 的 PEERS= 將特定 Client 的 id 刪除, Exp. 刪除 lin2 : PEERS=jonathan,lin,lin2,stanley,jerry → PEERS=jonathan,lin,stanley,jerry

    vi docker-compose.yml

    修改如下設定

    :
        environment:
        :
          - PEERS=jonathan,lin,stanley,jerry
    :
  • 重新啟動 docker compose 之後, lin2 就無法使用
  • 如果誤刪除直接加回 lin2 重啟 docker compose 之後, lin2 就可以恢復使用, 主要是因為 ./data/config/ 內的 peer_lin2 並沒有被移除
  • 如果確定要將 lin2 憑證移除, 就要將 data/config 內的 peer_lin2 目錄刪除

    rm -rf ./data/config/peer_lin2

    這樣之後若有重建 lin2 這相同 Client id , 就會產生新的憑證

  • 主要是使用 wg 這命令來查詢 Exp.

    wgvpn:~# docker exec -it wireguard wg
    interface: wg0
      public key: h6hkpJqDrUhS5Zw4tLGnzd/Mt58PyzDfEO9G5s3d/gE=
      private key: (hidden)
      listening port: 51820
    
    peer: 2e2goKlqaJ05iCLA5MR3WyD/OgPJUIbw/6oggcn4Q3U=
      preshared key: (hidden)
      endpoint: 39.9.230.151:45592
      allowed ips: 10.13.13.7/32
      latest handshake: 4 minutes, 41 seconds ago
      transfer: 1.68 MiB received, 8.01 MiB sent
    
    peer: H1n/9a0yXzM66YtYvjP+k3SAcncArjurXAE2MjDU4jo=
      preshared key: (hidden)
      allowed ips: 10.13.13.3/32
    
    peer: Y+/LcaNKnqEJplR4qOiSI9pUtpWAm0C6jgwhRoOlrQE=
      preshared key: (hidden)
      allowed ips: 10.13.13.2/32
    
    peer: SNh3eIl8s76oIicaTDnW0C8McuRqL+jS8kxAo0NgYRs=
      preshared key: (hidden)
      allowed ips: 10.13.13.5/32
    
    peer: rOiBsv7yGMm5UtC+zLLj0a2fyWYTssaYMygSgKFmTzQ=
      preshared key: (hidden)
      allowed ips: 10.13.13.4/32
    
    peer: GLr/5jTUv9ZYmIRRIIFp5gZpZGP1UdSPASagUCuv2lg=
      preshared key: (hidden)
      allowed ips: 10.13.13.6/32

  • 目前由修改 docker-compose.yml 用重啟 docker compose 命令的維運方式要注意:
    1. 新增刪除 Client 修改 docker-compose.yml 都需要重啟 docker compose 才能生效
    2. 重啟過程的這幾秒鐘 WireGuard 會斷線無法提供服務
  • tech/wireguard.txt
  • 上一次變更: 2024/04/12 20:53
  • jonathan