商业案例:
现在是 2015 年,我使用的是 Linux 内核 3.17。我的 ARM Linux 有两个 NIC,eth0 和 eth1。 eth0 用于旁边的人在本地进行配置,eth1 用于远程配置。所以它们的功能基本相同,除了eth0有人在现场插线。
本地 PC ------ [eth0 我的 ARM Linux 计算机 eth1] ------ 远程 PC
使用eth0,上位机软件可以配置eth1的IP地址和端口进行配置。为此,我的 eth0 有一个预设的 IP 地址 (192.168.1.2),因此 PC 软件可以轻松找到它。 ARM Linux (3.17) 应用程序需要监听 eth0 端口 A 和 eth1 端口 B(如果已配置),一旦连接,就会响应,但永远不会发起任何事件(甚至不会 ping)。
本地PC和远程PC之间没有连接。它们不应该被桥接或联网。
问题一:
如果 eth1 配置了与 eth0 相同的 IP,我的应用程序是否仍然能够监听两个 NIC 端口并正确响应?我将有两个独立的线程(可能功能相同,但参数不同)来监听两个 NIC 端口。
这就是为什么我问我是否可以在连接和响应时指定 NIC,因为现在您可以看到它们可以具有相同的 IP 地址。理想情况下,操作系统知道连接请求来自哪里,因此它应该知道以何种方式回复,即使两个 NIC 具有相同的 IP,只要它们具有不同的以太网地址。但是,C++11 或 Berkeley 模型是否允许我在收听和回复时指定 eth0 或 eth1?
现在,本地 PC 和远程 PC 也可以有相同的 IP 地址(但不同于 ARM Linux)。但是想象一下我有两台ARM Linux电脑,那么这个配置就完全ok了。但不幸的是,我只有一个嵌入式系统和一个带有 eth0 和 eth1 的操作系统。
问题2:
如果问题 1 的答案是否定的,那么它们可以有相同的子网掩码吗?另外,本地PC和远程PC可以有相同的IP地址吗?
假设
设置路由表,是一个解决方案,如果可行的话。我想知道它是否可行,以及是否建议不要这样做。
此外,这是 Linux。很久以前针对 Windows 提出过类似的问题,Windows XP 说(否)并且我使用的是 Linux 3.17 并且我有相同的 IP 地址,所以事情与类似的问题不同。
最佳答案
在系统级别,您可以在中介盒上配置网桥。这可以在网桥的两侧具有相同的 IP 地址,并且可以使用 iptables 锁定以仅响应特定的 TCP/UDP 端口。
你不能在网桥两边的系统有相同的 IP 地址(即本地 pc 和远程 pc 不能有相同的 IP 地址)。您可以使用 ebtables 将网桥任一侧的访问限制为网桥本身的 IP 地址,这意味着本地 pc 只能与中介盒通信,而远程 pc 只能与中介盒通信。
这是基于从不期望本地和远程 pc 相互交谈。
虽然它主要是一个系统管理解决方案,但实际上并没有可供您作为开发人员使用的 API 来完成同样的事情。
关于linux - 在双网卡 Linux 系统中对特定网卡执行连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33319274/