2014-01-22 35 views
1

我正在開發一個在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 fileMicrosoft 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是代碼。

回答

1

我檢查了捕獲的文件,我沒有看到TCP層和MAC層頭(在成功的SYN和不成功的頭之間)有任何區別。只有我看到,在成功的SYN中,IP頭校驗和爲0,可能是因爲計算被卸載到接口卡。在不成功的SYN中,根據Wireshark計算並校正校驗和。如果校驗和正確,這應該不成問題。這是我在IP層看到的唯一區別。

我會說谷歌或中間的某個人正在篩選出你的下一條消息。

現在,我奇怪的是,當你的應用程序關閉流索引0中的套接字時,它發送的是RST而不是FIN。也許有些節點試圖阻止來自您IP地址的RST攻擊?有沒有辦法關閉套接字併發送[FIN,ACK]消息?在進行第二次測試之前,您能等待更多時間嗎?

其他奇怪的是,在第二次測試中,連接192.168.200.100-您的應用(03:03:03:03:03:03)和「您的應用」--Google使用相同的源端口49181。這似乎是一個問題,因爲這是兩臺不同的機器,但我會把它作爲最後一個資源進行調查。但我認爲這不是問題。

編輯:

後您解釋TCP段移交未修改我意識到這個問題是你不重新計算TCP校驗!兩個SYN消息(第7幀和第8幀)具有相同的TCP校驗和。如果IP地址改變,則TCP校驗和必須改變。

順便說一句,這是一個非常有趣的問題來看看。

+0

測試應用程序正在使用Ws2_32 \ socket和Ws2_32 \連接WinAPI函數來建立TCP連接。之後,測試應用程序關閉,套接字死亡,Windows發送RST。雖然這不是問題..我可以使用物理if運行2次連續的成功測試。由於這是一對一的NAT(現在),所以端口沒有被轉換,所以只有IP被修改,TCP沒有被修改。 – Chris

+1

嘿!問題是你沒有重新計算TCP校驗和!兩個SYN消息(第7幀和第8幀)具有相同的TCP校驗和。如果IP地址改變,則TCP校驗和必須改變。我會編輯我的回覆。 – rodolk

+0

你是對的!我在Wireshark中啓用了「TCP checksum validation」,數據包8中有一個無效的TCP校驗和。但爲什麼? TCP數據包沒有改變,TCP校驗和只包含TCP頭和數據。 TCP校驗和是否也包含IP頭? – Chris