在 Alpine 內安裝 WireGuard VPN (Docker)
- 安裝環境
- VM : 1vCore / 1G RAM / 16G SSD
- OS : Alpine 3.18 - alpine-standard-3.18.4-x86_64.iso
採用 weejewel/wg-easy 版本(包含 WebUI)
- 採用 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
修改 Listen Port
- Exp. 將原本 Listen Port udp/51820 改成 udp/123 (預設 ntp port)
vi docker-compose.yml
修改以下 ports 設定
: - WG_PORT=51820 : ports: - "123:51820/udp" :
FAQ
- 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. :
- Ans : 需要在 host (Alpine 3.19) 執行以下指令
modprobe ip_tables echo 'ip_tables' >> /etc/modules
並重新開機即可解決
採用 linuxserver/wireguard 版本(無 WebUI)
- 採用 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
修改 Listen Port
- 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 :
建立指定 Client 的憑證
- 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
- 連線檔案方式
wgvpn:~# cat ./data/config/peer_lin2/peer_lin2.conf
- QRCode 的方式
wgvpn:~# docker exec -it wireguard /app/show-peer lin2
刪除特定 Client 的憑證
- 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 , 就會產生新的憑證
顯示目前 Client 憑證與連線狀態
- 主要是使用 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 命令的維運方式要注意:
- 新增刪除 Client 修改 docker-compose.yml 都需要重啟 docker compose 才能生效
- 重啟過程的這幾秒鐘 WireGuard 會斷線無法提供服務
後續須持續了解項目
- WireGuard Web UI 方案 - https://github.com/ngoduykhanh/wireguard-ui/ (初步使用 docker-compose 範例修改, 還無法正常運作)
- Client 端設為 split routing 模式