我有几台主机连接到同一个交换机,它们都在同一个子网(10.0.0.0/16)上。其中两台主机有更快的网络接口,所以我将它们连接在一起,这意味着这两台机器现在可以直接连接,无需通过交换机。
我现在需要设置路由,这样当这两台机器尝试相互通信时,数据包通过这个更快的直接链接而不是通过交换机的更慢的链接。
最简单的方法是将直接链接配置在不同的子网上,但是我需要根据要使用的接口使用不同的 IP 或主机名,并且我希望能够将标准配置部署到所有机器(例如 NFS 使用主机名挂载)并且不必维护自定义 IP 覆盖/etc/hosts
,我觉得这个解决方案太容易得到错误的主机名并通过错误的接口发送流量。
我正在寻找一种方法来告诉两台 Linux 机器即使eth0
处理 10.0.0.0/16,当你想与 10.0.0.5 通信时,即使它在 eth0 的子网中,也可以发送数据包eth1
。
我尝试添加一个主机路由规则,route add -host 10.0.0.5 dev eth1
它确实在正确的接口上发送数据包,但是它来自错误的 IP 地址(直接链接的子网而不是原始子网。)
我想解决这个问题的唯一方法是在两个接口上设置相同的 IP 地址,但这会导致任何问题吗?一台机器能否在多个 NIC 上正确地拥有相同的 IP 而不会导致问题?我假设我需要正确设置路由指标,以便为连接到交换机的 NIC 提供优先级(以避免子网的所有流量被错误地发送到另一台主机),但是我还需要什么知道这个设置吗?它会导致任何其他问题或难以解决的问题吗?
还是有更好、更强大的方法来实现这一目标?
编辑:这是@AB 要求的额外内容:
$ ip -br link
lo UNKNOWN 00:00:00:00:00:00 <LOOPBACK,UP,LOWER_UP>
eth0 UP ec:f4:xx:xx:xx:a4 <BROADCAST,MULTICAST,UP,LOWER_UP>
eth1 UP ec:f4:xx:xx:xx:a5 <BROADCAST,MULTICAST,UP,LOWER_UP>
$ ip -br address
lo UNKNOWN 127.0.0.1/8
eth0 UP 10.0.0.4/16
eth1 UP 10.0.99.4/24
$ ip route
default via 10.0.0.1 dev eth0 proto static
10.0.0.0/16 dev eth0 proto kernel scope link src 10.0.0.4
10.0.0.5 dev eth1 scope link
10.0.99.0/24 dev eth1 proto kernel scope link src 10.0.99.4
我在一个单独的子网上设置了直接链接 ( eth1
),然后尝试了route
我原来帖子中的命令,这就是现在的情况。看起来我可能需要src
为我的直接路线设置属性。
由于 10.0.99.4 是 10.0.0.0/16 的一部分,因此应避免使用此 IP 地址。否则会与实际的 10.0.99.4/16 地址发生冲突,即使在eth0上,考虑到 Linux 使用的是弱主机模型,并且默认情况下也会在eth0上为 10.0.99.4 响应此 IP 地址的 ARP 请求,从而产生 ARP 冲突. 不要使用有冲突的 IP 地址。
清理:
粘合 IP 地址的标准方法
让我们选择两个不相关的地址供两台主机使用。它们必须不与您网络上使用的其他任何东西发生冲突,但由于它们是点对点/32 地址,任何事情都可以做,它们不会被用作 LAN 的一部分,而只能用作点对点点/对等地址。我会随意使用192.168.100.4/32和192.168.101.5/32。如果稍后超过 2 个这些主机继承了一个更快的交换机并使用这个单独的交换机连接在一起,这可以稍微修改,并且在同一个块中拥有相关的 IP 地址再次变得更容易。
主机 10.0.0.4 的配置:
实际上上面的两个命令有一个快捷方式,你可以用下面的这个命令替换它们:
现在告诉主机到达 10.0.0.5/32(比 10.0.0.0/16 更具体)有一个使用对等 IP 地址的路由,但更喜欢与默认选择不同的源 IP 地址(过时的
route
命令不能这样做):有了这个,你会得到:
有一个小缺点:IP 广播仍然发送到eth0并且如果严格反向路径转发处于活动状态(
sysctl net.ipv4.conf.eth0.rp_filter
或者sysctl net.ipv4.conf.all.rp_filter
给出 1 而不是 0 或 2)这些广播,当由对等方发送时(例如在对等主机 10.0.0.5 上运行类似的东西toecho test | socat udp4-datagram:10.0.255.255:5555,broadcast -
) 将被忽略,因为在现在错误的接口上收到。因此,如果您正在使用依赖于此的协议并且已经应用了严格的反向路径转发,请在需要时将eth0切换到松散模式:主机 10.0.0.5 的等效配置:
例如,在类似 Debian 的ifupdown
interface
配置文件中,您可以对没有等效方向配置的任何命令使用pointopoint
关键字和一些附加命令。up
(sysctl
宁愿放入/etc/sysctl.d
)。无需额外(或重复)IP 地址的简化方法
实际上 192.168.100.4 和 192.168.100.5 的唯一作用是解析链路层地址以了解 10.0.0.4 和 10.0.0.5 的路由:它们被用作某种胶水,不会起到任何其他作用。这些 IP 地址将完全不可见,并且任何 IP 数据包都不会在其内容中使用 192.168.100.4 或 192.168.100.5(除非明确使用它们),只有 ARP 请求和应答才会。根本不需要使用这种粘合 IP 地址。
例如,主机提供商Hetzner 举了一个例子:
到达接口上的 IP 地址,而不在该接口上配置 IP 地址(也不将此接口用作桥接端口)。在此示例中,对等方
tap0
(它是以太网模式下的 tun/tap 设备,链接到另一端的 VM)必须回答 ARP 请求以解析链路层地址。但是再次出于对称原因,如果它已经在其他地方配置了 IP 地址,它也不需要在那里配置 IP 地址,以正确回答通过eth1完成的 ARP 请求:这又是 Linux弱主机模型实现的一部分。
所以这可以简单地用于主机 10.0.0.4,而无需使用任何额外的 IP 地址,只使用一个命令:
或者指定来源(以避免在主机有多个的情况下产生歧义):
对于主机 10.0.0.5:
为了从对等点接受eth0上的“慢”广播,他们仍然需要像以前一样:
解析其 IP 地址的 ARP 请求可以在两个接口上得到响应(如上面链接的那样,Linux 默认会这样做),但这里的解析或通常(旧)端eth0上的条目( 如果有)(例如:在这些设置到位之前)不会触发诸如ARP 通量之类的影响,因为两个对等点都配置在一起以使用eth1,而对路由没有其他可能的解释。
选择您喜欢的方法。第一个更经典,第二个设置更简单(但您可能会从同行那里得到一些“这行不通”)。请记住,当接口被管理性关闭然后启动时,手动添加的路由会丢失,因此必须将这些设置放入适当的网络配置设置中以保持正确有效。
使用 AB 的出色解释,这就是我最终为使其正常工作所做的工作,以造福于其他使用
systemd
:当然,另一台主机的源和目标 IP 地址(但不是网络掩码)是翻转的。