GCP 上自建 VPN 服務

GCP 上透過 docker 建立 ipsec-vpn-server 達成 VPN 服務

前陣子因為一些需求要使用 VPN,後來順利在 GCP 上分別建立了台灣與日本的 VPN 服務,決定把它記錄下來

使用需求說明

以下為我建立時為自己所設定的 Story

  1. 終端設備(手機、電腦)可以透過這個 VPN 連線,使用特定地區 IP
  2. 不使用任何外掛的 VPN client 軟體,例如就不用 wildvpn

VPN 架構設計

最開始我是想要把 vpn 架設在我自己家裡的 server,但後來發現如果要設置 vpn server 的話,必須要有實體 IP,由於我的 home server 沒有申請電信固定 IP,所以我決定把 vpn server 架在 Cloud server 上。

最早是想要用 Linode,但由於 Linode 沒有台灣區服務,最後還是決定挑了最便宜的 GCP 來使用,而研究了後決定使用 IPsec VPN server 這個 Solution,並透過 IPsec/L2TP 連線,其實詳細的網路資訊我也不是很熟XD 但評估之後透過這個應該是最方便透過 docker 實作。

因此我要做的事情就簡單多了:

  1. 在 GCP Computing 建立一台 Server(Ubuntu 24.04)
  2. 給予固定 IP
  3. 建立 Docker 環境
  4. 建立 ipsec-vpn-server 服務
  5. 設定 GCP 防火牆 policy
  6. 測試連線

實作步驟

步驟一:在 GCP Computing 建立一台 Server(Ubuntu 24.04)

這有點太簡單我就直接略過執行過程,大概重點在於 要挑選你要建立 VPN 區域的機器建立,這應該滿好理解的,才能夠讓之後連線跳到的 Server 是使用該區域的虛擬機。

另外規格上不太要求,只是個人使用的話可以用最小的規格即可,硬碟大概 10GB 就夠了(忘了最小可以設定多少),全開的話每個月大概也才5元。

步驟二:給予固定 IP

建立起來之後,可以參考我在 自建網站教學,從 0 開始建立 Wordpress 網站 中的第三步驟,把剛剛建起來的機器 IP 固定下來。

步驟三:建立 Docker 環境

透過 GCP console 連線進去該機器,按照 新手自建 Docker 伺服器 - (1) Ubuntu 主機建立 docker 服務 中的步驟進行即可,做完之後不要關掉,繼續操作

步驟四:建立 ipsec-vpn-server 服務

為了環境乾淨,我全部都使用 docker compose 的方式來進行安裝,這邊就直接給大家 docker-compose.yml 內容

services:
  ipsec-vpn-server:
    image: hwdsl2/ipsec-vpn-server
    container_name: ipsec-vpn-server
    restart: always
    ports:
      - "500:500/udp"
      - "4500:4500/udp"
    environment:
      - VPN_IPSEC_PSK=swingyoyo
      - VPN_USER=yoyo
      - VPN_PASSWORD=thanksyouyoyo
    volumes:
      - ikev2-vpn-data:/etc/ipsec.d
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    privileged: true
volumes:
  ikev2-vpn-data:

就大概記得要自己改 environment 的參數,我這裡就放一組範例等等連線也可以使用

步驟五:設定 GCP 防火牆 policy

這個是我一開始建立起來忽略的,如同上面 docker compose 說明,機器要開放 UDP 500 以及 4500 端口進行連線,我這邊不放圖給流程,而我主要有設置的參數是:

  1. 允許 IP 來源 0.0.0.0/0 # 代表任何來源都可以進行連線
  2. 開放端口 UDP 500,4500 # 這兩個端口是 ipsec-vpn-server 需要的
  3. 要確定這個設定有在你的 Server 生效

步驟六:測試連線

完成了之後,可以先在你的終端設備測試,我自己的話是使用 MAC ,連線包含以下資料

  1. IP: 你 GCP 機器的固定 IP
  2. Account: yoyo # 從你的 Docker compose 來
  3. Password: thanksyouyoyo # 一樣跟 Docker compose 一樣
  4. Shared Secret: swingyoyo # 同上

連線之後可以透過類似的 ip 檢查網站,來確認目前的流量有沒有走 VPN,以及 VPN 的區域是否正確,就順利完成摟

comments powered by Disqus