linux - 在双网卡 Linux 系统中对特定网卡执行连接

标签 linux sockets c++11

商业案例:

现在是 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/

相关文章:

java - 为什么我的进程变成了 T (Terminated)State ?

linux - 求助,不知道如何制作这个Makefile

sockets - 我无法在此代码中连接udp服务器和udp客户端?

c - C中tcp套接字中的可变长度数据

c++ - 将文件读入数组并从函数 C++ 返回它

linux - 关于使用 PTRACE_SYSEMU 有什么好的指南吗?

linux - 从 Windows 资源管理器中的共享文件夹执行 bash 脚本

c# - Windows 上的套接字 - 我是否遗漏了程序中的某些内容?

C++:是否可以模板化类型名?

c++ - 使用 lambda 作为试运行选项正常吗?