NAT实施

时间:2014-01-22 11:21:02

标签: networking tcp network-programming nat winpcap

我正在开发一个在Windows机器上的2个网络接口之间执行NAT的应用程序,我有一个问题可以理解正在发生的事情。

系统中有2个网络接口:

  • 用作网关的物理网络接口(00:0c:29:bc:4c:11 192.168.133.130)00: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(运行通过我的应用程序)

我的应用做了什么:

  • 响应对192.168.200.1(虚拟网关)的ARP请求
  • 在TAP接口和物理接口之间执行ICMP,UDP和TCP的一对一NAT

为了演示发生了什么,我在测试期间附加了.cap file Microsoft Network Monitor 3.4抓取的数据包(也可以用Wireshark打开)。测试包括与google.com:80建立TCP连接。首先,通过物理接口直接建立连接,以证明存在互联网连接,然后通过TAP接口建立连接以测试NAT。

从上到下的数据包分析:

  • 1 - 直接通过物理接口发送到google.com的TCP SYN
  • 2 - 通过物理if
  • 从google.com收到TCP SYN-ACK
  • 3 - 通过物理if
  • 发送到google.com的TCP ACK
  • 4 - TCP RST-ACK通过物理if发送到google.com,以关闭连接

一切都很好,我们有互联网连接。现在我将默认网关更改为我的应用程序运行的虚拟路由器(192.168.200.1)

  • 5 - Windows注意到默认网关已更改为192.168.200.1并向192.168.200.1发送ARP请求
  • 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)并将物理接口上的数据包发送到00:50:56:eb: f5:15(192.168.133.2)
  • 9 - 未收到任何响应,因此如果
  • ,则在TAP上发送第二个TCP SYN
  • 10 - 我的应用程序以相同的方式执行NAT并在物理上发送数据包if
  • 11 - 再没有回应,所以第三次尝试
  • 12 - 我的应用程序以相同的方式执行NAT

在NAT之后,在物理接口上发送的数据包几乎与第一次测试中发送的数据包相同,并且网络拓扑中没有任何更改。为什么第二个TCP连接不成功?这没有任何意义。

程序正在使用WinPcap。 Here是感兴趣的代码。

1 个答案:

答案 0 :(得分:1)

我已经检查了捕获的文件,但我没有看到TCP级别和MAC层标头(在成功的SYN和不成功的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校验和必须更改。

顺便说一下,这是一个非常有趣的问题。