【问题标题】:How to write user-mode NAT without any binding port?如何在没有任何绑定端口的情况下编写用户模式 ​​NAT?
【发布时间】:2012-03-21 12:21:02
【问题描述】:

我想制作自己的用户模式 ​​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 重置了我的 NAT 连接。我根本不想绑定任何端口。

我该如何处理?

更新:

user1202136,怎么可能:

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

不编写自己的 NDIS 驱动程序?

【问题讨论】:

    标签: sockets tcp capture nat tcp-ip


    【解决方案1】:

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

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

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

    【讨论】:

    • +1,正确的规范,过滤可疑RST数据包的正确方法。哦,当人们第一次开始这样做以防止他们的 ISP 杀死他们的下载时,我有美好的回忆...... *摇晃手杖*
    • ...或者如果您愿意添加一个非用户模式组件,您可以创建一个中间 NDIS 驱动程序来丢弃您不希望 TCP 堆栈看到的 RST 数据包。
    猜你喜欢
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 2022-09-28
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    • 2023-01-10
    相关资源
    最近更新 更多