cloudflare
優選ip
訪問家用伺服器
前言
由於一直有使用markdown寫筆記的需求,但是每次處理圖片的時候總是很頭疼。突然,我瞥見了還在角落裡面吃灰小主機,因此萌生了廢物利用想法,搭建一個外網可訪問的圖床。圖床直接使用lsky-pro
就可以,關鍵還是在外網訪問上。
於是在網上看看有沒有現成的方案,功夫不負有心人,找到了兩種方法:內網穿透或者DDNS
。由於免費的內網穿透頻寬小,所以使用DDNS
方案。
家裡寬頻只有動態ipv6
,80、443
埠也不能用。於是,先透過DDNS
將公網ipv6
地址放到cloudflare
的DNS
伺服器上解析。但是ipv6
網路普又是一個問題,在ipv4 only
網路上無法訪問伺服器,所以要cloudflare
的CDN
實現ipv4
轉ipv6
;加上埠轉發,還可以不帶埠訪問伺服器;最後再使用Cloudflare for SaaS
配置優選ip
提升下速度,似乎就圓滿了。感謝cloudflare
大善人。下面開始實操。
環境說明
個人還是習慣使用Ubuntu
。然後我使用了一款伺服器管理皮膚1panel
。使用圖形化介面可以少敲一些命令列。1panel
裡很多服務都是容器搭建的,相容性不錯。最後就是準備域名。如果要弄優選ip
,就需要兩個域名,和一個palpay
賬戶。
實操
伺服器管理皮膚1panel
由於下面很多操作都是在1panel
皮膚中操作,所以提前安裝好1panel
。安裝過程不復雜。直接去官網看就行線上安裝 - 1Panel 文件
安裝時它會自動幫我裝上了docker
,還配置好了映象倉庫源。真是太細心了。
動態域名解析DDNS-go
Github
地址jeessy2/ddns-go
這裡我沒有去Github
上下載。而是在1panel
應用商店裡下載。
直接安裝就行,防火牆放行9876埠、使用http://$LOCAL_IP:9876
訪問。
DNS
服務商選擇Cloudflare
,如何將購買的域名託管至Cloudflare
參考域名DNS服務託管至Cloudflare,就是如此簡單建立API-Key
方法參考dnsapi · acmesh-official/acme.sh Wiki
You can do this via your Cloudflare profile page, under the API Tokens section. When your create the token, under Permissions, select Zone > DNS > Edit, and under Zone Resources, only include the specific DNS zones within which you need to perform DNS challenges.
將得到的API-Key
填入Token
。
啟用IPv6
,填入需要解析的域名。
完成後點選儲存,會自動將DNS
記錄同步到cloudflare
。
實現IPV6 Only
伺服器可在IPv4
網路下訪問
Cloudflare
提供了免費CDN
代理。同時CDN
支援IPv4
和IPv6
雙棧流量的互相轉換。我們可以利用這一特性實現此需求。
主要步驟:開啟Cloudflare
的CDN
服務,再去Origin Rules
配置埠轉發。
-
Cloudflare
設定開啟每條
DNS
記錄中的小云朵即可開啟CDN
服務點選
規則 -> Origin Rules -> 建立規則
。參考下圖填寫。域名填寫自己的。埠不能隨便寫(比如圖中的8081就不行),Cloudflare
只支援部分埠轉發。參考Network ports | Cloudflare Fundamentals docs自行修改。 -
本地伺服器設定
設定反向代理。直接在
1panel
中配置,不用敲一行程式碼。進入皮膚,選擇網站 -> 網站
根據提示安裝``OpenResty`。注意安裝
OpenResty
時配置的http/https
埠要和埠轉發的一致。否則無法代理。同時防火牆放行對應埠。路由器也要放行該埠(最好由路由器撥號上網)安裝完成後,配置反向代理。 配置如圖
最後,如果建議開啟
https
。開啟方法也很簡單,開啟剛才建立的記錄,選擇HTTPS -> 啟用HTTPS
然後匯入自己的證書即可。如何申請證書見部署免費SSL證書-acme指令碼 -
如果使用
https
,要在Cloudflare
中選擇SSL/TLS
。設定SSL/TLS加密
設定為完全。 -
至此以及可以直接透過域名訪問家庭內網伺服器。如果有多個服務,可以新增多個二級域名,再重複上面步驟。
先新增二級域名的``DNS`解析,設定埠轉發,可都轉發至同一埠。最後在本地設定反向代理,代理到對應服務的埠。
設定優選IP
此步驟非必要。但是由於Cloudflare
伺服器都在國外,訪問速度比較慢,透過該方法可以一定程度上緩解。畢竟免費,又不是不能用😁
這裡需要兩個域名且
Cloudflare
繫結paypal
。註冊
paypal
賬戶與Cloudflare
繫結paypal賬戶
的教程在B站一搜一大堆。比較簡單,國內簽帳金融卡應該都可以。
原理
現在有兩個域名maindomain.com
,backdomain.com
,在再建立一個二級域名cdn.backdomain.com
解析到優選好的ip
。整個過程簡單的來說就是:
maindomain.com(CNAME記錄) --> cdn.backdomain.com(DNS解析CDN伺服器) --> 優選CDN伺服器(由於設定了Saas,CDN發現了Header欄位的Host值==maindomain.com,跳轉到回源域名上) --> backdomain.com
最後訪問到我們的伺服器
設定Cloudflare for SaaS
-
新增回退源
可用上面配置好的域名作為回退源。也可用其他域名,但要求
backdomain.com
已經在正常解析,且開啟CDN
。位置:
SSL/TLS -> 自定義主機
。輸入域名backdomain.com
-
新增自定義主機名,位置:
SSL/TLS --> 自定義主機名 --> 新增自定義主機名
(圖中域名多加了個點,懶得改了)輸入主域名:
maindomian.com
,其他預設即可(圖中域名多加了個點,懶得改了)完成後,找到新增剛新增的主機名,在證書狀態列會出現待驗證,點選後出現下面介面。
將下面兩個TXT記錄分別新增至
miandomain.com
的``DNS記錄中,證書名稱填在名稱處,證書驗證
TXT`值填在名稱處。完成後如圖
回到新增回退源介面,點選重新整理後,顯示如圖表示新增成功。
設定DNS
-
在
maindomain.com
主域名中新增CNAME
記錄實現miandomain.com --> cdn.backdomain.com
。關閉代理,僅DNS
-
在
backdomain.com
回源域名中設定輔助域名,指向``cloudflare優選
ip`。既在DNS中新增如下記錄。優選ip選擇參考XIU2/CloudflareSpeedTest: 🌩「自選優選 IP」測試 Cloudflare CDN 延遲和速度,獲取最快 IP ~
其他設定
-
反向代理,如果使用
https
,匯入miandomian.com
的證書。在本地伺服器上新增新的反向代理用於代理
maindomian.com
。方法通上點選跳轉 -
檢查
SSL/TLS
配置,https
服務一般使用配置為完全
自動更新優選ip
指令碼
指令碼參考CloudflareSpeedTest/script/cfst_ddns.sh at master · XIU2/CloudflareSpeedTest
使用說明自動更新 Cloudflare 中的域名解析記錄為最快 IP(Windows/Linux 指令碼+手動教程) · XIU2/CloudflareSpeedTest · Discussion #481
根據個人使用習慣,對指令碼做了一些修改。使用時依次填入API-KEY, EMAIL, ZONE_ID, DOMAIN, RECORD_NAME
#!/bin/bash
API_KEY="******************" # Global API-KEY 金鑰
EMAIL="******************" # 帳戶資訊
ZONE_ID="******************" #區域ID
DOMAIN="******************" # 主域名資訊 假如完鎮域名為cdn.mydomain.com,則此處填mydomain.com
RECORD_NAME="***" # 修改為二級域名名稱 假如完鎮域名為cdn.mydomain.com,則此處填cdn
TYPE=A #DNS A記錄
PROXIED=true #開啟代理
TTL=1 #表示自動
./CloudflareST -o "result_ddns.txt"
# 判斷結果檔案是否存在,如果不存在說明結果為 0
[[ ! -e "result_ddns.txt" ]] && echo "CloudflareST 測速結果 IP 數量為 0,跳過下面步驟..." && exit 0
CONTENT=$(sed -n "2,1p" result_ddns.txt | awk -F, '{print $1}')
if [[ -z "${CONTENT}" ]]; then
echo "CloudflareST 測速結果 IP 數量為 0,跳過下面步驟..."
exit 0
fi
RECORD_ID=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/dns_records?type=A&name=${RECORD_NAME}.${DOMAIN}" -H "X-Auth-Email: ${EMAIL}" -H "X-Auth-Key: ${API_KEY}" -H "Content-Type: application/json" | jq -r '.result[0].id')
if [ -z "$RECORD_ID" ]; then
echo "Error: Unable to retrieve Record ID for the specified A record."
exit 1
fi
curl -X PUT "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/dns_records/${RECORD_ID}" \
-H "X-Auth-Email: ${EMAIL}" \
-H "X-Auth-Key: ${API_KEY}" \
-H "Content-Type: application/json" \
--data "{\"type\":\"${TYPE}\",\"name\":\"${RECORD_NAME}\",\"content\":\"${CONTENT}\",\"ttl\":${TTL},\"proxied\":${PROXIED}}"
終端執行
# 測速指令碼下載壓縮包
wget -N https://github.com/XIU2/CloudflareSpeedTest/releases/download/v2.2.5/CloudflareST_linux_amd64.tar.gz
# 解壓
tar -zxf CloudflareST_linux_amd64.tar.gz
# 賦予執行許可權
chmod +x CloudflareST
# 新建指令碼,將上面程式碼修改引數後複製進去。儲存
vim auto_dns_update.sh
#賦予執行許可權
chmod +x auto_dns_update.sh
# 執行
./auto_dns_update.sh
新增定時任務vim /etc/crontab
# 將下面一行程式碼加入到最後.晚上9點執行該指令碼
0 21 * * * root cd /root/CloudflareST/ && ./auto_dns_update.sh