桂林 吳夢(mèng)龍
筆者單位開發(fā)刀片式服務(wù)器系統(tǒng),系統(tǒng)包括:1 塊服務(wù)器板卡(S)、2 塊客戶端板卡(C1、C2)、1 塊交換機(jī)板卡(SW1),拓?fù)淙鐖D1 所示。
圖1 原始機(jī)箱內(nèi)部拓?fù)?/p>
服務(wù)器采用S3C2440 處理器Linux系統(tǒng)、客戶端板卡采用STM32F107 處理器RTThread 系統(tǒng),交換機(jī)采用RTL8316 交換芯片無網(wǎng)管功能。系統(tǒng)工作在同一沖突域下。兩個(gè)客戶端板卡與服務(wù)器點(diǎn)對(duì)點(diǎn)連接、客戶端板卡之間沒有數(shù)據(jù)交換。
當(dāng)僅插入板卡S、SW1、C1時(shí)工作正常,若插入C2 則會(huì)在系統(tǒng)啟動(dòng)1 分鐘后隨機(jī)出現(xiàn)C1、C2 其中一個(gè)掉線,客戶端報(bào)告原因是“服務(wù)器心跳超時(shí)”,而在服務(wù)器上抓包顯示所有數(shù)據(jù)均已下發(fā),服務(wù)器每10 秒發(fā)送一次標(biāo)準(zhǔn)TCP KeepAlive 心跳包。
為分析客戶端上實(shí)際收發(fā)的數(shù)據(jù)幀,考慮采用端口鏡像(Port Mirroring)的方法截取來往數(shù)據(jù)。
端口鏡像功能在交換機(jī)或路由器上,將一個(gè)或多個(gè)源端口的數(shù)據(jù)流量轉(zhuǎn)發(fā)到某一個(gè)指定端口來實(shí)現(xiàn)對(duì)網(wǎng)絡(luò)的監(jiān)聽,指定端口稱之為“鏡像端口”或“目的端口”,在不嚴(yán)重影響源端口正常吞吐流量的情況下,可以通過鏡像端口對(duì)網(wǎng)絡(luò)的流量進(jìn)行監(jiān)控分析。在企業(yè)中用鏡像功能,可以很好地對(duì)企業(yè)內(nèi)部的網(wǎng)絡(luò)數(shù)據(jù)進(jìn)行監(jiān)控管理,在網(wǎng)絡(luò)出故障的時(shí)候,可以快速地定位故障。
因?yàn)樗邪蹇ň逶跈C(jī)箱內(nèi)采用264公頭彎針代替RJ45連接,不便于修改網(wǎng)絡(luò)拓?fù)洌y以滿足抓取客戶端網(wǎng)口上的收發(fā)數(shù)據(jù)。為此,需制作264 公頭彎針轉(zhuǎn)RJ45 接頭連接各板卡,另外添加一臺(tái)帶端口鏡像功能的H3C 交換機(jī)。
圖2 修改后的拓?fù)?/p>
SW1 是原系統(tǒng)交換機(jī),SW2 是H3C 交換機(jī),PC 是用于監(jiān)聽流經(jīng)SW2 鏡像的數(shù)據(jù)。S 和C1 連接在S1 的端口1、2 上、C2 連接在SW2 端口2 上、SW1的3 端口與SW2 的3端口相連,PC 連接在SW2 的1 端口上,如圖2 所示。
IP 分配:
S:192.168.0.254/24
C1:192.168.0.5/24
C2:192.168.0.20/24
網(wǎng)關(guān)都是192.168.0.1;PC:192.168.1.2/24 網(wǎng)關(guān)是192.168.1.1。
SW2 交換機(jī)業(yè)務(wù)配置:端口1、2 屬于VLAN2:192.168.0.1;端口3 屬于VLAN2:192.168.1.1;在端口3 上配置端口鏡像,將端口1、2 的收發(fā)數(shù)據(jù)均轉(zhuǎn)發(fā)到端口3 上。
配置VLAN 的目的是防止外部網(wǎng)絡(luò)廣播數(shù)據(jù)對(duì)調(diào)試網(wǎng)絡(luò)的影響,設(shè)置端口鏡像的目的是能夠間接在PC 上抓取S 和C2 的流量,確認(rèn)S 是否真發(fā)送數(shù)據(jù),C2 是否真沒收到數(shù)據(jù)。
PC 通過SSH 登錄S 和C2,輸入“netstat”觀察連接狀態(tài)看到只有C2 的IP 與S 連接,S 發(fā)送心跳能成功被PC 抓取到,C2 運(yùn)行良好;開啟C1 后S 上能看到C2 的IP,S 上兩個(gè)連接狀態(tài)都是ESTABLISHED;S 向兩連接發(fā)送心跳,再此期間PC 抓取不到任何從S 流經(jīng)C2 方向的數(shù)據(jù),1 分鐘后PC 抓取到從C2 流經(jīng)S 方向“斷開連接”數(shù)據(jù)幀,原因是“服務(wù)器心跳超時(shí)”。
由以上現(xiàn)象推斷問題可能是SW1 轉(zhuǎn)發(fā)錯(cuò)誤或S 未發(fā)送數(shù)據(jù)。
C2 上有30 秒自動(dòng)重連接機(jī)制,但都直至4~5 分鐘才能連接成功。當(dāng)C2 發(fā)起重連接成功之后,PC 收到一條S 流經(jīng)C1 的心跳數(shù)據(jù)。
由此推斷問題出在SW1 上,按照以太網(wǎng)的最短路由設(shè)計(jì),S 和C1 都是SW1 的直連網(wǎng)絡(luò),他們之間的流量不應(yīng)該通過端口3 發(fā)往SW2。
通過Wireshark 查看數(shù)據(jù)幀,發(fā)現(xiàn)S 流經(jīng)C1 和S 流 經(jīng)C2 數(shù) 據(jù)幀目的MAC 地址都是00:80:E1:33:38:33。
由此確認(rèn)是C1 和C2 的MAC 地址綁定沖突,如圖3、圖4 所示。
圖3 C1:192.168.0.5 的MAC
圖4 C2:192.168.0.20 的MAC
STM32F107 處理器芯片自身攜帶有9 字節(jié)表示序列號(hào),MAC 地址僅需要6字節(jié),于是驅(qū)動(dòng)設(shè)計(jì)者截取部分序列號(hào)作為MAC 地址,截取部分恰好是序列號(hào)高6 字節(jié),如兩芯片序列號(hào)是01:02:03:04:05:06:07:08:09 和01:02:03:04:05:06:07:08:0A,則MAC 地址都是01:02:03:04:05:06。解決方法只要選擇低6 字節(jié)即可。
原系統(tǒng)拓?fù)渖想姾驝2 發(fā)起ARP 請(qǐng)求,包含它的IP2 和MAC-a。SW1 和S 收到后有不同的動(dòng)作:SW1 更新MAC-a 在端口3 方向,S 在自己的ARP 表里添加記錄IP2和MAC-a 映射關(guān)系。
接著C1 發(fā)起ARP 請(qǐng)求,包含它的IP1 和MAC-a,SW1更新MAC-a 在端口2 方向,S的ARP 表添加IP1 和MAC-a映射關(guān)系。
倘若S 向C2 發(fā)送心跳數(shù)據(jù),數(shù)據(jù)幀目的MAC 地址是MAC-a,目 的IP 是IP2。SW1收到數(shù)據(jù)后在MAC 地址表里尋找MAC-a 對(duì)應(yīng)的端口,由于最后一次ARP 請(qǐng)求是由C1發(fā)起的,C1 刷新SW1 中MAC地址表,最終SW1 將數(shù)據(jù)發(fā)往端口2,由于C1 的IP 并不是數(shù)據(jù)幀期望的IP2 不匹配,所以C1 丟棄數(shù)據(jù)幀,而C2將長(zhǎng)時(shí)間收不到S 的數(shù)據(jù),出現(xiàn)“服務(wù)器心跳超時(shí)”斷開連接。
ARP 表默認(rèn)5 分鐘后過期,也就是為什么C2 斷開后10 秒重連接失敗的原因,直至4~5 分鐘ARP 表過期重發(fā)起ARP 請(qǐng)求,刷新SW1 的MAC地址表才連接成功。C1 和C2 的MAC 沖突屬于競(jìng)爭(zhēng)模式,相互刷新SW1 的MAC 地址表和S 的ARP 表,帶來的結(jié)果是不定時(shí)掉線。