前面寫過可以透過免費一年的 GCP 安裝 MTProxy 讓 Telegram 瞬間順滑起來

如果是單人使用的話 CPU 佔用極低,其實還蠻浪費的

所以為了不要浪費這虛擬機,今天就繼續來給 GCP 虛擬機加一點工作 🤣

其實 AdGuard Home 還蠻適合安裝一套到 GCP 虛擬機裡面的,主要給手機或者平板外出時使用

在家或者辦公室的話,已經有實體機的伺服器安裝 AdGuard Home 了,在家就用自家內網的伺服器即可~

以下是我們這篇文章想要達成的目標:

  • 在 GCP 的 Debian 10 虛擬機中安裝 AdGuard Home
  • 使用 Let’s Encrypt 自簽證書並自動續期
  • AdGuard Home 設定開啟 DNS over Https(DoH)功能
  • 在 iOS 上使用 DNSCloak 設定 On demand 自動切換
  • 使用 gcloud 批次建立白名單防火牆規則

在 GCP 的 Debian 10 虛擬機中安裝 AdGuard Home

如果你還沒有 GCP 的話,請先參考之前文章申請 GCP 到安裝 Debian 系統

接著 SSH 進去虛擬機中同樣需要使用終端機來完成安裝

# 先更新系統
$ sudo apt update && sudo apt full-upgrade
# 如果之前沒裝過 wget nano tar,就安裝一下
$ sudo apt install wget nano tar -y
# GCP 是 Intel CPU,所以安裝 amd64 的 AdGuard Home 版本
# 最新版下載網址可以到官網獲取:https://github.com/AdguardTeam/AdGuardHome/releases
$ wget https://github.com/AdguardTeam/AdGuardHome/releases/download/v0.99.3/AdGuardHome_linux_amd64.tar.gz
# 解壓縮
$ tar xvf AdGuardHome_linux_amd64.tar.gz
$ cd AdGuardHome
# 開始安裝
$ sudo ./AdGuardHome -s install

安裝速度很快,裝完以後理論上 AdGuard Home 已經順利啓動,不過官方啓動預設是在端口 3000

我們要幫 GCP 的虛擬機開個 3000 端口,回到 GCP 管理網頁

如上圖,找到「VPC 網路」、「防火牆規則」

如上圖,找到「建立防火牆規則」點進去

依照上圖來設定,名稱跟目標代碼可以隨意取但是自己取的要記住

如果有固定 IP 的話,來源 IP 可以直接寫自己的 IP 即可

找到如上圖的位置,把「tcp」打勾填上「3000」,然後記得按下「儲存」按鈕

接著到 Compute Engine 的 VM 執行個體中,選擇虛擬機

如上圖,編輯此虛擬機

找到如上圖的「網路標記」,手動打上我們剛剛設定的名稱,然後記得到最下面按下「儲存」按鈕

此時我們已經打開此虛擬機的防火牆 3000 端口

接著我們使用瀏覽器 http://[GCP-IP]:3000 即可打開管理網頁開始設定囉!

AdGuard Home 設定步驟很簡單,大部分保持預設即可

如上圖在設定使用者名稱跟密碼時候,千萬要自己記得

如上圖,至此我們就已經完成 AdGuard 的安裝了

此時你只要再去 GCP 的管理後台,依照上面防火牆的設定,新增一個 udp 53 的端口給他

這台 AdGuard Home 就可以正式對外服務了,不過 udp 53 很容易被監聽跟攻擊

所以我們繼續往下設定 DNS over Https

使用 Let’s Encrypt 自簽證書並自動續期

開始之前你需要有一個自己的長期域名,這個需要付費的,建議去買一個,之後轉移到 CloudFlare 續費

CF 價格也不貴,他們說他們不賺錢,直接就是域名續費的成本價格給使用者了

像是頂級域名 .com 的年費他們只有收 8.03 美金而已,這價格還包含隱私保護,非常的划算!

例如你註冊了一個 abc.com 的域名,請先去 DNS 管理後台新增一條 A 記錄

Name 名稱可以隨便取,以下用 dns 來假設,未來打算用 dns.abc.com 來簽名證書跟對外服務

如上圖,域名在 CloudFlare 的話,記得把 Proxy status 改成「DNS only」,TTL 保持「Auto」即可

設定好域名以後,打開 GCP 虛擬機的 SSH 終端機,接下來要使用指令來安裝

# 切換 root 身份
$ sudo su
# 先更新系統
$ apt update && apt full-upgrade -y
# 安裝 certbot
$ apt install certbot
# 開始簽名,下面電子郵件跟域名請換成自己的
$ certbot certonly --standalone -n --agree-tos --email [email protected] --preferred-challenges http -d dns.abc.com

輸入完指令後,會出現如上圖的資料,certbot 會告訴你證書放在哪個目錄裡面,以及證書什麼時候會到期

另外使用以上指令簽名時候,會使用到 80 端口做驗證,所以如果你 GCP 沒開 80 端口的話,請去打開

有了以上兩個證書存放的路徑以後,我們回到 AdGuard Home 的管理網頁

如上圖設定,HTTPS 連接埠從原先預設的 443,此篇文章改成 8956,你可以改成自己想要的數字

最後記得按下左下角的「儲存」,即可完成以及啟用 DNS 的加密服務(DoH & DoT)

AdGuard 管理後台網址就變成 https://dns.abc.com:8956

LE 提供的免費證書只有三個月有效期,所以我們需要設定讓系統每兩個月幫我們自動去續約一次

回到終端機

# 先測試看看自動更新證書有無問題,下面這一條指令會測試去更新,並不會實際去更新
$ certbot renew --dry-run
# 如無問題的話,接著我們要把兩個月簽名一次的工作加入排程
$ crontab -e

選擇 nano 文字編輯器,打開文件後,複製以下到裡面,然後保存退出

0 0 15 */2 * /usr/bin/certbot renew --quiet

如此每隔兩個月十五號他就會自動執行一次續簽證書

在 iOS 上使用 DNSCloak 設定 On demand 自動切換

iOS 上面支援 DoT 跟 DoH 的客戶端不多,AdGuard for iOS 是少數都能支援的 App

不過他不支援 on demand 的設定方式,所以這裡推薦另外一套免費的 DNSCloak

缺點就是 DNSCloak 目前只有支援 DoH,少了 DoT,另外就是設定稍微麻煩,只吃 DNS Stamp 格式

首先打開以下的網址:

https://dnscrypt.info/stamps/

如上圖,先把 Protocol 改成「DNS-overHTTP/2」,接著依照欄位填寫內容

如上圖

IP Address 就寫 GCP 的外部 IP

Host name 寫上你的域名以及端口號碼

其他欄位保持預設即可,最後需要的是網站右邊計算出的「Stamp」那整串文字,複製下來

接著打開 iOS 上面的 DNSCloak App

如上圖,剛打開 App 首頁上方會有個編輯的 icon,點進去

在最下面加入以下內容:

[static.'MyDNSSever']
 stamp = 'sdns://AgMAAAAAAAAACzE4My1xNy19Ny4xAAtvZHZyLm5pYy5jfgQvZH9o'

記得 sdns 那段要改成你自己的內容

新增後應該會跟上圖差不多,加入後記得點右上角的勾勾,讓 App 保存內容

接著回到 App 首頁,應該就會看見你新增的 DNS 伺服器已經出現在清單最上面

設定完伺服器以後,接著來去細節設定,如上圖的 icon 點進去

General options 裡面三個都打開

On Demand 功能可以按需連線,系統偵測到我們網路環境達到條件就會自動連線或者斷線

Advanced options 裡面東西比較多,挑幾個重點說

Skip accessibility check 有遇到 app 在網路狀態切換時候被卡住的話可以打開此選項

WiFi EXCEPTIONS 就是每當你連線到這些特定 SSID 時候就會斷線的設定

手動填寫,你有很多的話就用逗點區隔

如果你 GCP 有開 udp 端口的話,此處 TCP Only 就不要打開

如果 GCP 沒開放 udp 端口,此處就要打開才能正常連線

Disable TLS session tickets 打開可以稍微加快連線速度,不過會損失一點加密性,自己衡量

設定完畢後,回到 DNSCloak 首頁,點一下我們設定的伺服器「Use this server」

然後再按下上方的「Play」圖案,即可啓動 DNS 服務囉!

使用 gcloud 批次建立白名單防火牆規則

因為搭這個伺服器只想要給自己或者家人、朋友使用,並沒有想給其他人用

我們就可以建立一個「白名單」給 GCP,只有在白名單上的才能進出

而最近全球 IPv4 的網段都已經發光,台灣也已經發完了,所以基本上台灣網段不會有太多變化

台灣具體配發的 IPv4 段,可以到 twnic 網站查詢: https://rms.twnic.net.tw/help_ipv4_assign.php

假設你公司以及家中,這兩個地方都有固定 IP,你手機行動網路是台灣大哥大

那麼我們只要把公司以及家中的兩個 IP 加入,還有台灣大哥大所有網段 IP 都加入白名單

如此就能很大程度上防止 DNS Server 被濫用以及被攻擊的問題

下面來介紹怎麼使用 GCP 的指令批次建立白名單防火牆規則

首先打開瀏覽器到 Google Cloud Shell : https://ssh.cloud.google.com/cloudshell

接下來在網頁終端機裡面指令操作

# 列出帳號下所有專案
$ gcloud projects list
# 進入要設定的專案內
$ gcloud config set project [project id]

輸入指令過程會如上圖

接著可以根據上面 twnic 網站查詢到你所屬的行動網路公司,下面用台灣大哥大來示範

$ gcloud compute firewall-rules create tw-twmobile \
--network default \
--priority 1000 \
--direction in \
--action allow \
--source-ranges 124.29.128.0/19,101.8.0.0/13,180.204.0.0/14,43.240.108.0/22,124.29.160.0/19,103.2.216.0/22,123.99.0.0/18,115.80.0.0/14,117.19.0.0/16,123.99.0.0/19 \
--source-tags tw-twmobile \
--rules tcp:8956,tcp:3000,udp:53

指令輸入完畢後,就會新建一條防火牆規則,只有台灣大哥大的 IP 才能通過 tcp 8956、3000 與 udp 53

網路標記為「tw-twmobile」,只要加到你的虛擬機網路設定裡面即可生效

上面指令第六行為台灣大哥大所有 IP 段,你可以根據你實際情況來做改變

例如:遠傳電信

61.20.0.0/16,27.52.0.0/15,211.77.0.0/18,211.77.128.0/17,211.77.64.0/18,211.73.128.0/19,39.8.0.0/13,114.140.0.0/16,210.241.192.0/19,27.51.0.0/16,118.231.0.0/16,27.240.0.0/13,110.24.0.0/13,106.64.0.0/15,103.122.148.0/22

例如:台灣之星

116.89.128.0/20,103.239.60.0/22,43.255.88.0/22,1.200.0.0/16,202.144.208.0/20,43.255.180.0/22,103.5.32.0/22,110.50.128.0/18,112.78.64.0/19,180.217.0.0/16

例如:中華電信

211.20.0.0/16,111.240.0.0/12,114.32.0.0/12,60.250.0.0/15,42.64.0.0/12,118.160.0.0/13,203.78.176.0/20,211.72.0.0/17,125.232.0.0/15,43.255.92.0/22,202.39.0.0/18,202.39.64.0/19,221.120.0.0/18,221.120.64.0/19,61.218.0.0/15,203.74.0.0/16,218.164.0.0/15,59.124.0.0/14,203.160.224.0/19,114.30.32.0/20,1.34.0.0/15,220.129.0.0/16,220.130.0.0/15,220.132.0.0/14,220.136.0.0/13,60.249.0.0/16,203.69.0.0/16,211.79.32.0/20,211.75.128.0/17,210.61.0.0/16,211.23.0.0/16,111.80.0.0/14,125.224.0.0/13,210.65.0.0/16,122.120.0.0/13,61.217.0.0/16,116.59.0.0/16,218.160.0.0/14,210.241.224.0/19,210.71.128.0/17,59.120.0.0/14,220.128.64.0/18,220.128.128.0/17,60.248.0.0/16,211.75.0.0/17,61.228.0.0/14,211.22.0.0/16,111.70.0.0/15,122.118.0.0/16,61.216.0.0/16,59.112.0.0/13,1.160.0.0/12,220.128.0.0/18,175.111.192.0/18,61.224.0.0/14,218.168.0.0/13,210.242.128.0/17,210.59.128.0/17,114.136.0.0/15,210.62.248.0/21,211.21.0.0/16,122.116.0.0/15,175.41.48.0/20,223.136.0.0/13,118.168.0.0/14,114.24.0.0/14,103.25.236.0/22,211.72.128.0/17,203.66.0.0/16,168.95.0.0/16,202.39.128.0/17,61.220.0.0/14,36.224.0.0/12,203.75.0.0/16,218.166.0.0/15,210.242.0.0/17

例如:亞太電信

210.203.0.0/17,222.251.0.0/17,210.202.128.0/17,103.36.116.0/22,223.22.0.0/15,210.58.0.0/16,218.35.0.0/16,210.85.0.0/16,210.63.224.0/19,210.202.64.0/18,222.250.0.0/16,218.187.0.0/16,203.207.32.0/20,210.202.0.0/19,60.244.128.0/17,202.178.128.0/17,43.240.104.0/22,218.34.0.0/16,124.219.0.0/17,210.63.192.0/19,222.157.0.0/16,218.184.0.0/16,203.201.32.0/20,210.201.0.0/16,60.244.0.0/17,101.136.0.0/14,124.218.0.0/16,210.202.48.0/21,222.156.0.0/16,210.200.0.0/16,203.79.128.0/17,210.202.32.0/20,219.91.0.0/17

甚至你可以設定只給台灣 IP 進入而已,各國的 IP CIDR 格式可以參考:

https://github.com/herrbischoff/country-ip-blocks

上面這個項目不定期會自動更新各國最新 IP 段,包含 IPv4 與 IPv6,非常方便使用

GCP 防火牆基本上就是你不主動講,就通通擋起來,所以你白名單加的越少,相對就會更安全~