上週發了篇 OpenVPN 相關文章,留言區一波大推 WireGuard 與 Tailscale。依過去 K6Giteauv 的經驗,應當又是一件平生不識 XXX,便稱英雄也枉然的好物,必須一會。

WireGuard 是一套可取代 OpenVPN 的新時代 VPN 協定,標榜程式碼單純(只有 4000 行,OpenVPN 超過 10 萬行),被攻擊面小且易容易安全審核,內建於 Linux 核心更是一大優勢。WireGuard 使用固定的現代加密演算法(ChaCha20, Poly1305, Curve25519),少了 OpenVPN 雙方可協商加密方式的彈性,但也避免協商出過弱加密方法的風險。而拿掉協商程序的一大優點是建立連線速度超快,OpenVPN 建立連線通常要 3-8 秒,WireGuard 不到一秒完成。同時,WireGuard 使用 UDP,不像 OpenVPN 會因為電信基地台切換或網路瞬斷需要重新連線。但 UDP 的缺點是在嚴格控管網路環境易被封鎖(如企業內網),但若為手機 4G/5G 情境則沒什麼問題。

Tailscale 是基於 WireGuard 協定所發展的便捷解決方案,省去加密公私鑰管理、WireGuard 連線 IP/Port 設定等繁瑣步驟,把你不懂也不想懂的技術細節全部藏起來,做到像使用現成 App 一樣簡單。免費用戶可設三個使用者 100 個裝置,已足以應付一般應用。如果你讀到這裡感到心動,代表 Tailscale 很適合你,快去下載 App 開始享受無腦連 VPN 的便利,本文也到此結束,我們下回再見。

好的,堅持到到這裡的各位,代表大家都不介意學東西,屬於沒事找事願意自己動手架 WireGuard 來玩的同好,以下是我的心得分享。

首先,許多新型無線路由器已內建 WireGuard 伺服器,請先檢查看看你家的路由器有沒有,如果有,恭喜您! 本文到此結束,我們下回再見。

OK,現在還留著的都是要自己動手架 WireGuard 的同學。第一步是決定安裝在哪裡,如果你是要 VPN 連回家,路由器或 NAS 如果可以跑 Docker 是最方便的選擇,否則就是要找台機器跑 Docker 並在路由器設 Port Forwarding,把 WireGuard UDP Port (預設 51820,但也可自訂) 導向該主機;另一種情境是將 WireGuard 架在雲端,租用 VPS、VM 主機或 Docker 主機,裝好 WireGuard 容器,形成類似衝浪鯊魚之類的 VPN 概念,透過不同地區的中繼點上網,模擬地理位置或隱藏來源 IP。

關於 WireGuard 容器,整合 Web 管理介面的 wg-easy 應是首選。我的做法是準備如下的 docker-compose.yml:

services:
  wg-easy:
    environment:
      - WG_HOST=<對外IP> # 主機對外 IP,若中間有路由器,請填路由器 WAN IP
      - WG_PORT=51820    # 亦可使用自訂 Port
      # 管理者密碼,使用 bcrypt 雜湊
      - PASSWORD_HASH=$$2a$$12$$0qjyl6al....pTOn6SypIEPUW
      # 必要時可自訂 DNS
      # - WG_DEFAULT_DNS=8.8.8.8,1.1.1.1
    image: ghcr.io/wg-easy/wg-easy
    container_name: wg-easy
    volumes:
      - ./:/etc/wireguard
    ports:
      - "51820:51820/udp"
      - "51821:51821/tcp"
    cap_add:
      # 允許容器修改網路介面狀態、路由表及防火牆規則(iptables)
      - NET_ADMIN
      # 允許容器在主機核心中載入 WireGuard 核心模組
      - SYS_MODULE
    sysctls:
      # 配合 WireGuard 的路由策略,確保封包在經過 NAT 時能正確被標記與處理,避免形成 Loop
      - net.ipv4.conf.all.src_valid_mark=1
      # 允許伺服器將接收到的 VPN 流量轉發至網際網路或其他內網區域
      - net.ipv4.ip_forward=1

wg-easy 14 版之後,不再接受明碼密碼,需使用 bcrypt 雜湊,簡單做法是借用 wg-easy/wg-easy Docker 容器跑指令 docker run ghcr.io/wg-easy/wg-easy:14 wgpw MY_PASSWORD 參考 可得到如下結果:PASSWORD_HASH='$2a$12$0qjyl6al2e2dzTs...x8pTOn6SypIEPUW',將雜湊值寫入 docker-compose.yaml 時,$ 被視為變數符號,記得要改成 $$。

設好後,docker compose up -d 執行容器,瀏覽器連上 51821 Port 可進入管理介面:

新增一組連線帳號:

手機要連 WireGuard 的話,裝好 WireGuard App,掃瞄上圖 [1] 的 QRCode 即可匯入設定並連線:

另一種做法是按圖中的 [2] 下載 .conf 檔:

WireGuard App 除了掃 QRCode,也可匯入 .conf 檔。PC 端則可安裝 WireGuard Client 再匯入 .conf,非常簡單:

如果你有進階應用需求,例如:只有特定網段才改走 VPN,其餘用原本的上網的路由,則需修改 .conf:

  • AllowedIPs 預設為 0.0.0.0/0, ::/0 代表所有傳輸全部改走 VPN,若想改成連家中內網目標再走 VPN,可改成 192.168.1.0/24
  • 若裝置位於防火牆或 NAT 後方,會因久無活動被切斷,可設 PersistentKeepalive 25 秒

簡單試用,WireGuard 建立連線的速度大勝 OpenVPN,而其 UDP 連線模式不太會因 4G 訊號不穩中斷重連,感覺很不錯。但我目前在外面用 VPN 連回家時,OpenVPN 為無線路由器內建可直達目標主機,WireGuard 是架在迷你主機 Linux 的 Docker,連線路徑變成路由器 -> 迷你主機 -> 目標主機,中間多了一站,傳輸速率因此略,實測差異有大到遠端操作有感。這段損耗屬非戰之罪,非 WireGuard 的鍋,想克服得升級內建支援 WireGuard 路由器。整體評估,WireGuard 的使用體驗很不錯,確實是好物。


Comments

Be the first to post a comment

Post a comment