我正在开发一个在Windows机器上执行NAT的应用程序,在Windows机器上执行NAT操作,而且我在理解所发生的事情上遇到了一些问题。
系统中有两个网络接口:
我的应用程序是做什么的:
为了演示发生了什么,我在测试期间附加了一个.cap文件,其中包含了Microsoft网络监视器3.4捕获的数据包(也可以用Wireshark打开)。测试包括建立与google.com:80的TCP连接。首先通过物理接口直接建立连接,以证明存在internet连接,然后通过TAP接口建立连接测试NAT。
从上到下的数据包分析:
很好,我们有互联网连接。现在,我将默认网关改为由我的应用程序操作的虚拟路由器(192.168.200.1)
经过NAT后,物理接口上发送的数据包与第一次测试中发送的数据包几乎完全相同,网络拓扑结构没有任何变化。为什么第二个TCP连接失败?这没有任何意义。
该程序正在使用WinPcap。如果感兴趣的话,这里就是代码。
发布于 2014-01-22 18:41:28
我已经检查了捕获的文件,我没有看到在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:03:03:03:03:03:03:03:03:03:03:03:03:03:03:-Google使用相同的源端口49181 )。这似乎不是一个问题,因为这是两台不同的机器,但我会调查那里的最后一个资源。不过,我不认为这是个问题。
编辑:
在您解释了TCP段未被修改后,我意识到问题在于您没有重新计算TCP校验和!两个SYN消息(框架7和8)具有相同的TCP校验和。如果IP地址更改,则TCP校验和必须更改。
顺便说一句,这是一个非常有趣的问题。
https://stackoverflow.com/questions/21281513
复制相似问题