我的任务是设置两台运行 CentOS 7.1 的测试服务器(最小安装; NetworkManager 在两者上均被禁用),并遇到了一系列问题,我想在这里获得帮助。下面先介绍背景,然后列出最后的问题。
背景信息
每一个都有四个网络接口。服务器 A 位于子网 A 上192.168.15.0/24
,连接到交换机 A。服务器 B 位于子网 B 上192.168.16.0/24
,连接到交换机 B。两台三层交换机 A 和 B 也相互连接。交换机 A 具有 VLAN0015,该 VLAN0015 具有192.168.15.1
子网 A 的 as gw。同样,交换机 B 具有 VLAN0016,该 VLAN0016 具有192.168.16.1
子网 B 的 as gw。每台交换机都有一条静态路由,用于在两个 VLAN 之间路由流量。
服务器网络设置要求如下:
- 每个服务器上的所有四个接口应该能够独立发送/接收流量(例如
ping -I 192.168.15.100 -c 2 192.168.16.103
(请注意,这两个 IP 有不同的最后一个字节!)应该只看到对之间的 ICMP 流量),即子网中的任何接口都应该能够与另一个子网上的任何接口进行通信。 - 接口粘合是有意的不是用过的
- 所有四个接口都应使用各自子网的 gw (对于子网 A
192.168.15.1
:;对于子网 B:192.168.16.1
) 与其他子网上的其他服务器的接口进行通信。
我做了什么:
- 添加到
/etc/iproutes/rt_tables
以下内容:4 ens1f1table 3 ens1f0table 2 ens20f1table 1 ens20f0table
- 介绍
/etc/sysconfig/network-scripts/
route-*
并rule-*
针对每个服务器上的四个接口中的每一个(下面给出示例)
例如,对于服务器A的接口ens20f0
,我有以下内容/etc/sysconfig/network-scripts/route-ens20f0
:
192.168.15.0/24 dev ens20f0 src 192.168.15.100 table ens20f0table default via 192.168.15.1 dev ens20f0 table ens20f0table
并在其中/etc/sysconfig/network-scripts/rule-ens20f0
:
from 192.168.15.100/32 table ens20f0table to 192.168.15.100/32 table ens20f0table
设置“有点有效”但是时,从一台服务器我无法 ping 通另一台服务器的任何接口。经过一番tracerout
研究后,我意识到某些接口没有正确的流量路由。为了解决这个问题,我应用了以下内容
/sbin/route add -net 192.168.16.0/24 gw 192.168.15.1 dev ...
到每一个ens20f0|ens20f1|ens1f0|ens1f1
到力量例如服务器 A 的内核路由表如下所示:
Kernel IP routing table Destination Gateway Genmask Flags MSS Window irtt Iface 0.0.0.0 192.168.11.3 0.0.0.0 UG 0 0 0 ens10f0 169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 ens20f0 169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 ens10f0 169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 ens20f1 169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 ens1f0 169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 ens1f1 192.168.11.0 0.0.0.0 255.255.255.0 U 0 0 0 ens10f0 192.168.15.0 0.0.0.0 255.255.255.0 U 0 0 0 ens20f0 192.168.15.0 0.0.0.0 255.255.255.0 U 0 0 0 ens20f1 192.168.15.0 0.0.0.0 255.255.255.0 U 0 0 0 ens1f0 192.168.15.0 0.0.0.0 255.255.255.0 U 0 0 0 ens1f1 192.168.16.0 192.168.15.1 255.255.255.0 UG 0 0 0 ens1f1 192.168.16.0 192.168.15.1 255.255.255.0 UG 0 0 0 ens1f0 192.168.16.0 192.168.15.1 255.255.255.0 UG 0 0 0 ens20f1 192.168.16.0 192.168.15.1 255.255.255.0 UG 0 0 0 ens20f0
问题:
为什么我尝试使用已弃用的 /sbin/route
代替ip route add
?这是因为ip route add
没有添加所需的路由条目。
显然,“绕行”设置并不是持久的。所以,
- 如何使当前的“绕过”至少在系统重新启动后持续存在?有一个
/etc/sysconfig/network-scripts/ifup-post
,但它是正确的地方吗? RHEL 7 文档甚至没有提到这个脚本,无论如何也不适合非订阅者。 - 一台服务器 A,我尝试将
192.168.16.0/24 via 192.168.15.1 dev ens20f0
其放入route-ens20f0
.在 a/sbin/ifdown ens20f0
和 then之后/sbin/ifup ens20f0
,所需的路由没有出现在内核路由表中。我做错了什么?我回顾了man ip-route(8)
很多次但无法判断。 - 为什么该
/sbin/route
命令能够将所需的路由添加到内核路由表,但较新的命令ip route add|replace
却不能,即使在 CLI 上也是如此? - 提到
man ip-route
了append
other notip route { add | del | change | append | replace } ROUTE
,但没有对该append
指令进行任何描述,它有什么用? - 我上面描述的方法是使用“基于策略的路由”来满足给我的要求的正确方法吗?这似乎是“某种工作”,例如我可以从一个服务器的某些接口使用
ping -I iface
其他服务器的接口进行 ping 操作。但正如我的tracerout
ing 检查所显示的那样,这样做的能力似乎并不可靠。
我不知道还能尝试什么。反复阅读RHEL 7 网络指南 2.4.1。使用 ifcfg 文件配置网络接口没有帮助。如果有任何关于我错过的内容的提示,我将不胜感激。
——扎克
答案1
主机不应为其直接连接的 IP 网络配置网关。
为此,您不需要多个路由表 - 这会使事情变得非常复杂,而且您还没有说过任何有关将数据包标记放入 iptables 规则集中的内容,因此路由表可能会被忽略
另外,我强烈建议您绘制一张网络图片/地图,以便它显示 IP 和网络掩码。这是一个很好的例子:
因此,有了这样的地图,您就可以跟踪数据包的路径,看看会发生什么。 TCP 数据包应采用相同的路径来回,而 ICMP 数据包则更宽容。
现在,根据您的配置,您可以在所有四个接口 ens20f0、ens20f1、ens1f0 和 ens1f1 上访问 192.168.15.x/24 网络。
您的内核将使用最后添加的路由。事实是,交换机会将您的 IP 地址与之前添加的路由之一相关联,因此交换机的 ARP 表中会存在不同的 MAC 地址。
因此,当它起作用时,它的起作用是偶然或巧合。
我建议您制定一个像示例一样的计划,但要包含您的详细信息。我怀疑你在画它的时候会有灵光一闪的时刻。这就是重点。
如果没有灯泡,请发布您的图片,我们将进一步讨论。
答案2
所以,你基本上是在尝试
- 同一 vlan 上有四个相同 ip-net 的地址
- 将远程网络上具有相似 IP 地址的接口上的流量路由到仅具有这些相似地址的远程接口?
我从未听说过像您这样的解决方案,但我已经退出网络业务很长时间了。所以只是给你一个想法:为什么不尝试将 15.X / 16.x 划分为 4 个子网在两台机器上,然后只需将路由添加到相应的网络并将 def-gw 添加到子网接口?
使用 26 位掩码 (255.255.255.192),这将给出 15.0(net) - 15.63(bcast) / 15.64-15.127 / 15.128-15.191 / 15.192-15.255 ,与 16.X 类似。
希望这个对你有帮助...