這篇主要在教如何在沒有申請固定 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
- 取得 API Key
- 登入 cloudflare 後,到右上角選 My profile
- 到最左邊選 API token
- 選 API Keys -> Global API Key -> View
- 輸入 password 後就可以取得 API key: ${api_key}
- 登入 cloudflare 後,到右上角選 My profile
- 取得 Zone ID
- 回到 cloudclare 首頁,進入自己的 domain name
- 到右邊往下找,可以看到 API -> Zone ID
- 取得 Zone ID : ${zone_id}
- 註冊 cloudflare 的 email: ${cloudflare_email}
- 回到 cloudclare 首頁,進入自己的 domain name
- 回到 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,所以不會幫我們設定,等等會手動設定
- 因為我們這個不是 Rasberry Pi OS,所以不會幫我們設定,等等會手動設定
- 確認 config 的 owner
- 選擇 vpn 種類,我這邊選 wireguard
- 設定要用的port,我這邊改成 51821 (也可用 default: 51820)
- 設定 DNS server 來源,我是習慣用 cloudflare (1.1.1.1)
- 設定 連線方式是要用 domain name 還是 ip
- 這邊選用 domain name
- 這邊選用 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
發表迴響