Win32 套接字 - 在发送到其他本地接口时强制 ip 数据包离开物理接口

ant*_*duh 6 sockets ip winapi loopback ipv4

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

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

Rem*_*eau 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
Run Code Online (Sandbox Code Playgroud)

或者,如果您知道 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>
Run Code Online (Sandbox Code Playgroud)

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

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