戰(zhàn):從DNS記錄到CF節(jié)點(diǎn)檢測)
1. 結(jié)論域名DNS 記錄能否走 IPv4能否走 IPv6v6.ident.me只有 AAAAIPv6-only? 不能? 能v4.ident.me只有 AIPv4-only? 能? 不能ident.meA AAAA雙棧? 能? 能判定原則一個(gè)網(wǎng)址能不能用 IPv4 訪問首先看它有沒有 A 記錄沒有 A 記錄curl -4在 DNS 階段就失敗。注意CMD 不支持反斜杠\換行所有命令必須一行內(nèi)寫完。.bat文件里%{http_code}要寫成%%{http_code}。2. 案例v6.ident.me 三條命令curl -sk4 --max-time 10 --noproxy * -o NUL -w IPv4: HTTP:%{http_code}\n https://v6.ident.me/ curl -sk6 --max-time 10 --noproxy * -o NUL -w IPv6: HTTP:%{http_code}\n https://v6.ident.me/ curl -sk --max-time 10 --noproxy * -o NUL -w DEFAULT: HTTP:%{http_code}\n https://v6.ident.me/參數(shù)解釋參數(shù)含義-s靜默模式不打印進(jìn)度條-k跳過 TLS 證書校驗(yàn)-4強(qiáng)制只走 IPv4只查 A 記錄-6強(qiáng)制只走 IPv6只查 AAAA 記錄不加-4/-6讓系統(tǒng)自選地址族--max-time 10整個(gè)請求最多等 10 秒--noproxy *禁止走任何代理* 所有主機(jī)都不走-o NUL丟棄響應(yīng)正文只看結(jié)果-w ...請求結(jié)束后按格式輸出信息%{http_code}HTTP 狀態(tài)碼\n換行結(jié)果-4→HTTP:000/ exit 6無 A 記錄-6和默認(rèn) →HTTP:200/ exit 0走 IPv6 成功。3. 強(qiáng)制走 IPv4 / IPv6–connect-to 與 --resolve這兩個(gè)參數(shù)都能繞過 DNS強(qiáng)行指定 curl 連接的目標(biāo) IP區(qū)別在于--connect-to作用于 TCP 連接層、--resolve作用于 DNS 解析層利用它們可以檢測某個(gè) IP 上的服務(wù)器是否還在提供服務(wù)、域名解析到的 A / AAAA 記錄哪個(gè)是正確的、失敗是不是 DNS 解析錯(cuò)誤導(dǎo)致的以及同一個(gè) IP 上不同 SNI域名的訪問結(jié)果是否不同。命令 A強(qiáng)制 IPv4–connect-tocurl -sk --noproxy * --connect-to www.freedidi.com:443:179.253.231.105:443 -A Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 -o NUL -w HTTP:%{http_code} size:%{size_download}\n -m 20 https://www.freedidi.com/參數(shù)解釋參數(shù)含義--connect-to 原域名:原端口:新IP:新端口要連www.freedidi.com:443時(shí)實(shí)際撥號(hào)到179.253.231.105:443? 作用層TCP 連接層仍查 DNS但結(jié)果被覆蓋? SNI / Host / 證書校驗(yàn)仍然是www.freedidi.com-A Mozilla/5.0...設(shè)置 User-Agent偽裝成 Chrome--noproxy *禁止走代理強(qiáng)制直連-o NUL丟棄響應(yīng)正文-w HTTP:%{http_code} size:%{size_download}\n輸出狀態(tài)碼 下載字節(jié)數(shù)-m 20總超時(shí) 20 秒命令 B強(qiáng)制 IPv6–resolvecurl -sk --noproxy * --resolve www.freedidi.com:443:[2605:52c0:2:6867:be24:11ff:fe13:cff4] -A Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 -o NUL -w HTTP:%{http_code} size:%{size_download}\n -m 20 https://www.freedidi.com/參數(shù)解釋參數(shù)含義--resolve 域名:端口:IP解析該域名時(shí)不查 DNS直接返回指定 IP? 作用層DNS 解析層? IPv6 地址必須加方括號(hào)否則冒號(hào)被當(dāng)字段分隔符導(dǎo)致格式錯(cuò)誤其余參數(shù)與命令 A 相同兩者區(qū)別參數(shù)作用階段是否查 DNS經(jīng)代理是否有效--connect-toTCP 連接層? 查結(jié)果被覆蓋? 有效--resolveDNS 解析層? 不查?? 經(jīng)代理會(huì)被代理 DNS 覆蓋需配--noproxy *結(jié)果解釋命令預(yù)期結(jié)果含義--connect-to強(qiáng)制 IPv4HTTP:200該 IPv4 地址可用證明 IPv4 源站正常--connect-to強(qiáng)制 IPv6HTTP:200 / 000該 IPv6 地址能否用這個(gè)域名訪問000 表示連接失敗或該服務(wù)器不響應(yīng)--resolve強(qiáng)制 IPv6HTTP:200 / 000取決于該 IPv6 地址當(dāng)時(shí)是否還提供服務(wù)000 表示連接失敗或該服務(wù)器不響應(yīng)--resolve配合-4HTTP:000可驗(yàn)證域名沒有 A 記錄或注入的 IPv4 地址無效000 不等于服務(wù)器壞了它只是請求沒成功。具體原因要結(jié)合 exit 碼6DNS 無記錄7TCP 連不上28超時(shí)35TLS 失敗。4. 鏈路地址族檢測curl -sk --ssl-no-revoke -m 15 --noproxy * -o NUL -w IPv4-only host: HTTP:%{http_code}\n https://v4.ident.me/參數(shù)解釋參數(shù)含義--ssl-no-revoke跳過證書吊銷檢查Windows curl 參數(shù)-m 15限時(shí) 15 秒--noproxy *強(qiáng)制直連-o NUL丟棄正文-w輸出帶前綴的狀態(tài)碼目標(biāo)v4.ident.me只有 A 記錄只能走 IPv4。curl -sk --ssl-no-revoke -m 15 --noproxy * -o NUL -w IPv6-only host: HTTP:%{http_code}\n https://v6.ident.me/參數(shù)解釋參數(shù)與上一條完全相同目標(biāo)v6.ident.me只有 AAAA 記錄只能走 IPv6。判讀IPv4-only 主機(jī)IPv6-only 主機(jī)結(jié)論200200雙棧200000僅 IPv4000200僅 IPv6000000鏈路不通5. CF 節(jié)點(diǎn)主要檢測命令檢測 CF 節(jié)點(diǎn)是否失效核心思路是逐層排查DNS → TCP 端口 → TLS 握手 → SNI 封鎖。5.1 基礎(chǔ)連通性curl --noproxy * -4 -sS -o NUL -w HTTP:%{http_code}\n -m 12 https://你的CF域名/參數(shù)解釋參數(shù)含義--noproxy *禁止走代理強(qiáng)制直連-4強(qiáng)制只走 IPv4-sS-s靜默 -S保留錯(cuò)誤信息-o NUL丟棄響應(yīng)正文-w HTTP:%{http_code}\n只輸出狀態(tài)碼-m 12限時(shí) 12 秒結(jié)果200可用000失敗需逐層往下排查。5.2 DNS 查詢換公共 DNS 排除污染nslookup -typeA 你的CF域名 223.5.5.5 nslookup -typeA 你的CF域名 8.8.8.8參數(shù)解釋參數(shù)含義nslookup系統(tǒng)自帶 DNS 查詢工具-typeA只查 A 記錄IPv4 地址-typeAAAA只查 AAAA 記錄IPv6 地址最后的 IP指定用這個(gè)公共 DNS 查詢不寫則用本機(jī)默認(rèn)5.3 TCP 端口探測Test-NetConnection-ComputerName 你的CF域名-Port 443參數(shù)解釋參數(shù)含義Test-NetConnectionPowerShell 自帶網(wǎng)絡(luò)測試命令無需安裝-ComputerName要測試的主機(jī)名或 IP-Port要測試的端口看TcpTestSucceededTrue 端口能建連False 端口不通別看PingSucceededping 走 ICMP與 TCP 是兩條路不可互推5.4 TLS 層測試curl --noproxy * -4 -sv -o NUL -m 12 https://你的CF域名/參數(shù)解釋參數(shù)含義-vverbose 詳細(xì)模式打印完整連接過程--noproxy *強(qiáng)制直連-4強(qiáng)制 IPv4-o NUL丟棄正文-m 12限時(shí) 12 秒正常結(jié)果輸出HTTP/1.1 200或 301/302TLS 失敗出現(xiàn)Recv failure: Connection was reset→ 疑似 SNI 封鎖5.5 SNI 對照實(shí)驗(yàn)核心固定 IP只換 SNI 里的域名看結(jié)果是否翻轉(zhuǎn)curl.exe --noproxy * -4 -sS -o NUL -w Ahttp%{http_code}\n --resolve 你的CF域名:443:CF的IP https://你的CF域名/ curl.exe --noproxy * -4 -sS -o NUL -w Bhttp%{http_code}\n --resolve 另一個(gè)CF域名:443:CF的IP https://另一個(gè)CF域名/ curl.exe --noproxy * -4 -sS -o NUL -w Chttp%{http_code}\n --resolve www.cloudflare.com:443:CF的IP https://www.cloudflare.com/參數(shù)解釋參數(shù)含義curl.exe明確調(diào)用真正的 curlPowerShell 里curl是別名參數(shù)不同--resolve 域名:443:IP把域名強(qiáng)行解析到同一 IP唯一變量只剩 SNI-w Ahttp%{http_code}\n輸出帶標(biāo)記的狀態(tài)碼便于區(qū)分三條結(jié)果其余參數(shù)強(qiáng)制直連、強(qiáng)制 IPv4、靜默保留錯(cuò)誤、丟棄正文判讀A你的域名B同類域名C干凈域名結(jié)論000200200A 的 SNI 被針對性封鎖000000200該 IP 整體有問題000000000本機(jī)網(wǎng)絡(luò)出口有問題200200200全部正常6. 通用測試模板修改位置已標(biāo)中文強(qiáng)制 IPv4 / IPv6curl -sk4 --max-time 10 --noproxy * -o NUL -w forced IPv4: HTTP:%{http_code} IP:%{remote_ip}\n https://要測的域名/ curl -sk6 --max-time 10 --noproxy * -o NUL -w forced IPv6: HTTP:%{http_code} IP:%{remote_ip}\n https://要測的域名/參數(shù)解釋-4只查 A 記錄只走 IPv4-6只查 AAAA 記錄只走 IPv6都是硬性限定、失敗不會(huì)回退其余參數(shù)同上%{remote_ip}可驗(yàn)證是否真走了指定地址族。指定 IP 繞過 DNScurl -sk --max-time 10 --noproxy * --resolve 要測的域名:443:IPv4地址 -o NUL -w HTTP:%{http_code} IP:%{remote_ip}\n https://要測的域名/ curl -sk --max-time 10 --noproxy * --resolve 要測的域名:443:[IPv6地址] -o NUL -w HTTP:%{http_code} IP:%{remote_ip}\n https://要測的域名/參數(shù)解釋--resolve 域名:443:IP不查 DNS、直接把解析結(jié)果寫死為指定 IPIPv6 地址要加方括號(hào)其余參數(shù)同上。指定 IP 并強(qiáng)制地址族curl -sk4 --max-time 10 --noproxy * --connect-to 要測的域名:443:IPv4地址:443 -o NUL -w HTTP:%{http_code} IP:%{remote_ip}\n https://要測的域名/ curl -sk6 --max-time 10 --noproxy * --connect-to 要測的域名:443:[IPv6地址]:443 -o NUL -w HTTP:%{http_code} IP:%{remote_ip}\n https://要測的域名/參數(shù)解釋--connect-to 域名:443:IP:443在 TCP 層把撥號(hào)目標(biāo)換成指定 IP但 SNI / Host 仍是原域名疊加-4/-6同時(shí)鎖定地址族是嚴(yán)格程度最高的對照寫法。7. IPv6 本地地址 ≠ 公網(wǎng) IPv6 出口IPv6 地址按用途分為幾類類型前綴能否訪問公網(wǎng)鏈路本地地址fe80::/10? 只在同一局域網(wǎng)內(nèi)通信唯一本地地址fc00::/7常見fd00::/8? 類似 IPv4 私網(wǎng)地址全球單播地址2000::/3? 真正的公網(wǎng) IPv6ipconfig里看到fe80::開頭的鏈路本地地址或 VMware/VirtualBox 虛擬網(wǎng)卡分配的 IPv6并不代表本機(jī)能訪問 AAAA-only 網(wǎng)站因?yàn)檫@些地址只在本地網(wǎng)段有效無法穿過路由器到達(dá)公網(wǎng)。真正能用的 IPv6 必須同時(shí)滿足① 屬于全球單播地址2xxx::或3xxx::開頭② 運(yùn)營商或上級(jí)網(wǎng)絡(luò)確實(shí)把 IPv6 流量路由到公網(wǎng)。判斷標(biāo)準(zhǔn)curl -sk6 --noproxy * https://v6.ident.me/參數(shù)解釋-6強(qiáng)制只走 IPv6-s靜默-k跳過證書校驗(yàn)--noproxy *強(qiáng)制直連。能返回 200 才說明本機(jī)可以訪問 AAAA-only 網(wǎng)站。8. DNS 查詢命令通用版nslookup -typeA 要查的域名 nslookup -typeAAAA 要查的域名 nslookup -typeA 要查的域名 1.1.1.1 nslookup -typeAAAA 要查的域名 1.1.1.1參數(shù)解釋參數(shù)含義-typeA只查 A 記錄IPv4 地址-typeAAAA只查 AAAA 記錄IPv6 地址最后的 IP指定使用的 DNS 服務(wù)器不寫則用本機(jī)默認(rèn)結(jié)果正常返回對應(yīng) IP提示沒有可以使用的 address (A)記錄則說明無 A 記錄AAAA 同理。為什么要指定公共 DNS本地 DNS 可能被污染、緩存錯(cuò)誤或劫持換1.1.1.1/8.8.8.8/223.5.5.5等公共 DNS 再查一次情況結(jié)論結(jié)果一致域名記錄本身就是這樣結(jié)果不一致本地 DNS 有問題