找回密碼
 立即註冊
    查看: 16|回覆: 0

    用 Docker 架 WireGuard(二)純設定檔版:看懂每一行 wg0.conf

    [複製鏈接]

    !lvup!   100%

    384

    主題

    27

    回帖

    2200萬

    積分

    管理員

    積分
    22005859
    發表於 前天 01:22 | 顯示全部樓層 |閱讀模式
    這篇用 linuxserver/wireguard:沒有網頁介面,一切都是設定檔,容器第一次啟動就把伺服器與每個使用者的設定檔和 QR code 全部產好。

    適合三種人:想真正看懂 WireGuard 設定長什麼樣的、機器資源很少的、以及不想多跑一個網頁服務對外的。

    跟上一篇(wg-easy)的分工:那篇點網頁就能加人,這篇要改設定檔重啟容器。兩篇各自完整,這篇不需要你看過那篇。

    跟上一篇(wg-easy)的分工

    第一步:先搞懂 WireGuard 的金鑰模型(三分鐘,省掉之後三小時)

    WireGuard 沒有帳號密碼,只有金鑰對。


    • 每一端(伺服器、每一台手機、每一台電腦)都有自己的一組私鑰 + 公鑰
    • 私鑰絕對不外流,只存在自己的設定檔裡
    • 公鑰要給對方。伺服器的設定檔裡列著每個使用者的公鑰;使用者的設定檔裡寫著伺服器的公鑰
    • 雙方各自用「自己的私鑰 + 對方的公鑰」算出同一把加密金鑰


    所以「新增一個使用者」這件事的本質是:產一組新金鑰對 → 把公鑰寫進伺服器的設定檔 → 把私鑰寫進那個人的設定檔。

    好消息:這個容器會全部幫你做。 但知道它在做什麼,出問題時才查得動。

    手動產金鑰的指令長這樣(這篇用不到,但看一眼有概念):
    1. wg genkey | tee privatekey | wg pubkey > publickey
    複製代碼

    你會看到兩個檔案,各裝著一串 44 個字元、結尾是 `=` 的 base64 字串。

    第二步:確認主機環境

    2-1 Docker
    1. docker --version
    2. docker compose version
    複製代碼

    你會看到兩行版本號。`command not found` 的話先裝 Docker(Debian / Ubuntu:`curl -fsSL https://get.docker.com | sudo sh`)。

    2-2 核心支援
    1. sudo modprobe wireguard && echo OK
    複製代碼

    你會看到一行 `OK`。Linux 5.6 之後內建,現在的主流發行版都有。

    2-3 主機的內網 IP
    1. ip -4 addr show | grep inet
    複製代碼

    找 192.168 或 10. 開頭的那個,下面都用 `192.168.1.20` 代稱。

    ⚠ 一定要在路由器把這台設成 DHCP 保留(固定 IP)。不然重開機換了 IP,埠轉發就失效,而且是靜默失效。

    第三步:確認你家有沒有「連得進來的位址」

    這一步決定整件事做不做得成,先做完再往下。

    3-1 查對外 IP

    在主機上:
    1. curl -4 ifconfig.me; echo
    複製代碼

    你會看到一個像 `114.32.80.149` 的位址。

    3-2 跟路由器的 WAN IP 比對

    登入路由器管理頁,找「WAN IP」或「廣域網路 IP」。

    兩個一樣 → 有真實對外 IP,往下走。

    路由器的 WAN IP 落在下面任一段:
    1. 10.0.0.0    ~ 10.255.255.255
    2. 172.16.0.0  ~ 172.31.255.255
    3. 192.168.0.0 ~ 192.168.255.255
    4. 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 帳號才會生效:
    1. 原本:  8123xxxx@hinet.net       (動態 IP)
    2. 改成:  8123xxxx@ip.hinet.net    (固定 IP,多了 ip.)
    複製代碼

    這個帳號要改在路由器上,接在後面的所有裝置就都走固定 IP。在電腦上直接撥號的話只有那台電腦有,而且少了路由器的防火牆。

    方案限制:適用非固定制非對稱頻寬 5M/384K 以上,但 500M/250M 與 1G/600M 不適用。第四台業者(即使宣稱使用中華的線路)也不適用。

    3-4 IP 是真的但會變 → 設 DDNS


    • 路由器管理頁找 DDNS / 動態 DNS
    • 華碩路由器有免費的 asuscomm.com;通用的有 No-IP、DuckDNS
    • 取名、套用


    驗證:
    1. nslookup myhome.asuscomm.com
    複製代碼

    回傳的 Address 要等於 3-1 查到的對外 IP。

    第四步:寫 docker-compose.yml
    1. mkdir -p ~/wireguard && cd ~/wireguard
    複製代碼

    建檔 `docker-compose.yml`,整份內容:
    1. services:
    2.   wireguard:
    3.     image: lscr.io/linuxserver/wireguard:latest
    4.     container_name: wireguard
    5.     cap_add:
    6.       - NET_ADMIN
    7.       - SYS_MODULE
    8.     environment:
    9.       - PUID=1000
    10.       - PGID=1000
    11.       - TZ=Asia/Taipei
    12.       - SERVERURL=myhome.asuscomm.com
    13.       - SERVERPORT=51820
    14.       - PEERS=iphone,ipad,laptop
    15.       - PEERDNS=auto
    16.       - INTERNAL_SUBNET=10.13.13.0
    17.       - ALLOWEDIPS=0.0.0.0/0
    18.       - PERSISTENTKEEPALIVE_PEERS=all
    19.       - LOG_CONFS=true
    20.     volumes:
    21.       - ./config:/config
    22.       - /lib/modules:/lib/modules
    23.     ports:
    24.       - 51820:51820/udp
    25.     sysctls:
    26.       - net.ipv4.conf.all.src_valid_mark=1
    27.     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` 是全篇最需要想清楚的一個

    它填在使用者的設定檔裡,意思是「哪些目的地位址要走進這條隧道」。
    1. ALLOWEDIPS=0.0.0.0/0
    2.   → 全流量。連上之後你的「所有」網路活動都經過家裡,
    3.     包含看 YouTube。在外面查 IP 會顯示你家的對外 IP。
    4.     優點:公共 Wi-Fi 下全程加密;缺點:速度受限於你家的上傳頻寬
    5. ALLOWEDIPS=192.168.1.0/24
    6.   → 分流。只有「連回家」的流量走 VPN,其他照常直連。
    7.     優點:上網速度不受影響、省手機電量;
    8.     缺點:公共 Wi-Fi 下其他流量沒有保護
    9. ALLOWEDIPS=192.168.1.0/24,10.13.13.0/24
    10.   → 分流,另外加上 VPN 內部網段,
    11.     讓不同使用者之間也能互相連(例如筆電連手機)
    複製代碼

    `192.168.1.0/24` 那個要換成你家真實的網段。 家裡是 192.168.0.x 就填 `192.168.0.0/24`。

    填錯的症狀:VPN 顯示已連線、握手正常,但連不到家裡的任何東西,而且沒有錯誤訊息。

    `SYS_MODULE` 與 `/lib/modules` 兩項在官方文件標示為 optional:主機核心已經內建 WireGuard 的話可以拿掉。留著比較保險,拿掉能少給一點權限。

    以下還有約 60% 的內容
    登入後即可閱讀完整教學

    登入繼續閱讀使用 Google 登入
    您需要登入後纔可以回帖 登入 | 立即註冊

    本版積分規則

    延伸閱讀

    加入惟家 LINE 群 QR Code加入惟家 LINE 群

    Archiver|手機版|惟家的智能論壇

    GMT+8, 2026-9-27 02:17 , Processed in 0.142171 second(s), 25 queries .

    快速回覆 返回頂部 返回列表