【问题标题】:Win32 sockets - Forcing ip packets to leave physical interfaces when sending to other local interfacesWin32 套接字 - 在发送到其他本地接口时强制 ip 数据包离开物理接口
【发布时间】:2011-06-16 21:59:05
【问题描述】:

总结:我正在尝试创建套接字以在同一台机器上存在的两个物理接口之间传递数据,而 Win32 套接字总是直接在内核中转发流量,而不是通过物理接口推送。有没有办法禁用这种行为,可能是通过设备设置、注册表调整、路由表恶作剧或套接字选项?我们使用的是 Windows XP SP3。

一些背景。我正在尝试构建一些完全自动化的 IP 测试来运行我们的定制 IPv4 设备。我们有一个大型的 Windows XP 机器实验室,以及我们连接到的每台设备的单独物理以太网接口。我们的设备实际上是以太网路由器,每个路由器都有自己的 IP。

我们需要通过我们的设备将数据从我们的实验室机器发送出去,然后再发送回同一台计算机。我们将通过设备发送单播和多播 UDP、TCP 和广播 IP 流量。

我们希望(并且可能需要)流量源自它注定要到达的同一台机器。 为此,我们在自己的子网上配置了两个独立的 NIC,每个 NIC 都有自己的 IP,例如 NIC #1 的 10.0.0.1/24 和 NIC #2 的 10.0.1.1/24。然后,我们的设备就像简单的直通路由器一样,有两个接口,一个在 10.0.0.0/24 子网,一个在 10.0.1.0/24 子网,它们只是来回转发数据包。

为了生成我们的数据,我们希望能够使用 Win32 套接字,因为它很容易理解,得到很好的支持,我们的客户正在使用它,并且可能是最快速的方法。数据包注入对于 UDP 和广播 IP 可能是可行的,但对于 TCP 很可能不可行。我会接受使用数据包注入的想法,但更喜欢标准 Win32 套接字。

如摘要中所述,数据包永远不会离开机器。我像疯子一样用谷歌搜索,但没有找到太多。有什么想法吗?

【问题讨论】:

    标签: winapi sockets ip ipv4 loopback


    【解决方案1】:

    Winsock 总是将数据包数据带到内核空间并在那里进行处理。这就是通用 API 的全部意义在于任何设备都在同一“层”处理。如果您想坚持使用 Winsock,我认为您无法(或不想)解决此问题。

    您可以使用TransmitPacketsTransmitFile 删除一些缓冲区复制,但不能在两个设备接口之间进行。

    话虽如此,Winsock 执行的额外缓冲区处理是否存在性能问题?安全问题?

    【讨论】:

    • 你在说什么? bind()'ing 到感兴趣的 NIC 的 IP 的套接字不会起作用吗?
    • @Hi-Angel 仅在 windows vista 之后。 Pre-vista 是一个弱模型,bind 只决定从哪里接收,而不是从哪里发送。
    【解决方案2】:

    如何在不同的虚拟机中运行测试仪的端点?然后你只需要一个硬件,但是你会有独立的 TCP/IP 堆栈,彼此不知道是本地的(大多数 VM 解决方案直接通过主机传递数据包,我不认为主机除非您在虚拟机之间配置桥接,否则将抓取数据包并将其直接发送到另一个虚拟机……但您会将每个虚拟机绑定到不同的物理网络适配器)。

    【讨论】:

      【解决方案3】:

      使用 Windows 的命令行 ROUTE 实用程序。您可以对其进行配置,以便将发送到特定子网上特定 IP 地址的任何 IP 数据包发送到另一个 IP/设备。例如:

      route ADD <NIC_1_IP> MASK <NIC_1_SUBNET> <DEVICE_IP_CONNECTED_TO_NIC_2> METRIC 1
      route ADD <NIC_2_IP> MASK <NIC_2_SUBNET> <DEVICE_IP_CONNECTED_TO_NIC_1> METRIC 1
      

      或者,如果您知道 NIC 接口的索引号,则可以指定它们:

      route ADD <NIC_1_IP> MASK <NIC_1_SUBNET> METRIC 1 IF <NIC_2_INTF>
      route ADD <NIC_2_IP> MASK <NIC_2_SUBNET> METRIC 1 IF <NIC_1_INTF>
      

      这样,每当数据包被发送到 NIC #1 的 IP 时,数据包就会到达连接到 NIC #2 的设备,然后该设备会将其传递给 NIC #1。对于发送到 NIC #2 的 IP 的数据包,反之亦然。

      例如,如果 PC 连接到带有路由器的网络,这是一种允许 WireShark 捕获本地 IP 流量的有用技术。从一个本地 IP/端口到另一个本地 IP/端口的数据包可以从路由器反弹回 PC,因此它们通过 WireShark 可以监控的物理接口传输(WireShark 将看到每个本地数据包的重复副本 - 一个出站和一个入站 -但您可以过滤掉重复项)。

      【讨论】:

      • 这是人们建议和我在搜索中找到的所有选项中效果最好的。我仍然无法将这项工作用于“广播”流量;我需要花更多的时间来处理它,但我觉得我需要 Win7 附带的 IP_UNICAST_IF 套接字选项(讽刺的是,使用“单播”选项进行广播......)
      猜你喜欢
      • 1970-01-01
      • 2011-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 2014-04-23
      • 1970-01-01
      相关资源
      最近更新 更多