透過域名訪問內網伺服器

wow-發表於2024-11-19

cloudflare優選ip訪問家用伺服器

前言

由於一直有使用markdown寫筆記的需求,但是每次處理圖片的時候總是很頭疼。突然,我瞥見了還在角落裡面吃灰小主機,因此萌生了廢物利用想法,搭建一個外網可訪問的圖床。圖床直接使用lsky-pro就可以,關鍵還是在外網訪問上。

於是在網上看看有沒有現成的方案,功夫不負有心人,找到了兩種方法:內網穿透或者DDNS。由於免費的內網穿透頻寬小,所以使用DDNS方案。

家裡寬頻只有動態ipv6,80、443埠也不能用。於是,先透過DDNS將公網ipv6地址放到cloudflareDNS伺服器上解析。但是ipv6網路普又是一個問題,在ipv4 only網路上無法訪問伺服器,所以要cloudflareCDN實現ipv4ipv6;加上埠轉發,還可以不帶埠訪問伺服器;最後再使用Cloudflare for SaaS配置優選ip提升下速度,似乎就圓滿了。感謝cloudflare大善人。下面開始實操。

環境說明

個人還是習慣使用Ubuntu。然後我使用了一款伺服器管理皮膚1panel。使用圖形化介面可以少敲一些命令列。1panel裡很多服務都是容器搭建的,相容性不錯。最後就是準備域名。如果要弄優選ip,就需要兩個域名,和一個palpay賬戶。

實操

伺服器管理皮膚1panel

由於下面很多操作都是在1panel皮膚中操作,所以提前安裝好1panel。安裝過程不復雜。直接去官網看就行線上安裝 - 1Panel 文件

安裝時它會自動幫我裝上了docker,還配置好了映象倉庫源。真是太細心了。

動態域名解析DDNS-go

Github地址jeessy2/ddns-go

這裡我沒有去Github上下載。而是在1panel應用商店裡下載。

Snipaste_2024-11-18_12-53-25

直接安裝就行,防火牆放行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

image-20241118132750982

啟用IPv6,填入需要解析的域名。

Snipaste_2024-11-18_13-29-59

完成後點選儲存,會自動將DNS記錄同步到cloudflare

實現IPV6 Only伺服器可在IPv4網路下訪問

Cloudflare提供了免費CDN代理。同時CDN支援IPv4IPv6雙棧流量的互相轉換。我們可以利用這一特性實現此需求。

主要步驟:開啟CloudflareCDN服務,再去Origin Rules配置埠轉發。

  1. Cloudflare設定

    開啟每條DNS記錄中的小云朵即可開啟CDN服務

    Snipaste_2024-11-18_15-10-19

    點選規則 -> Origin Rules -> 建立規則。參考下圖填寫。域名填寫自己的。埠不能隨便寫(比如圖中的8081就不行),Cloudflare只支援部分埠轉發。參考Network ports | Cloudflare Fundamentals docs自行修改。image-20241118152622782

  2. 本地伺服器設定

    設定反向代理。直接在1panel中配置,不用敲一行程式碼。進入皮膚,選擇網站 -> 網站根據提示安裝``OpenResty`。

    image-20241118160623374

    注意安裝OpenResty時配置的http/https埠要和埠轉發的一致。否則無法代理。同時防火牆放行對應埠。路由器也要放行該埠(最好由路由器撥號上網)

    Snipaste_2024-11-18_16-16-00

    安裝完成後,配置反向代理。 配置如圖

    Snipaste_2024-11-18_16-21-45

    最後,如果建議開啟https。開啟方法也很簡單,開啟剛才建立的記錄,選擇HTTPS -> 啟用HTTPS然後匯入自己的證書即可。如何申請證書見部署免費SSL證書-acme指令碼

  3. 如果使用https,要在Cloudflare中選擇SSL/TLS。設定SSL/TLS加密設定為完全。

    Snipaste_2024-11-18_16-45-24

  4. 至此以及可以直接透過域名訪問家庭內網伺服器。如果有多個服務,可以新增多個二級域名,再重複上面步驟。

    先新增二級域名的``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

  1. 新增回退源

    可用上面配置好的域名作為回退源。也可用其他域名,但要求backdomain.com已經在正常解析,且開啟CDN

    位置:SSL/TLS -> 自定義主機。輸入域名backdomain.com

  2. 新增自定義主機名,位置:SSL/TLS --> 自定義主機名 --> 新增自定義主機名(圖中域名多加了個點,懶得改了)

    Snipaste_2024-11-18_10-04-58

    輸入主域名:maindomian.com,其他預設即可(圖中域名多加了個點,懶得改了)image-20241118100750022

    完成後,找到新增剛新增的主機名,在證書狀態列會出現待驗證,點選後出現下面介面。Snipaste_2024-11-18_10-11-24

    將下面兩個TXT記錄分別新增至miandomain.com的``DNS記錄中,證書名稱填在名稱處,證書驗證TXT`值填在名稱處。image-20241118101802924

    完成後如圖Snipaste_2024-11-18_10-21-10

    回到新增回退源介面,點選重新整理後,顯示如圖表示新增成功。Snipaste_2024-11-18_10-26-40

設定DNS

  1. maindomain.com主域名中新增CNAME記錄實現miandomain.com --> cdn.backdomain.com。關閉代理,僅DNS

    image-20241118103636716

  2. backdomain.com回源域名中設定輔助域名,指向``cloudflare優選ip`。既在DNS中新增如下記錄。

    Snipaste_2024-11-18_17-28-17

    優選ip選擇參考XIU2/CloudflareSpeedTest: 🌩「自選優選 IP」測試 Cloudflare CDN 延遲和速度,獲取最快 IP ~

其他設定

  1. 反向代理,如果使用https,匯入miandomian.com的證書。

    在本地伺服器上新增新的反向代理用於代理maindomian.com。方法通上點選跳轉

  2. 檢查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

相關文章