6

摘要:我正在尝试创建套接字以在同一台机器上存在的两个物理接口之间传递数据,而 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 套接字。

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

4

3 回答 3

5

使用 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 将看到每个本地数据包的重复副本 - 一个出站和一个入站 -但您可以过滤掉重复项)。

于 2011-01-28T23:26:18.607 回答
0

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

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

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

于 2011-01-27T23:36:49.587 回答
0

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

于 2011-01-28T03:11:52.703 回答