我正在開發一個在Windows機器上的2個網絡接口之間執行NAT的應用程序,並且我對於發生了什麼感到有點問題。NAT的實現
有在系統2個的網絡接口:
- 物理網絡接口(00:0℃:29:BC:4C:11 192.168.133.130),其使用作爲網關零時50分56秒: eb:f5:15 - 192.168.133.2(由VMware運營)
- 我的應用程序使用的虛擬TAP網絡接口(00:ff:15:08:ac:26 192.168.200.100)用作網關03:03 :03:03:03:03 - 192.168.200.1(由我的應用程序運行)
我的應用程序做什麼:
個- 響應ARP請求,192.168.200.1(虛擬網關)
- 進行一到一個NAT的TAP接口和物理之間的一個ICMP,UDP和TCP
爲了證明什麼繼續我在測試過程中附加了.cap file與Microsoft Network Monitor 3.4(它也可以用Wireshark打開)捕獲的數據包。該測試包括與google.com:80建立TCP連接。首先直接通過物理接口建立連接以證明存在互聯網連接,然後通過TAP接口建立連接以測試NAT。
分組分析從上到下:
- 1 - 從google.com接收通過物理如果 TCP SYN-ACK - TCP SYN直接通過物理接口
- 2發送到google.com
- 3 - TCP ACK通過物理如果 發送到google.com
- 4 - TCP RST-ACK通過物理髮送到google.com如果,收連接
所有的好,我們有互聯網連接。現在我改變默認網關爲虛擬路由器通過我的應用程序(192.168.200.1)操作
- 5 - 視窗注意到默認網關更改爲192.168.200.1,併發送一個ARP請求,192.168.200.1
- 6 - 我的應用響應:192.168.200.1在03:03:03:03:03:03
- 7 - TCP SYN通過TAP接口(192.168.200.100)發送到google.com到虛擬路由器(192.168。 200.1)
- 8 - 我的應用程序對數據包執行NAT(源和目標MAC地址相應更改,IP源地址更改爲192.168.133.130),並將數據包發送到物理cal接口00:50:56:eb:f5:15(192.168.133。2)
- 10 - 無響應中接收到,所以第二TCP SYN上TAP如果
- 10發送 - 我的應用程序執行NAT相同的方式,併發送所述物理如果
- 11的分組 - 再次沒有反應,這樣的第三嘗試
- 12 - 我的應用程序以相同的方式執行NAT
後NAT,即在物理接口上發送的分組,是幾乎相同的所述一個在所述第一測試發送網絡拓撲中沒有任何變化。爲什麼第二個TCP連接不成功?這沒有任何意義。
該程序使用WinPcap。如果感興趣,Here是代碼。
測試應用程序正在使用Ws2_32 \ socket和Ws2_32 \連接WinAPI函數來建立TCP連接。之後,測試應用程序關閉,套接字死亡,Windows發送RST。雖然這不是問題..我可以使用物理if運行2次連續的成功測試。由於這是一對一的NAT(現在),所以端口沒有被轉換,所以只有IP被修改,TCP沒有被修改。 – Chris
嘿!問題是你沒有重新計算TCP校驗和!兩個SYN消息(第7幀和第8幀)具有相同的TCP校驗和。如果IP地址改變,則TCP校驗和必須改變。我會編輯我的回覆。 – rodolk
你是對的!我在Wireshark中啓用了「TCP checksum validation」,數據包8中有一個無效的TCP校驗和。但爲什麼? TCP數據包沒有改變,TCP校驗和只包含TCP頭和數據。 TCP校驗和是否也包含IP頭? – Chris