前言:#
看此文章前先看完:掃描反代 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 測速。
jpg 測速(請使用 Windows 電腦,或者你自己修改對應的 hosts 目錄):
把img.a8tool.com
和 https://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.com
和 https://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,然後把加速的域名添加到這個解析上就好了。