試端口與接口調(diào)用關(guān)系)
目錄為什么端口通了接口調(diào)用依然失敗1. 應(yīng)用監(jiān)聽(tīng)的是 IP不是 0.0.0.0最常見(jiàn)2. TCP 端口起來(lái)了但應(yīng)用程序還沒(méi)就緒3. 應(yīng)用層協(xié)議校驗(yàn)失敗4. 鑒權(quán)、白名單、限流、路由攔截5. 連接可以建立但數(shù)據(jù)包會(huì)被丟棄 / 重置6. 數(shù)據(jù)庫(kù)類端口額外坑對(duì)比不同工具的驗(yàn)證層級(jí)實(shí)操建議面試精簡(jiǎn)版回答telnet 能通端口只能證明網(wǎng)絡(luò)層 傳輸層通了IP 可達(dá)、TCP 端口監(jiān)聽(tīng)、防火墻放行不能證明上層應(yīng)用接口能正常調(diào)用。簡(jiǎn)單分層理解telnet 工作在TCP 層只做一件事建立 TCP 三次握手。握手成功就顯示連通。HTTP/HTTPS、Dubbo、自定義 API 接口是應(yīng)用層協(xié)議在 TCP 之上。TCP 通 ≠ 應(yīng)用協(xié)議正常。為什么端口通了接口調(diào)用依然失敗1. 應(yīng)用監(jiān)聽(tīng)的是 IP不是 0.0.0.0最常見(jiàn)服務(wù)只綁定127.0.0.1本機(jī)回環(huán)地址在服務(wù)器本機(jī)telnet 127.0.0.1 8080可以連通外部機(jī)器 telnet 服務(wù)器公網(wǎng) IP:8080 連不上反過(guò)來(lái)還有一種坑服務(wù)器監(jiān)聽(tīng) 0.0.0.0端口能 telnet 通但應(yīng)用只允許本機(jī) / 內(nèi)網(wǎng) IP 訪問(wèn)接口。TCP 握手成功但應(yīng)用收到請(qǐng)求直接拒絕 HTTP 調(diào)用。2. TCP 端口起來(lái)了但應(yīng)用程序還沒(méi)就緒比如 SpringBoot端口由底層 socket 先監(jiān)聽(tīng)端口 open 了但是 Spring 上下文還沒(méi)完全加載完畢telnet 能連上但是發(fā) HTTP 請(qǐng)求直接返回 503 / 連接重置接口不可用現(xiàn)象端口監(jiān)聽(tīng)成功應(yīng)用還在初始化。TCP 就緒早于應(yīng)用就緒。3. 應(yīng)用層協(xié)議校驗(yàn)失敗telnet 只建立裸 TCP 連接不會(huì)發(fā)送合法的應(yīng)用報(bào)文HTTP 接口telnet 通但你隨便發(fā)一串字符服務(wù)端直接斷開(kāi)必須發(fā)送符合 HTTP 協(xié)議的 GET/POST 請(qǐng)求才會(huì)正常響應(yīng)HTTPStelnet 443 端口可以通但 telnet 本身不支持 TLS 握手你用 telnet 訪問(wèn) https 接口會(huì)失敗要用openssl s_client -connect host:443Dubbo、gRPC都是自定義二進(jìn)制協(xié)議TCP 通但隨便發(fā)文本直接報(bào)錯(cuò)4. 鑒權(quán)、白名單、限流、路由攔截TCP 握手成功防火墻放行但是應(yīng)用層攔截接口只允許內(nèi)網(wǎng) IP你的客戶端 IP 不在白名單需要 token/cookie不帶就 401/403Nginx 網(wǎng)關(guān)路由配置錯(cuò)誤端口通但路徑不存在 404限流熔斷請(qǐng)求進(jìn)來(lái)直接拒絕這些都屬于應(yīng)用層邏輯TCP 握手階段完全不會(huì)感知。5. 連接可以建立但數(shù)據(jù)包會(huì)被丟棄 / 重置防火墻 / 安全組只放行 TCP 握手后續(xù)應(yīng)用報(bào)文被 IPS、WAF 攔截服務(wù)端連接數(shù)滿新建 TCP 連接可以短暫建立但是應(yīng)用無(wú)法處理請(qǐng)求很快 RST 斷開(kāi)負(fù)載均衡端口健康檢查只是 TCP 檢查后端實(shí)例已經(jīng)掛了但 LB 依然把端口暴露為可連接6. 數(shù)據(jù)庫(kù)類端口額外坑MySQL 3306、Redis 6379 telnet 能連上端口但是賬號(hào)密碼錯(cuò)誤數(shù)據(jù)庫(kù)只允許指定賬號(hào)的主機(jī)訪問(wèn)redis 開(kāi)啟了密碼認(rèn)證 TCP 連接成功但是業(yè)務(wù)調(diào)用失敗。對(duì)比不同工具的驗(yàn)證層級(jí)工具驗(yàn)證層級(jí)能說(shuō)明什么telnet / nc -zvTCP 傳輸層IP 可達(dá)端口監(jiān)聽(tīng)防火墻放行curl / wgetHTTP 應(yīng)用層TCP 正常 HTTP 協(xié)議正常 基礎(chǔ)路由可達(dá)postman / 代碼 http 請(qǐng)求業(yè)務(wù)層HTTP 正常 鑒權(quán)、參數(shù)、業(yè)務(wù)邏輯正常實(shí)操建議先用telnet/nc排查網(wǎng)絡(luò)連通性網(wǎng)絡(luò)、防火墻、端口監(jiān)聽(tīng)再用curl http://ip:port/xxx驗(yàn)證應(yīng)用層接口HTTPS 用curl -k https://ip:port/xxx非 HTTP 接口Dubbo 等要用對(duì)應(yīng)客戶端測(cè)試不能靠 telnet面試精簡(jiǎn)版回答telnet 測(cè)試端口成功僅代表 TCP 三次握手能夠完成證明 IP 可達(dá)、目標(biāo)端口存在監(jiān)聽(tīng)、網(wǎng)絡(luò)防火墻沒(méi)有攔截 TCP 流量。 接口調(diào)用屬于應(yīng)用層行為依賴應(yīng)用協(xié)議、服務(wù)上下文、鑒權(quán)、網(wǎng)關(guān)路由、業(yè)務(wù)權(quán)限等一系列上層邏輯。TCP 連通不代表應(yīng)用程序可以正常處理業(yè)務(wù)請(qǐng)求因此端口通不能證明接口可調(diào)用。