指定当所有端口都具有相同 IP 地址时用于 UDP 写入的以太网端口

Specify which ethernet port to use for UDP writes when all have same IP addresses

我正在开发一个应用程序,该应用程序有一个带有 4 个 NIC 端口的服务器,这些端口将配置为所有 NIC 的相同静态 IP 地址 192.168.0.1,并与 4 个独立的黑盒通信,每个黑盒具有每个盒子上也有相同的静态 IP 地址 192.168.0.2。与黑盒子通信的唯一区别是端口号,例如盒子 1 将使用端口 2010 来收听我的数据,而盒子 2 将使用 2020,盒子 3 将使用 2030 等等类似传输回服务器的盒子模式,如端口 2110、2120、2130 等。服务器和黑盒子之间的布线接口是一对一的,中间没有任何交换机或集线器。这意味着以太网端口 eth1 直接进入盒子 1,eth2 进入盒子 2 等等。

在我的应用程序设计中,我将针对每个端口使用单独的套接字实例来应对不同的威胁。我不确定的一件事是如何指定套接字应该使用哪个以太网接口?我读过其他威胁中的 bind(),因为可以指定源的 IP 地址和端口并将它们绑定到套接字,让底层决定要使用的实际以太网适配器。由于我将使用数据报 UDP 数据包,无论客户端是否正在侦听,这些数据报都只是在网络上发送出去,因此我认为 ip/port 的解析在这里不起作用,我也不想向网络发送垃圾邮件非目的地数据包,因为已经丢失了数据流。此外,这将在 Windows 环境中使用 winsock2 在 C++11 下编写。

在这种情况下,我将如何指定将哪个 eth interface/adapter 用于特定套接字?

对于那些会问我为什么这样做的人,我别无选择,因为它是外部供应商的黑盒硬件,我无法控制指定不同的 IP 地址。

如果您尝试在软件中执行此操作,您将面临七层地狱。

恕我直言,最简单的解决方案是在四个网段中的每一个上放置一个普通的双 NIC 网关盒,它将从每个物理端口上单独配置的子网转换为每个黑盒上的(隐藏)重复地址.

+----------+                  +-------+                  +-------+
|          | 172.16.n.1       |       | 192.168.0.1      |       |
|   NIC n  +------------------+  NAT  +------------------+   BB  |
|          |       172.16.n.2 |       |      192.168.0.2 |       |
+----------+                  +-------+                  +-------+

NAT 框必须代理发送到 192.168.0.1 的数据包,就好像它们来自 172.16.n.2(或者以其他方式配置为将 172.16.n.1 作为目标地址)并且您需要配置端口转发以将入站数据包转发到 172.16.n.2 到隐藏的 192.168.0.2.

您可以这样做,但不能使用套接字,甚至不能使用主机的网络协议栈。

但是您可以使用 winpcap、tun/tap 或 slirp 等机制从特定接口发送和接收完整的数据包。实际上,适当的网络测试无论如何都需要这样做,因为您需要测试对等方处理畸形数据包的能力,主机网络堆栈永远不会生成这种数据包。

基本观察,你的任务本质上相当于在用户模式下实现桥接,虽然你不是从桥接学习中选择接口table,其他都是一样的。所以看看一些在Win32上做用户态桥接的软件,比如coLinux.

如果您的需求文档实际上说它将使用 Winsock2 完成,那么在您有任何进展的希望之前,您将需要努力改变它。 (这就是为什么需求应该指定目标,而不是手段。)