|
|
這篇用 linuxserver/wireguard:沒有網頁介面,一切都是設定檔,容器第一次啟動就把伺服器與每個使用者的設定檔和 QR code 全部產好。
適合三種人:想真正看懂 WireGuard 設定長什麼樣的、機器資源很少的、以及不想多跑一個網頁服務對外的。
跟上一篇(wg-easy)的分工:那篇點網頁就能加人,這篇要改設定檔重啟容器。兩篇各自完整,這篇不需要你看過那篇。

第一步:先搞懂 WireGuard 的金鑰模型(三分鐘,省掉之後三小時)
WireGuard 沒有帳號密碼,只有金鑰對。
- 每一端(伺服器、每一台手機、每一台電腦)都有自己的一組私鑰 + 公鑰
- 私鑰絕對不外流,只存在自己的設定檔裡
- 公鑰要給對方。伺服器的設定檔裡列著每個使用者的公鑰;使用者的設定檔裡寫著伺服器的公鑰
- 雙方各自用「自己的私鑰 + 對方的公鑰」算出同一把加密金鑰
所以「新增一個使用者」這件事的本質是:產一組新金鑰對 → 把公鑰寫進伺服器的設定檔 → 把私鑰寫進那個人的設定檔。
好消息:這個容器會全部幫你做。 但知道它在做什麼,出問題時才查得動。
手動產金鑰的指令長這樣(這篇用不到,但看一眼有概念):
- wg genkey | tee privatekey | wg pubkey > publickey
複製代碼
你會看到兩個檔案,各裝著一串 44 個字元、結尾是 `=` 的 base64 字串。
第二步:確認主機環境
2-1 Docker
- docker --version
- docker compose version
複製代碼
你會看到兩行版本號。`command not found` 的話先裝 Docker(Debian / Ubuntu:`curl -fsSL https://get.docker.com | sudo sh`)。
2-2 核心支援
- sudo modprobe wireguard && echo OK
複製代碼
你會看到一行 `OK`。Linux 5.6 之後內建,現在的主流發行版都有。
2-3 主機的內網 IP
- ip -4 addr show | grep inet
複製代碼
找 192.168 或 10. 開頭的那個,下面都用 `192.168.1.20` 代稱。
⚠ 一定要在路由器把這台設成 DHCP 保留(固定 IP)。不然重開機換了 IP,埠轉發就失效,而且是靜默失效。
第三步:確認你家有沒有「連得進來的位址」
這一步決定整件事做不做得成,先做完再往下。
3-1 查對外 IP
在主機上:
- curl -4 ifconfig.me; echo
複製代碼
你會看到一個像 `114.32.80.149` 的位址。
3-2 跟路由器的 WAN IP 比對
登入路由器管理頁,找「WAN IP」或「廣域網路 IP」。
兩個一樣 → 有真實對外 IP,往下走。
路由器的 WAN IP 落在下面任一段:
- 10.0.0.0 ~ 10.255.255.255
- 172.16.0.0 ~ 172.31.255.255
- 192.168.0.0 ~ 192.168.255.255
- 100.64.0.0 ~ 100.127.255.255 ← 電信業者 CGNAT 專用
複製代碼
→ 你在 CGNAT 或雙重 NAT 後面,埠轉發不會有任何作用。
⚠ 這裡有一個要講清楚的觀念:很多人以為「IP 會變」是問題,所以去設 DDNS。但 CGNAT 的問題不是 IP 會變,是你根本沒有一個外界可路由的位址 —— 那個對外 IP 是電信業者幾百個用戶共用的。DDNS 救不了這個。
3-3 中華電信 HiNet 使用者的免費解法
HiNet 家用寬頻預設給 8 個浮動 IP,可以免費改成「1 個固定 IP + 7 個動態 IP」:
- 登入 HiNet 客服後台 → 服務總覽 → 寬頻 → HiNet 非固定制固定IP申請
- 把預設的「8 個動態 IP」改選「1 個固定 IP + 7 個動態 IP」
- 一天只能改選一次
⚠ 申請完一定要改 PPPoE 帳號才會生效:
- 原本: 8123xxxx@hinet.net (動態 IP)
- 改成: 8123xxxx@ip.hinet.net (固定 IP,多了 ip.)
複製代碼
這個帳號要改在路由器上,接在後面的所有裝置就都走固定 IP。在電腦上直接撥號的話只有那台電腦有,而且少了路由器的防火牆。
方案限制:適用非固定制非對稱頻寬 5M/384K 以上,但 500M/250M 與 1G/600M 不適用。第四台業者(即使宣稱使用中華的線路)也不適用。
3-4 IP 是真的但會變 → 設 DDNS
- 路由器管理頁找 DDNS / 動態 DNS
- 華碩路由器有免費的 asuscomm.com;通用的有 No-IP、DuckDNS
- 取名、套用
驗證:
- nslookup myhome.asuscomm.com
複製代碼
回傳的 Address 要等於 3-1 查到的對外 IP。
第四步:寫 docker-compose.yml
- mkdir -p ~/wireguard && cd ~/wireguard
複製代碼
建檔 `docker-compose.yml`,整份內容:
- services:
- wireguard:
- image: lscr.io/linuxserver/wireguard:latest
- container_name: wireguard
- cap_add:
- - NET_ADMIN
- - SYS_MODULE
- environment:
- - PUID=1000
- - PGID=1000
- - TZ=Asia/Taipei
- - SERVERURL=myhome.asuscomm.com
- - SERVERPORT=51820
- - PEERS=iphone,ipad,laptop
- - PEERDNS=auto
- - INTERNAL_SUBNET=10.13.13.0
- - ALLOWEDIPS=0.0.0.0/0
- - PERSISTENTKEEPALIVE_PEERS=all
- - LOG_CONFS=true
- volumes:
- - ./config:/config
- - /lib/modules:/lib/modules
- ports:
- - 51820:51820/udp
- sysctls:
- - net.ipv4.conf.all.src_valid_mark=1
- restart: unless-stopped
複製代碼
每個環境變數在做什麼(這張表是這篇的核心)
- `PUID` / `PGID` —— 容器用哪個使用者身分寫檔。用 `id -u; id -g` 查你自己的,通常都是 1000。填錯的話 `./config` 底下的檔案你讀不到
- `TZ` —— 時區,影響日誌時間。台灣填 `Asia/Taipei`(預設是 `Etc/UTC`)
- `SERVERURL` —— 使用者要連的位址,會被寫進每個人的設定檔。有 DDNS 就填網域,沒有就填固定的對外 IP。填 `auto` 的話容器會自己去偵測。這是最常填錯的一個:填了內網 IP 的話,產出的設定檔只有在家裡才連得上
- `SERVERPORT` —— 對外的埠,要跟路由器轉發的一致。預設 51820
- `PEERS` —— 要產幾個使用者。直接寫名字(只能英數)比寫數字好認;寫 `3` 的話會產出 peer1 / peer2 / peer3。不設這個變數的話,容器會進入「用戶端模式」而不是伺服器模式
- `PEERDNS` —— 使用者連上之後用哪個 DNS。`auto` 會用容器內建的 DNS 轉發。想讓 VPN 用戶也吃到家裡的 Pi-hole / AdGuard,就填那台的內網 IP
- `INTERNAL_SUBNET` —— VPN 內部網段,預設 `10.13.13.0`。一定要跟你家的網段不一樣,不然路由會打架
- `ALLOWEDIPS` —— 決定使用者的哪些流量走 VPN,下面單獨講
- `PERSISTENTKEEPALIVE_PEERS` —— 設成 `all` 的話,每個使用者的設定檔裡都會有 `PersistentKeepalive = 25`,每 25 秒送一個小封包讓 NAT 不要斷。手機一定要有這個
- `LOG_CONFS` —— 把 QR code 直接印在容器日誌裡,預設 `true`
⚠ `ALLOWEDIPS` 是全篇最需要想清楚的一個
它填在使用者的設定檔裡,意思是「哪些目的地位址要走進這條隧道」。
- ALLOWEDIPS=0.0.0.0/0
- → 全流量。連上之後你的「所有」網路活動都經過家裡,
- 包含看 YouTube。在外面查 IP 會顯示你家的對外 IP。
- 優點:公共 Wi-Fi 下全程加密;缺點:速度受限於你家的上傳頻寬
- ALLOWEDIPS=192.168.1.0/24
- → 分流。只有「連回家」的流量走 VPN,其他照常直連。
- 優點:上網速度不受影響、省手機電量;
- 缺點:公共 Wi-Fi 下其他流量沒有保護
- ALLOWEDIPS=192.168.1.0/24,10.13.13.0/24
- → 分流,另外加上 VPN 內部網段,
- 讓不同使用者之間也能互相連(例如筆電連手機)
複製代碼
`192.168.1.0/24` 那個要換成你家真實的網段。 家裡是 192.168.0.x 就填 `192.168.0.0/24`。
填錯的症狀:VPN 顯示已連線、握手正常,但連不到家裡的任何東西,而且沒有錯誤訊息。
`SYS_MODULE` 與 `/lib/modules` 兩項在官方文件標示為 optional:主機核心已經內建 WireGuard 的話可以拿掉。留著比較保險,拿掉能少給一點權限。
|
|