在 RockPi 4B SE 上安裝 PiVPN

這篇主要在教如何在沒有申請固定 IP 的情況下,用 cloudflare 取得 DDNS 的服務,用以連線至由 Rock Pi 4B SE 架設的 wireguard Pi VPN server,實現在外也能連回家中上網的功能

Environment

  • Rock Pi 4B SE
    • Armbian 23.02.2 Bullseye with Linux 5.15.93-rockchip64
  • 自有的 domain name
    • 這邊會示範如果沒申請固定 ip,或固定 ip 已經給其他機器用的情形
    • 若沒有 domain name,可以用其他間 ddns 的服務
  • Python 3.5 with packages installed:
    • python3-venv

這篇的 secret 資訊都會用 ${} 的格式包起來,請再自行替換成你的資訊

利用 Cloudflare 取得 DDNS

  1. 取得 API Key
    • 登入 cloudflare 後,到右上角選 My profile
    • 到最左邊選 API token
    • 選 API Keys -> Global API Key -> View
    • 輸入 password 後就可以取得 API key: ${api_key}
  2. 取得 Zone ID
    • 回到 cloudclare 首頁,進入自己的 domain name
    • 到右邊往下找,可以看到 API -> Zone ID
    • 取得 Zone ID : ${zone_id}
      • 註冊 cloudflare 的 email: ${cloudflare_email}
  3. 回到 rock pi
# 下載 cloudflare ddns 的 script
wget –content-disposition https://github.com/timothymiller/cloudflare-ddns/archive/refs/heads/master.zip
unzip cloudflare-ddns-master.zip
cd cloudflare-ddns-master
cp config-example.json config.json # 從範本設定檔中複製一份出來
# 接著編輯 config.json
vim config.json
{
  "cloudflare": [
    {
      "authentication": {
        "api_token": "api_token_here", 
        "api_key": {
          "api_key": "${api_key}",
          "account_email": "${cloudflare_email}"
        }
      },
      "zone_id": "${zone_id}",
      "subdomains": [
        {
          "name": "vpn",
          "proxied": false
        }
      ]
    }
  ],
  "a": true,
  "purgeUnknownRecords": false,
  "ttl": 300
}
chmod+x start-sync.sh
crontab -e
# 每15分鐘 check 一次
*/15 * * * * /bin/bash /root/cloudflare-ddns-master/start-sync.sh

Pi VPN Installation

  • 下載安裝 :
    curl -L https://install.pivpn.io | bash
  • 開始安裝
    • 初始畫面

    • 設定 vpn server 的 interface
    • 設定 ip
      • 因為我們這個不是 Rasberry Pi OS,所以不會幫我們設定,等等會手動設定
    • 確認 config 的 owner

    • 選擇 vpn 種類,我這邊選 wireguard
    • 設定要用的port,我這邊改成 51821 (也可用 default: 51820)
    • 設定 DNS server 來源,我是習慣用 cloudflare (1.1.1.1)
    • 設定 連線方式是要用 domain name 還是 ip
      • 這邊選用 domain name

    • 產生 key
    • 完成提示
  • IP 設定
vim /etc/pivpn/wireguard/setupVars.conf
## 可以看到很多可以設定的欄位,我們找到 
...
pivpnNET=10.215.248.0
subnetClass=24
pivpnenableipv6=0
ALLOWED_IPS="0.0.0.0/0, ::0/0"
...
# 並修改成自己需要的
## 範例
pivpnNET=192.168.21.0
subnetClass=24
pivpnenableipv6=0

## 這邊的意思是,你想要連進來的 vpn client 可以存取哪邊的網段
## 設定 0.0.0.0/0 就是 IPv4 全都通
ALLOWED_IPS="0.0.0.0/0, ::0/0"

要特別注意的是這邊的 “pivpnNET=192.168.21.0” 指的是將 rock pi 的網卡設做 NAT 去轉址這個分配給連進來的 client 的 ip ,而不是由 rock pi 的 dhcp server 給這個 client 與 rock pi 同級的網路

但為什麼還是可以存取區網的服務?因為現在 vpn client 是掛在 rock pi 下面,所以理論上只要是 rock pi 可以 access 的 service,vpn client 也都可以 access

Port Forwarding on router

你需要根據自己的環境在router上面設定防火牆跟 port forwarding
把 port 51821 導到 rock pi 上的 51821 port

Pi VPN Client 設定

建立 client

pivpn add

# 提示輸入新建使用者名稱

查看所有 client config

pivpn -l

加入 client 連線

pivpn -qr
  • 此時會跳出 QR code,手機下載 wireguard app,以 qr code 加入設定檔即可

顯示目前連線清單

pivpn -c

其他常用 command

root@rockpi-4b:/etc/wireguard# pivpn
::: Control all PiVPN specific functions!
:::
::: Usage: pivpn <command> [option]
:::
::: Commands:
:::    -a, add              Create a client conf profile
:::    -c, clients          List any connected clients to the server
:::    -d, debug            Start a debugging session if having trouble
:::    -l, list             List all clients
:::   -qr, qrcode           Show the qrcode of a client for use with the mobile app
:::    -r, remove           Remove a client
:::  -off, off              Disable a client
:::   -on, on               Enable a client
:::    -h, help             Show this help dialog
:::    -u, uninstall        Uninstall pivpn from your system!
:::   -up, update           Updates PiVPN Scripts
:::   -bk, backup           Backup VPN configs and user profiles

Trouble shooting

若網路不通,可以下 command

pivpn -d

有機會可以 self repair

Reference


留言

發表迴響