K7

K7Blog

须知少年凌云志 曾许人间第一流.
proton
telegram

書接上回:掃描反代Cloudflare的IP 給網站或節點加速 免費製作自己的CDN加速

前言:#

看此文章前先看完:掃描反代 Cloudflare 的 IP 給網站或節點加速 免費製作自己的 CDN 加速

本文章算一個後續和常見問題的解答和解決方法,如果你是想加速節點而已 請直接看下面的視頻:

如果你是想加速網站,並且遇到了一些問題導致無法加速成功,速度慢,無法訪問網站等問題,請繼續往下看。

可能會出現的問題 + 解決辦法:#

首先你找到了一些反代 Cloudflare 的 IP,並且通過前面的文章中教程解析到了這些 IP 上,你去訪問可能會提示證書錯誤 無法訪問的情況,這個情況下忽略證書錯誤會訪問到他人的網站中。

代表這個 IP 的 443 端口並沒有反代到 Cloudflare 上,一般 443 端口正常反代證書內容域名會是:cloudflare-dns.com

IP 檢測:#

那麼我發現了這個問題,找 AI 寫了一個 go 代碼,可以篩選出正常 443 端口的節點 IP,複製下面的代碼創建一個 go 文件,再創建好一個 ip.txt 和 443.txt。在 ip.txt 寫入你需要檢查的 IP 節點就好了,正常的 IP 會寫入到 443.txt 中。

package main

import (
	"bufio"
	"crypto/tls"
	"fmt"
	"net"
	"os"
	"strings"
	"sync"
	"time"
)

func main() {
	// 打開 ip.txt 文件
	file, err := os.Open("ip.txt")
	if err != nil {
		fmt.Println("無法打開文件:", err)
		return
	}
	defer file.Close()

	// 創建一個文件用於寫入合格的 IP 地址
	outFile, err := os.OpenFile("443.txt", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
	if err != nil {
		fmt.Println("無法創建文件:", err)
		return
	}
	defer outFile.Close()

	// 創建一個 bufio.Scanner 用於逐行讀取文件內容
	scanner := bufio.NewScanner(file)
	tasks := make(chan string, 5) // 並發任務通道
	results := make(chan string)  // 結果通道
	var wg sync.WaitGroup         // 等待所有任務完成

	// 開啟並發任務處理
	for i := 0; i < 5; i++ {
		wg.Add(1)
		go handleTask(tasks, results, &wg)
	}

	// 逐行讀取文件內容並發送到並發任務通道
	for scanner.Scan() {
		ip := scanner.Text()
		tasks <- ip
	}

	// 關閉並發任務通道,等待所有任務完成
	close(tasks)
	go func() {
		wg.Wait()
		close(results)
	}()

	// 從結果通道中讀取合格的 IP 地址並寫入到文件中
	for ip := range results {
		outFile.WriteString(ip + "\n")
	}

	if err := scanner.Err(); err != nil {
		fmt.Println("讀取文件時發生錯誤:", err)
		return
	}

	fmt.Println("處理完畢,合格的 IP 已追加到 443.txt 文件中")
}

// 函數用於處理並發任務
func handleTask(tasks <-chan string, results chan<- string, wg *sync.WaitGroup) {
	defer wg.Done()
	for ip := range tasks {
		// 檢查 IP 的 443 端口是否可訪問,超時設置為 5 秒
		if isPortOpenWithTimeout(ip, "443", 5*time.Second) {
			// 如果 443 端口可訪問,繼續檢查證書是否來自 cloudflare-dns.com
			if checkCertificate(ip, "cloudflare-dns.com") {
				// 如果證書來自 cloudflare-dns.com,寫入到結果通道中
				fmt.Println(ip, "合格")
				results <- ip
			} else {
				fmt.Println(ip, "不合格,證書不是來自 cloudflare-dns.com")
			}
		} else {
			fmt.Println(ip, "不合格,443端口不可訪問或超時")
		}
	}
}

// 函數用於檢查指定 IP 和端口是否可訪問,並設置超時時間
func isPortOpenWithTimeout(ip, port string, timeout time.Duration) bool {
	conn, err := net.DialTimeout("tcp", ip+":"+port, timeout)
	if err != nil {
		return false
	}
	defer conn.Close()
	return true
}

// 函數用於檢查指定 IP 的證書是否來自指定的域名
func checkCertificate(ip, domain string) bool {
	config := tls.Config{ServerName: domain}
	conn, err := tls.Dial("tcp", ip+":443", &config)
	if err != nil {
		return false
	}
	defer conn.Close()

	// 獲取證書
	certs := conn.ConnectionState().PeerCertificates
	if len(certs) < 1 {
		return false
	}

	// 檢查證書是否匹配指定的域名
	for _, cert := range certs {
		if strings.Contains(cert.Subject.CommonName, domain) || cert.VerifyHostname(domain) == nil {
			return true
		}
	}
	return false
}

還有一個問題就是有些 IP 的 80 端口可以訪問,443 端口也可以訪問,但是 443 端口被防火牆給牆了,然後就是 80 無法使用 443 端口可以使用,使用這樣的 IP 加速後會導致http://k7blog.com 無法訪問,也不能 301 跳轉到 https,這個大家需要花點功夫去找 80 和 443 都可用的。

IP 測速:#

如果你要用,那麼就需要忍受速度不穩定和隨時不可用的情況,因為也會有人拿來加速節點 動不動去跑一些 4k8k 視頻或者下載任務。而且有些節點本身就很慢這個時候我們使用就會是反向加速。於是拿出 AI 寫了一個 go 代碼,分為 jpg 測速和 zip 測速。

Snipaste_2024-04-30_14-42-17

jpg 測速(請使用 Windows 電腦,或者你自己修改對應的 hosts 目錄):

img.a8tool.comhttps://img.k7blog.com/i/2024/04/30/loux3b.jpg 修改成你自己的,jpg 文件建議有個 5M 或以上,到 go 程序同目錄下創建一個 dns.txt 文件,寫入測速節點 IP。

package main

import (
	"fmt"
	"io"
	"io/ioutil"
	"log"
	"net/http"
	"os"
	"os/exec"
	"strings"
	"time"
)

// backupHostsFilePath 存儲 hosts 文件的備份路徑
var backupHostsFilePath = "C:\\Windows\\System32\\drivers\\etc\\hosts.backup"

func main() {
	// 打開 DNS 文件
	dnsFile, err := os.Open("dns.txt")
	if err != nil {
		log.Fatalf("無法打開 DNS 文件:%v", err)
	}
	defer dnsFile.Close()

	// 讀取 DNS 文件中的 IP
	ips, err := ioutil.ReadAll(dnsFile)
	if err != nil {
		log.Fatalf("無法讀取 DNS 文件:%v", err)
	}

	// 創建日誌文件
	logFile, err := os.OpenFile("dns.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
	if err != nil {
		log.Fatalf("無法創建日誌文件:%v", err)
	}
	defer logFile.Close()

	// 備份原 hosts 文件
	err = backupHostsFile()
	if err != nil {
		log.Fatalf("備份 hosts 文件失敗:%v", err)
	}

	// 以行為單位遍歷 IP
	ipList := strings.Split(string(ips), "\n")
	for _, ip := range ipList {
		ip = strings.TrimSpace(ip)
		if ip == "" {
			continue
		}

		// 檢查當前IP是否已經是目標IP
		if !checkHostIP("img.k7blog.com", ip) {
			// 修改本地 host 文件
			if err := modifyHosts("img.k7blog.com", ip); err != nil {
				log.Printf("修改 host 文件失敗:%v", err)
				continue
			}

			// 刷新 DNS 緩存
			err := flushDNSCache()
			if err != nil {
				log.Printf("刷新 DNS 緩存失敗:%v", err)
			}

			// 等待一段時間,確保 host 文件生效
			time.Sleep(5 * time.Second)

			// 再次檢查當前IP是否已經是目標IP
			if !checkHostIP("img.k7blog.com", ip) {
				log.Printf("域名未指向目標 IP:%s", ip)
				continue
			}
		}

		// 刪除舊的圖片文件
		err := deleteFile("downloaded_image.jpg")
		if err != nil {
			log.Printf("刪除舊的圖片文件失敗:%v", err)
		}

		// 下載圖片
		start := time.Now()
		_, err = downloadFile("https://img.k7blog.com/i/2024/04/30/loux3b.jpg", "downloaded_image.jpg")
		if err != nil {
			log.Printf("下載圖片失敗:%v", err)
			continue
		}
		duration := time.Since(start)

		// 記錄下載時間和下載速度
		speed := float64(fileSize("downloaded_image.jpg")) / duration.Seconds() / 1024 // KB/s

		// 打印記錄信息並寫入日誌文件
		logMsg := fmt.Sprintf("IP: %s, 下載時間: %v, 下載速度: %.2f KB/s", ip, duration, speed)
		fmt.Println(logMsg)
		if _, err := logFile.WriteString(logMsg + "\n"); err != nil {
			log.Printf("寫入日誌文件失敗:%v", err)
		}

		// 恢復原 hosts 文件
		err = restoreHostsFile()
		if err != nil {
			log.Fatalf("恢復 hosts 文件失敗:%v", err)
		}
	}
}

// 修改本地 hosts 文件
func modifyHosts(hostname, ip string) error {
	hostsFilePath := "C:\\Windows\\System32\\drivers\\etc\\hosts"
	hostsFile, err := os.OpenFile(hostsFilePath, os.O_APPEND|os.O_WRONLY, 0644)
	if err != nil {
		return err
	}
	defer hostsFile.Close()

	_, err = hostsFile.WriteString(fmt.Sprintf("%s %s\n", ip, hostname))
	if err != nil {
		return err
	}

	return nil
}

// 下載文件
func downloadFile(url, filename string) (int64, error) {
	resp, err := http.Get(url)
	if err != nil {
		return 0, err
	}
	defer resp.Body.Close()

	file, err := os.Create(filename)
	if err != nil {
		return 0, err
	}
	defer file.Close()

	size, err := io.Copy(file, resp.Body)
	if err != nil {
		return 0, err
	}

	return size, nil
}

// 獲取文件大小
func fileSize(filename string) int64 {
	info, err := os.Stat(filename)
	if err != nil {
		return 0
	}
	return info.Size()
}

// 備份 hosts 文件
func backupHostsFile() error {
	src, err := os.Open("C:\\Windows\\System32\\drivers\\etc\\hosts")
	if err != nil {
		return err
	}
	defer src.Close()

	dst, err := os.Create(backupHostsFilePath)
	if err != nil {
		return err
	}
	defer dst.Close()

	_, err = io.Copy(dst, src)
	if err != nil {
		return err
	}

	return nil
}

// 恢復 hosts 文件
func restoreHostsFile() error {
	src, err := os.Open(backupHostsFilePath)
	if err != nil {
		return err
	}
	defer src.Close()

	dst, err := os.Create("C:\\Windows\\System32\\drivers\\etc\\hosts")
	if err != nil {
		return err
	}
	defer dst.Close()

	_, err = io.Copy(dst, src)
	if err != nil {
		return err
	}

	return nil
}

// 刷新 DNS 緩存
func flushDNSCache() error {
	cmd := exec.Command("ipconfig", "/flushdns")
	err := cmd.Run()
	if err != nil {
		return err
	}
	return nil
}

// 刪除文件
func deleteFile(filename string) error {
	err := os.Remove(filename)
	if err != nil {
		return err
	}
	return nil
}

// 檢查域名是否指向目標 IP
func checkHostIP(hostname, expectedIP string) bool {
	addrs, err := net.LookupIP(hostname)
	if err != nil {
		log.Printf("無法解析域名:%s", err)
		return false
	}
	for _, addr := range addrs {
		if addr.String() == expectedIP {
			return true
		}
	}
	return false
}

zip 測速(請使用 Windows 電腦,或者你自己修改對應的 hosts 目錄):

img.a8tool.comhttps://img.k7blog.com/i/2024i.zip 修改成你自己的,zip 文件建議有個 10M 或以上,到 go 程序同目錄下創建一個 dns.txt 文件,寫入測速節點 IP。

package main

import (
	"fmt"
	"io"
	"io/ioutil"
	"log"
	"net"
	"net/http"
	"os"
	"os/exec"
	"strings"
	"time"
)

// backupHostsFilePath 存儲 hosts 文件的備份路徑
var backupHostsFilePath = "C:\\Windows\\System32\\drivers\\etc\\hosts.backup"

func main() {
	// 打開 DNS 文件
	dnsFile, err := os.Open("dns.txt")
	if err != nil {
		log.Fatalf("無法打開 DNS 文件:%v", err)
	}
	defer dnsFile.Close()

	// 讀取 DNS 文件中的 IP
	ips, err := ioutil.ReadAll(dnsFile)
	if err != nil {
		log.Fatalf("無法讀取 DNS 文件:%v", err)
	}

	// 創建日誌文件
	logFile, err := os.OpenFile("dns.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
	if err != nil {
		log.Fatalf("無法創建日誌文件:%v", err)
	}
	defer logFile.Close()

	// 備份原 hosts 文件
	err = backupHostsFile()
	if err != nil {
		log.Fatalf("備份 hosts 文件失敗:%v", err)
	}

	// 以行為單位遍歷 IP
	ipList := strings.Split(string(ips), "\n")
	for _, ip := range ipList {
		ip = strings.TrimSpace(ip)
		if ip == "" {
			continue
		}

		// 檢查當前IP是否已經是目標IP
		if !checkHostIP("img.k7blog.com", ip) {
			// 修改本地 host 文件
			if err := modifyHosts("img.k7blog.com", ip); err != nil {
				log.Printf("修改 host 文件失敗:%v", err)
				continue
			}

			// 刷新 DNS 緩存
			err := flushDNSCache()
			if err != nil {
				log.Printf("刷新 DNS 緩存失敗:%v", err)
			}

			// 等待一段時間,確保 host 文件生效
			time.Sleep(5 * time.Second)

			// 再次檢查當前IP是否已經是目標IP
			if !checkHostIP("img.k7blog.com", ip) {
				log.Printf("域名未指向目標 IP:%s", ip)
				continue
			}
		}

		// 刪除舊的zip文件
		err := deleteFile("downloaded_file.zip")
		if err != nil {
			log.Printf("刪除舊的zip文件失敗:%v", err)
		}

		// 下載zip文件
		start := time.Now()
		size, err := downloadFile("https://img.k7blog.com/i/2024i.zip", "downloaded_file.zip")
		if err != nil {
			log.Printf("下載zip文件失敗:%v", err)
			continue
		}
		duration := time.Since(start)

		// 計算下載速度
		speed := float64(size) / duration.Seconds() / 1024 // KB/s

		// 打印記錄信息並寫入日誌文件
		logMsg := fmt.Sprintf("IP: %s, 下載時間: %v, 下載速度: %.2f KB/s", ip, duration, speed)
		fmt.Println(logMsg)
		if _, err := logFile.WriteString(logMsg + "\n"); err != nil {
			log.Printf("寫入日誌文件失敗:%v", err)
		}

		// 恢復原 hosts 文件
		err = restoreHostsFile()
		if err != nil {
			log.Fatalf("恢復 hosts 文件失敗:%v", err)
		}
	}
}

// 修改本地 hosts 文件
func modifyHosts(hostname, ip string) error {
	hostsFilePath := "C:\\Windows\\System32\\drivers\\etc\\hosts"
	hostsFile, err := os.OpenFile(hostsFilePath, os.O_APPEND|os.O_WRONLY, 0644)
	if err != nil {
		return err
	}
	defer hostsFile.Close()

	_, err = hostsFile.WriteString(fmt.Sprintf("%s %s\n", ip, hostname))
	if err != nil {
		return err
	}

	return nil
}

// 下載文件
func downloadFile(url, filename string) (int64, error) {
	resp, err := http.Get(url)
	if err != nil {
		return 0, err
	}
	defer resp.Body.Close()

	file, err := os.Create(filename)
	if err != nil {
		return 0, err
	}
	defer file.Close()

	size, err := io.Copy(file, resp.Body)
	if err != nil {
		return 0, err
	}

	return size, nil
}

// 備份 hosts 文件
func backupHostsFile() error {
	src, err := os.Open("C:\\Windows\\System32\\drivers\\etc\\hosts")
	if err != nil {
		return err
	}
	defer src.Close()

	dst, err := os.Create(backupHostsFilePath)
	if err != nil {
		return err
	}
	defer dst.Close()

	_, err = io.Copy(dst, src)
	if err != nil {
		return err
	}

	return nil
}

// 恢復 hosts 文件
func restoreHostsFile() error {
	src, err := os.Open(backupHostsFilePath)
	if err != nil {
		return err
	}
	defer src.Close()

	dst, err := os.Create("C:\\Windows\\System32\\drivers\\etc\\hosts")
	if err != nil {
		return err
	}
	defer dst.Close()

	_, err = io.Copy(dst, src)
	if err != nil {
		return err
	}

	return nil
}

// 刷新 DNS 緩存
func flushDNSCache() error {
	cmd := exec.Command("ipconfig", "/flushdns")
	err := cmd.Run()
	if err != nil {
		return err
	}
	return nil
}

// 刪除文件
func deleteFile(filename string) error {
	err := os.Remove(filename)
	if err != nil {
		return err
	}
	return nil
}

// 檢查域名是否指向目標 IP
func checkHostIP(hostname, expectedIP string) bool {
	addrs, err := net.LookupIP(hostname)
	if err != nil {
		log.Printf("無法解析域名:%s", err)
		return false
	}
	for _, addr := range addrs {
		if addr.String() == expectedIP {
			return true
		}
	}
	return false
}

當然你不修改代碼使用也是可以的,也能測試出一個基本的速度,但是還是修改成你自己的才能體現出實際的速度,建議使用國內網絡不開啟代理測試 畢竟你需要加速肯定是要加速大陸,並且這個樣子你還能知道那些在大陸不可用。

後續我有時間,我會找 AI 或者看其他解決辦法 做一個故障轉移的辦法 如部分節點不可用直接刪除解析,最後提醒大家一個點,就是你加速的域名不要直接解析在節點 IP 上,因為你變動了解析那麼你就要重新去驗證主機名 你直接添加一個新的解析 這個解析只解析節點 IP,然後把加速的域名添加到這個解析上就好了。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。