現象:
生產環境中有兩台服務器A、B,A服務器實時有報文發往B服務器。為了在測試環境測試新功能,故在現網A服務器上tcpdump抓取發往B服務器的報文,然后在測試環境tcprewrite重寫目標IP和端口進行重放。在測試環境中報文在A1服務器上進行tcpreplay重放發往B1服務器,此時在B1服務器的對應端口能抓取到對應的報文,但是B1服務器上的應用程序始終收不到包。
分析:
查看了網上的文檔,大多說的是因為iptables將報文拒絕導致,但是我的測試環境並沒有開啟iptables。后發現有文章提到可能是報文校驗和錯誤引起,故進行嘗試。
將生產環境抓下來的原始報文用wireshark打開,並打開報文校驗和的顯示項,具體參考:https://blog.csdn.net/qq_31664899/article/details/89946151
果然發現udp報文校驗和有錯誤,原因是我們抓下來的包還未進行校驗和計算,只有當包在網卡上真實發送的時候由網卡計算。可參考:https://www.cnblogs.com/charlieroro/p/11363336.html
解決:
在生產環境目標端服務器B上進行抓包,然后再將報文拿到測試環境進行重寫並重放就可以解決。或者還用是之前在A上抓的包,只不過在tcprewrie時加上參數--fixcsum,重新計算校驗和,然后再重放也可以解決。