我正在开发一个在Windows机器上的2个网络接口之间执行NAT的应用程序,我有一个问题可以理解正在发生的事情。
系统中有2个网络接口:
我的应用做了什么:
为了演示发生了什么,我在测试期间附加了.cap file Microsoft Network Monitor 3.4抓取的数据包(也可以用Wireshark打开)。测试包括与google.com:80建立TCP连接。首先,通过物理接口直接建立连接,以证明存在互联网连接,然后通过TAP接口建立连接以测试NAT。
从上到下的数据包分析:
一切都很好,我们有互联网连接。现在我将默认网关更改为我的应用程序运行的虚拟路由器(192.168.200.1)
在NAT之后,在物理接口上发送的数据包几乎与第一次测试中发送的数据包相同,并且网络拓扑中没有任何更改。为什么第二个TCP连接不成功?这没有任何意义。
程序正在使用WinPcap。 Here是感兴趣的代码。
答案 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校验和必须更改。
顺便说一下,这是一个非常有趣的问题。