作者:old wolf 大家好,我是 “老狼”,曾經(jīng)也算文藝青年一枚。無(wú)奈,一入IT深似海,只是一個(gè)轉(zhuǎn)身,就完成了從文藝青年到IT狗的華麗變身。 言歸正傳,今天要和大家分享的內(nèi)容是關(guān)于一個(gè)端口映射問(wèn)題真實(shí)案例,我們知道端口映射不成功問(wèn)題經(jīng)常遇到,這次為了正經(jīng)且系統(tǒng)帶引大家學(xué)習(xí)映射問(wèn)題排查,我將通過(guò)引入身邊一個(gè)真實(shí)案例對(duì)話,層層深入剖析映射問(wèn)題癥結(jié),希望能給大家提供一些啟示及幫助。 Ok,話不多說(shuō),我們開(kāi)始吧。 一、 什么場(chǎng)景會(huì)用到端口映射——情景 為了講清問(wèn)題,我們有必要提前了解一下什么場(chǎng)景會(huì)用到端口映射及幾個(gè)基礎(chǔ)概念。 首先是NAT(Network Address Translation)全稱(chēng)網(wǎng)絡(luò)地址轉(zhuǎn)換。詳細(xì)概念介紹建議百度。簡(jiǎn)單來(lái)講就是在持有私網(wǎng)地址的主機(jī)想和公網(wǎng)的地址通信的時(shí)候需要使用到的公網(wǎng)和私網(wǎng)的地址互換的技術(shù)。我們都知道IPv4路由是區(qū)分公網(wǎng)地址和私網(wǎng)地址的,私網(wǎng)地址在公網(wǎng)是沒(méi)有路由的,那這個(gè)時(shí)候擁有私網(wǎng)地址的主機(jī)想要和公網(wǎng)的主機(jī)通信,這個(gè)技術(shù)是必不可少的。 其次是端口映射 圖(1) 如上圖所示,PC位于外網(wǎng),某服務(wù)器(如web服務(wù)器)位于內(nèi)網(wǎng)。但由于IP地址已經(jīng)耗盡的問(wèn)題,整個(gè)網(wǎng)絡(luò)只分配了一個(gè)外網(wǎng)IP地址。出口路由器屬于內(nèi)網(wǎng),用于連接外網(wǎng)。PC要訪問(wèn)到內(nèi)網(wǎng)的服務(wù)器,需要在出口路由器上開(kāi)啟NAPT(端口映射)功能,即針對(duì)web服務(wù)提供的端口進(jìn)行端口映射。 端口映射其實(shí)就是一種內(nèi)網(wǎng)服務(wù)器對(duì)外開(kāi)放的一種網(wǎng)絡(luò)地址轉(zhuǎn)換,其實(shí)轉(zhuǎn)換的原理就是當(dāng)訪問(wèn)公網(wǎng)某個(gè)地址的某個(gè)端口的時(shí)候由NAT設(shè)備將目的地址轉(zhuǎn)換為要訪問(wèn)的內(nèi)網(wǎng)服務(wù)器的地址,并轉(zhuǎn)發(fā)給內(nèi)網(wǎng)服務(wù)器,等待內(nèi)網(wǎng)服務(wù)器報(bào)文返回到對(duì)應(yīng)的接口的時(shí)候再根據(jù)之前的會(huì)話轉(zhuǎn)換回之前的報(bào)文。 二、 迷失的映射報(bào)文 話說(shuō)前些天五一小假期,小王好容易借著疫情常態(tài)化的契機(jī)出去踏個(gè)青,晚上回來(lái)累的不行,早早的洗洗就睡了。結(jié)果半夜一點(diǎn)多睡的正香的時(shí)候就被好機(jī)油(小李)的電話吵醒了,于是有了下面對(duì)話…… 圖(2) 此時(shí)的小王睡意完全沒(méi)了,你割接苦逼也就罷了,拉著我一起苦逼你就是犯罪了。我這小暴脾氣啊。當(dāng)時(shí)我就開(kāi)噴了:咱倆誰(shuí)跟誰(shuí)啊,別客氣。用的什么設(shè)備???具體情況和我說(shuō)下。 一、 迷失的映射報(bào)文——還原現(xiàn)場(chǎng) 原來(lái)現(xiàn)場(chǎng)用一臺(tái)EG做出口,對(duì)內(nèi)就是核心交換—匯聚—接入—服務(wù)器啦,中間還串了一臺(tái)防火墻!不過(guò)安全策略全放通,直接用接口地址映射內(nèi)網(wǎng)的服務(wù)器。 圖(3) 好機(jī)油說(shuō)這個(gè)映射配置肯定是沒(méi)問(wèn)題,這種配置他配過(guò)很多遍,而且在內(nèi)網(wǎng)測(cè)試過(guò)服務(wù)器業(yè)務(wù),是正常的啊。內(nèi)部的服務(wù)器也可以直接上公網(wǎng),但是就是無(wú)法成功通過(guò)公網(wǎng)地址訪問(wèn)到內(nèi)部服務(wù)器。 就這啊,機(jī)油別怕,so easy ,來(lái)吧,讓我們一步一步work it out! “從公網(wǎng)ping映射的公網(wǎng)地址通嗎” “可以通啊” “Ok,連通性排除,服務(wù)器也沒(méi)問(wèn)題” “修改映射的外網(wǎng)端口測(cè)試是否正常?” “不可以!還是沒(méi)法訪問(wèn)” “Ok,運(yùn)營(yíng)商封端口問(wèn)題可以排除!” “核心交換機(jī)方便流量統(tǒng)計(jì)或者鏡像抓包嗎,看下有沒(méi)有轉(zhuǎn)換報(bào)文從防火墻上核心,看下問(wèn)題到底和防火墻有沒(méi)有關(guān)系?” “抓過(guò)了,有報(bào)文!” “OK,基本可以排除防火墻問(wèn)題?!?br> “現(xiàn)場(chǎng)有沒(méi)有多出口環(huán)境?” “有啊。聯(lián)通一個(gè),電信一個(gè),兩個(gè)出口?!?/p> 哈哈,聽(tīng)到這里,小王放肆的笑了 “問(wèn)題應(yīng)該找到了,是不是來(lái)回路徑不一致導(dǎo)致的? 有沒(méi)有保證映射的回程數(shù)據(jù)流還從對(duì)應(yīng)的接口回去???” “你高興的太早了老鐵,接口下開(kāi)啟了reverse-path(源進(jìn)源出)這個(gè)情況應(yīng)該會(huì)來(lái)回一致吧?!” 哎呦我去,這自信的,突然閃了老子的腰。險(xiǎn)些裝逼失敗,沒(méi)關(guān)系,next,老紙要放大招了。 “來(lái),幫我收個(gè)NAT 轉(zhuǎn)換的流信息瞅瞅吧。先來(lái)看看NAT這步到底有沒(méi)有什么問(wèn)題。 先開(kāi)啟下登錄軟件的記錄會(huì)話,然后cli敲: 1. show ip fpm modules | i FLOW-AUDIT 2.show ip fpm pri filter x(x為第一步驟收集索引號(hào))0 x.x.x.x(訪問(wèn)外網(wǎng)ip) 32 0.0.0.0 32 2.show ip fpm flow filter 0 x.x.x.x(訪問(wèn)外網(wǎng)ip) 32 0.0.0.0 32 3.同時(shí)在EG端和服務(wù)器分別抓包 “好的,馬上收好發(fā)給你?!?/p> 四、 迷失的映射報(bào)文——破迷 下面我們對(duì)收集這幾個(gè)信息詳細(xì)解讀下,看看他們作用是什么: 首先先稍微解釋下,收集兩個(gè)命令作用: 先show ip fpm modules | i FLOW-AUDIT—用來(lái)查看流量審計(jì)的業(yè)務(wù)號(hào)(左側(cè)第一列,如本案例為10) 2 show ip fpm pri filter 10 0 x.x.x.x(訪問(wèn)外網(wǎng)ip) 32 0.0.0.0 32—用來(lái)收集數(shù)據(jù)包選路路徑是否正確(如從WAN口接口到數(shù)據(jù)包后是否從正確LAN口轉(zhuǎn)發(fā),來(lái)回轉(zhuǎn)發(fā)路徑是否正確) 3 show ip fpm flow filter 0 x.x.x.x(訪問(wèn)外網(wǎng)ip) 32 0.0.0.0 32—用來(lái)收集數(shù)據(jù)包流表信息是否正常做了端口轉(zhuǎn)換及轉(zhuǎn)換后數(shù)據(jù)收發(fā)是否正常(一般如果正確轉(zhuǎn)換的話在流信息會(huì)有轉(zhuǎn)換記錄) Ok,那么我們接下來(lái)看看現(xiàn)場(chǎng)收集回來(lái)信息: 首先我們可以看到:外網(wǎng)訪問(wèn)的終端ip(即218.106.154.158)訪問(wèn)映射接口ip(58.x.x.59)時(shí)候,數(shù)據(jù)包轉(zhuǎn)發(fā)來(lái)回路徑確實(shí)沒(méi)問(wèn)題,從WAN3口進(jìn),LAN-Te0/0出,回程數(shù)據(jù)流也沒(méi)問(wèn)題,如下圖: 圖(5) 2 外網(wǎng)觸發(fā)訪問(wèn)時(shí)候,訪問(wèn)的目的地址(即WAN3口的ip),設(shè)備確實(shí)正確做了轉(zhuǎn)換(看括號(hào)里面地址是內(nèi)部服務(wù)器要映射地址),但這里數(shù)據(jù)收發(fā)確實(shí)也有點(diǎn)問(wèn)題(看send和rec列,多次show結(jié)果數(shù)據(jù)未有明顯上漲),如下: 圖(6) 以上兩點(diǎn)測(cè)試可以得出:EG的端口映射配置沒(méi)有問(wèn)題,服務(wù)器頁(yè)面沒(méi)有問(wèn)題,EG上數(shù)據(jù)轉(zhuǎn)發(fā)沒(méi)有問(wèn)題,現(xiàn)象是有點(diǎn)奇怪,繼續(xù)看看報(bào)文: 在服務(wù)器端抓包,能看到正常的http GET報(bào)文到達(dá)到服務(wù)器: 圖(7) 不過(guò)服務(wù)器端收到get報(bào)文之后,有收到一個(gè)rst的重置連接報(bào)文,導(dǎo)致http連接終止。 2 在EG端抓包,也能看到報(bào)文正常到達(dá)EG,并且正常轉(zhuǎn)換之后轉(zhuǎn)發(fā)給內(nèi)網(wǎng)服務(wù)器: 圖(8) 從這里看RST報(bào)文都是訪問(wèn)服務(wù)器的終端發(fā)起來(lái)的,如果是正常的交互過(guò)程不會(huì)有rst的報(bào)文。 從抓包結(jié)果:懷疑是中間運(yùn)營(yíng)商設(shè)備抑制行為導(dǎo)致回應(yīng)RST異常報(bào)文。 五、 迷失的映射報(bào)文——解密 為了證明確實(shí)是運(yùn)營(yíng)商所為,給小李一個(gè)交代,小王趕緊從打開(kāi)電腦在本地電腦終端訪問(wèn)抓了個(gè)包,結(jié)果發(fā)現(xiàn)電腦發(fā)起GET報(bào)文之后,又收到一個(gè)由映射的外網(wǎng)服務(wù)器發(fā)來(lái)的一個(gè)RST報(bào)文!哈哈,果然問(wèn)題出在這里,趕緊給小李解釋了整個(gè)過(guò)程,建議聯(lián)系運(yùn)營(yíng)商協(xié)助排查! 小李持著懷疑的態(tài)度,又做了一個(gè)操作:將電腦模擬運(yùn)營(yíng)商環(huán)境,配置成外網(wǎng)網(wǎng)關(guān)地址,充當(dāng)外網(wǎng)線路進(jìn)行訪問(wèn),是可以正常訪問(wèn),至此基本確認(rèn)是運(yùn)營(yíng)商抑制行為所致。小李趕緊聯(lián)系運(yùn)營(yíng)商更換了個(gè)外網(wǎng)地址后,一試果然好了,連連和小王道謝,說(shuō)這次不但問(wèn)題解決了,還理清了映射問(wèn)題的排查思路,最后還非要請(qǐng)小王吃燒烤呢。 六、 案例經(jīng)驗(yàn)總結(jié) 對(duì)此類(lèi)故障的排查除了關(guān)注配置,更換端口及確認(rèn)現(xiàn)場(chǎng)網(wǎng)絡(luò)環(huán)境以外,很重要是要先弄清楚數(shù)據(jù)轉(zhuǎn)發(fā)路徑,多思考數(shù)據(jù)的走向,可能遇到的問(wèn)題,必要時(shí)候結(jié)合抓包定位分析,一步步排查,從最基本的開(kāi)始,不放過(guò)一個(gè)可能的原因。 通用排查思路如下: 七、 背后技術(shù)原理 01 流表: -EG/NPE設(shè)備底層的一張表,存儲(chǔ)設(shè)備接收以及轉(zhuǎn)發(fā)的數(shù)據(jù)流信息。流表可以記錄數(shù)據(jù)流的源目的地址、源目的端口、發(fā)送和接收的字節(jié)數(shù)、是否做了NAT、NAT前后IP、端口的變化等信息。 -流表是EG/NPE設(shè)備中非常重要的一張表,數(shù)據(jù)處理時(shí)優(yōu)先使用到這張表中已有的數(shù)據(jù)流信息,同時(shí)所有的數(shù)據(jù)轉(zhuǎn)發(fā)的基本信息都會(huì)存儲(chǔ)到這張表中。 命令: show ip fpm flow filter 0(協(xié)議,0表示任意) SrcAddr(源ip) 掩碼 DstAddr (目的ip) 掩碼(推薦用此種方式查看) show ip fpm flow | include x.x.x.x(過(guò)濾的ip地址) -- 10.x/11.x通用(不推薦,流表太大可能會(huì)導(dǎo)致CPU高) 舉例說(shuō)明各個(gè)字段含義: –Pr(協(xié)議):如6是TCP,17是UDP; –SrcAddr(源地址):發(fā)起數(shù)據(jù)包的地址,括號(hào)內(nèi)的地址為NAT后的地址; –DstAddr(目的地址):數(shù)據(jù)包的目的地址,括號(hào)內(nèi)的地址為nat后的地址 –SrcPort(源端口):發(fā)起數(shù)據(jù)包的源端口信息,括號(hào)內(nèi)為nat后的端口 –DstPort(目的端口):發(fā)起數(shù)據(jù)包的目的端口信息,括號(hào)內(nèi)為nat后的端口 –Vrf:EG只有一個(gè)VRF數(shù)據(jù)都是在VRF0,可以不看; –SendBytes(發(fā)送):以?xún)?nèi)網(wǎng)用戶(hù)來(lái)看就是內(nèi)網(wǎng)用戶(hù)從內(nèi)網(wǎng)發(fā)送到EG設(shè)備的數(shù)據(jù)包總的大小,字節(jié)為單位; –RecvBytes(接收):以?xún)?nèi)網(wǎng)用戶(hù)來(lái)看就是EG設(shè)備上收到外網(wǎng)發(fā)到這個(gè)內(nèi)網(wǎng)IP的數(shù)據(jù)包的總的大小,字節(jié)為單位; –St(流當(dāng)前狀態(tài)):流的狀態(tài)要對(duì)應(yīng)于當(dāng)前的協(xié)議。不同協(xié)議含義不一樣,舉例說(shuō)明如下: 如協(xié)議號(hào):17 udp流 CLOSED 0 連接處于關(guān)閉狀態(tài) STARTED 1 連接發(fā)起狀態(tài) CONNECTED 2 對(duì)方響應(yīng)之后的狀態(tài) ESTABLISHED 3 在對(duì)方響應(yīng)之后連接發(fā)起方又有發(fā)送報(bào)文 如協(xié)議號(hào):1 icmp流 CLOSED 0 連接處于關(guān)閉狀態(tài) STARTED 1 連接發(fā)起狀態(tài) CONNECTED 2 對(duì)方響應(yīng)之后的狀態(tài) –srcif(源接口號(hào)):代表數(shù)據(jù)從那個(gè)接口收到,show interface可以看到接口的編號(hào)對(duì)應(yīng)那個(gè)接口如下,舉例: 流表中srcif對(duì)應(yīng)9,如show interface可以看到9代表TenGigabitEthernet 0/0,10.x無(wú)此功能, 接口顯示“fff”代表設(shè)備自己發(fā)送的數(shù)據(jù),或者是設(shè)備接收并處理的數(shù)據(jù)或者是某個(gè)方向上面未收到報(bào)文的初始值; –================= TenGigabitEthernet 0/0 ======================== – Index(dec):9 (hex):9 –dstif(目的接口號(hào)):代表數(shù)據(jù)從那個(gè)接口轉(zhuǎn)發(fā); –ctrl_flag(流控制字段):無(wú)實(shí)際意義研發(fā)調(diào)試使用 –說(shuō)明:接口顯示“fff”代表設(shè)備自己發(fā)送的數(shù)據(jù),或者是設(shè)備接收并處理的數(shù)據(jù),舉例說(shuō)明: 上面紅色方框內(nèi)的流設(shè)為流1和流2: 流1:設(shè)備自己發(fā)送給114.114.114.114的DNS解析報(bào)文,因設(shè)備自己主動(dòng)發(fā)送這個(gè)報(bào)文,設(shè)備認(rèn)為源端口是自己,顯示為“fff” 流2:10.112(實(shí)驗(yàn)室APM設(shè)備)向EG發(fā)送SNMP報(bào)文,因設(shè)備接收此報(bào)文并直接處理,設(shè)備直接就處理這個(gè)數(shù)據(jù),不需要再通過(guò)任何接口轉(zhuǎn)發(fā),目的端口顯示為“fff” 對(duì)于流表上最前面兩條流,屬于組播數(shù)據(jù),接口顯示為“fff”也是表示本接收或發(fā)送,如源接口是6、目標(biāo)接口是fff,表示是數(shù)據(jù)從編號(hào)6接口收到,設(shè)備本地接收; 02 私有空間: - 除流表之外,EG/NPE底層還開(kāi)辟了部分空間,用于存儲(chǔ)數(shù)據(jù)流處理過(guò)程中除流表外更詳細(xì)的一些信息,如應(yīng)用識(shí)別情況、流控匹配情況等。這部分空間實(shí)際上存在,但對(duì)于用戶(hù)而言是透明的,因此被稱(chēng)為設(shè)備的私有空間。私有空間在設(shè)備中被分成若干塊,每塊記錄不同的數(shù)據(jù)處理內(nèi)容,并通過(guò)私有空間ID進(jìn)行區(qū)分; - 在EG/NPE 10.x平臺(tái)上,因產(chǎn)品限制,私有空間ID和實(shí)際存儲(chǔ)的數(shù)據(jù)內(nèi)容不是一一對(duì)應(yīng),需要根據(jù)版本進(jìn)行區(qū)分;在EG 11.x平臺(tái)上,所有私有空間ID是固定的。 命令: –Show ip fpm mudule(確定選路結(jié)果對(duì)應(yīng)的私有空間ID,不同型號(hào)可能不一樣,以具體show結(jié)果為準(zhǔn)) –show ip fp pri filter x(私有空間ID,可通過(guò)show ip fpm module查看,如1表示查看數(shù)據(jù)流選路方式,10表示數(shù)據(jù)轉(zhuǎn)發(fā)路徑,13表示流控匹配等等) 0(協(xié)議,0表示任意) SrcAddr(源ip) 掩碼 DstAddr (目的ip) 掩碼 示例1:查看數(shù)據(jù)選路方式 ·命令: –show ip fp pri 1 | include x.x.x.x(過(guò)濾的ip地址)或show ip fpm pri filter 1 0(0代表任意協(xié)議) x.x.x.x(x.x.x.x這里代表源ip) 32(掩碼32代表主機(jī)ip) y.y.y.y(y.y.y.y這里代表目的ip) 32(掩碼32代表主機(jī)ip) -- 10.x/11.x通用,查看選路方式 ·需要關(guān)注的字段含義如下: –Ref_ip/rpl表示數(shù)據(jù)通過(guò)什么選路方式走的,如ref_ip代表普通路由選路,rpl代表源進(jìn)源出, pbr代表策略路由,mllb表示多鏈路負(fù)載均衡,dns_proxy代表正向dns代理,app_route代表應(yīng)用路由等,unknown說(shuō)明未匹配選路,一般到本地或被丟棄; –ref_ip(7)/rpl(1) :前面是正向流代表出方向,后面是反向流代表入方向 , 括號(hào)里面數(shù)字表示對(duì)應(yīng)代碼,只是表示順序而已,這里7表示選路出去的路徑,1則表示到內(nèi)網(wǎng)的路徑,如1:ref/4:rpl/5:dns/6:app_route –25/3747,前面是數(shù)據(jù)流出方向接口索引id(出接口),后面是數(shù)據(jù)流入方向接口索引id(入接口),可通過(guò)命令show ip ref adj或show ip ref route確定實(shí)際流出入接口,如上圖所示,該流出接口為T(mén)e0/1,入接口為Gi0/0。 示例2:確定選路轉(zhuǎn)發(fā)路徑匹配情況(11.x) ·命令: –show ip fpm module找到對(duì)應(yīng)的索引id和name(左邊前兩列,如本例10為數(shù)據(jù)轉(zhuǎn)發(fā)路徑),然后通過(guò)命令show ip fpm priv xx(module id)| include x.x.x.x(過(guò)濾具體ip)或show ip fpm pri filter 10 0(0代表任意協(xié)議) x.x.x.x(x.x.x.x這里代表源ip) 32(掩碼32代表主機(jī)ip) y.y.y.y(y.y.y.y這里代表目的ip) 32(掩碼32代表主機(jī)ip) 說(shuō)明:需要注意的是這里的module id是動(dòng)態(tài)的,以實(shí)際show結(jié)果為準(zhǔn)。 ·各需要關(guān)注的字段含義如下: –Ori:srcif-dif(源-目的接口號(hào)):代表原始數(shù)據(jù)流從源接口(Gi0/3)收到,往目的接口(Gi0/4)轉(zhuǎn)發(fā)出去; –Rep:srcif-dif(源-目的接口號(hào)):代表回程數(shù)據(jù)流從源接口(Gi0/4)收到,往目的接口(Gi0/3)轉(zhuǎn)發(fā)出去; –Up_if:出接口 寫(xiě)在最后 目前遇到的外網(wǎng)無(wú)法訪問(wèn)映射服務(wù)器的故障,基本上這一套“組合拳”下來(lái),大部分的映射問(wèn)題都可以解決啦。伴著好機(jī)油的道謝和燒烤到手,本來(lái)這一波分享就結(jié)束了,但是最后還是友情奉送下史上最全故障排查“殺手锏”: |
|
來(lái)自: 新用戶(hù)83231301 > 《IT運(yùn)維》