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

k06*_*06a 0 sockets tcp nat capture 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替换

我的应用程序根本不绑定任何端口 - 它只从接口捕获.

我看到了这种情况:

  1. 8.2-> 9.2翻译为9.1-> 9.2包含SYN标志
  2. 9.2-> 9.1转换为9.2-> 8.2包含SYN + ACK标志
  3. 第2步中包含9.1-> 9.2与RST标志...

Windows Server 2003重置我的NATed连接.我根本不想绑定任何端口.

我怎么处理这个?

更新:

user1202136,怎么可能:

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

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

use*_*136 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套接字.

  • +1,正确的规范,正确的方法来过滤掉可疑的`RST`包.哦,我很喜欢人们第一次开始这样做以防止他们的ISP杀死他们的下载......\*摇晃手杖\* (2认同)