如何在没有任何绑定端口的情况下编写用户模式NAT?

时间:2012-03-21 12:21:03

标签: sockets tcp capture nat tcp-ip

我想创建自己的用户模式NAT应用程序。

我有以下方案:

  

VM2 [192.168。 8.2 ] ------ [192.168。 8.1 ] Win2003 [192.168。 9.1 ] --- --- [192.168。 9.2 ] VM1

     

VM3 [192.168。 8.3 ] _ /

     

VM4 [192.168。 8.4 ] _ /

  1. 我正在8.1和9.1接口上捕获RAW IP数据包。
  2. 来自8.1的一些数据包以这种方式转移到9.1接口:8.2-> 9.2替换为9.1-> 9.2
  3. 来自9.1的一些数据包以这种方式转移到8.1接口:9.2-> 9.1替换为9.2-> 8.2
  4. 我的应用程序根本不绑定任何端口 - 它只从接口捕获。

    我看到了这种情况:

    1. 8.2-> 9.2翻译为9.1-> 9.2包含SYN标志
    2. 9.2-> 9.1转换为9.2-> 8.2包含SYN + ACK标志
    3. 第2步包含带有RST标志的9.1-> 9.2;
    4. Windows Server 2003重置我的NATed连接。我根本不想绑定任何端口。

      我该如何处理?

      更新

      user1202136,怎么可能:

        

      使用Windows防火墙阻止来自您的端口的RST数据包   用户空间NAT使用。

      没有编写自己的NDIS驱动程序?

1 个答案:

答案 0 :(得分:5)

根据TCP规范,当在未绑定到任何进程的端口上收到ACK(或SYN + ACK)时,始终发送RST。这样做是为了确保可以可靠地检测到节点崩溃。

在您的情况下,Windows Server 2003中的TCP / IP实现会生成RST数据包。您应该阻止ACK到达TCP层或阻止RST到达线路。您可以尝试以多种方式执行此操作:

  1. 在接口上禁用TCP(但不是IP)。
  2. 使用Windows防火墙阻止来自用户空间NAT使用的端口的RST数据包。
  3. (不确定这是否有效)使用Windows防火墙阻止所有TCP数据包到用户空间NAT使用的端口。我担心这也会阻止数据包到达你的RAW套接字。