如何强制 TCP 数据包使用特定的 NIC

如何强制 TCP 数据包使用特定的 NIC

我的 Linux(内核 3.17)计算机有多个 NIC:eth0、eth1、(和/或 eth2...)

我有几台电脑连接到每台电脑:

PC0 <---> eth0 (192.168.1.100)
PC1 <---> eth1 (192.168.1.101)
PC2 <---> eth2 (192.168.1.102)

Linux 计算机上的应用程序启动线程来侦听 192.168.1.100(以及其他两个)。收到来自 PC0 的数据包后,线程进行回复。如何保证回复绝不尽管 eth1 或 eth2 具有相同的子网掩码,但仍要通过 eth1 或 eth2?同样,从 pc1 接收数据包后,回复不应通过 eth0 或 eth2。

理想情况下,为了实现我所说的,我应该使用三个完全不同的子网,例如10.0.0.1和172....,但我的同事建议它可以工作,所以我在这里寻找同行的意见。内核在我的控制之下,我构建它,因此可以提出任何使其工作的解决方案。

解释

为什么三个网卡在同一子网上? Eth0 是 Linux 启动期间静态分配的主要 IP 地址。它不应该改变,但如果需要的话可以改变。问题是:如果现场人员不小心将 eth1 和 eth2 分配为与 eth0 具有相同的子网怎么办?如果套接字在某个端口上侦听 eth0,我的应用程序是否只会回复 eth0?

可能的路由表

规则是如果请求来自 NIC,则通过 NIC。我从某处复制的

ip route add 172.16.10.0/24 dev eth0 src 172.16.10.10 table 10
ip route add default via 172.16.10.251 table 10
ip route add 172.16.10.0/24 dev eth1 src 172.16.10.20 table 20
ip route add default via 172.16.10.251 table 20
ip route add 172.16.10.0/24 dev eth0 src 172.16.10.10
ip route add 172.16.10.0/24 dev eth1 src 172.16.10.20
ip route add default via 172.16.10.251
ip rule add from 172.16.10.10 table 10
ip rule add from 172.16.10.20 table 20
ip route flush cache

答案1

通常,应用程序绑定到 IP 地址,而不是特定接口。 (例外情况是直接干扰网络的应用程序,例如 tcpdump/wireshark 等 - 但这不是您的情况,因此请忽略这一点。)大多数应用程序可以仅绑定到一个 IP 地址或全部 IP 地址(但通常不是)到不止一个但不是全部)。其中哪些适用于您的特定应用程序将取决于其编码方式。

当客户端连接到此套接字时,该连接由四个项目标识:

  1. 您自己的IP地址(例如192.168.1.100)
  2. 您自己的端口(例如8080)
  3. 客户端的IP地址
  4. 客户端的端口

发送到您在此连接上接收的数据的任何响应都将使用这四个特征发送 - 即它们不会从您服务器上的另一个 IP 或接口发送。

因此,只要您的应用程序所做的是侦听 {IP,port}、接受该 {IP,port} 上的连接并回复客户端,就不应该有任何问题。

您可能会遇到问题的地方是您的应用程序有时会启动自己的连接。在这种情况下,它(通常)会让计算机决定使用哪个接口。如果您的计算机认为所有三个接口同样有效,则流量可能会从错误的接口流出。

仍然可以让您的计算机始终使用特定的界面 - 具体如何操作将取决于您的特定操作系统/发行版。要搜索的术语是“unix 源路由”。

相关内容