====== 在 Alpine 內安裝 WireGuard VPN (Docker) ======
* 安裝環境
* VM : 1vCore / 1G RAM / 16G SSD
* OS : Alpine 3.18 - alpine-standard-3.18.4-x86_64.iso
* 先參考 [[tech/alpine_docker]]
===== 採用 weejewel/wg-easy 版本(包含 WebUI) =====
* 採用 [[https://hub.docker.com/r/weejewel/wg-easy|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
並重新開機即可解決
* 參考 - https://github.com/wg-easy/wg-easy/discussions/976
===== 採用 linuxserver/wireguard 版本(無 WebUI) =====
* 採用 [[https://hub.docker.com/r/linuxserver/wireguard|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/ (初步使用 [[https://github.com/ngoduykhanh/wireguard-ui/tree/master/examples/docker-compose|docker-compose]] 範例修改, 還無法正常運作)
* Client 端設為 [[https://www.utunnel.io/help/what-is-split-routing|split routing]] 模式
===== 參考網址 =====
* https://github.com/linuxserver/docker-wireguard
* https://github.com/wg-easy/wg-easy
{{tag>docker alpine vpn}}