Ned*_*Ned 5 networking linux routing
如果有一台 Linux 主机在两个不同的网络(主网络和带外管理网络,称它们为“主”和“管理”)上有两个接口,则返回流量如何通过同一接口路由回它从哪里来?
换句话说:从我坐的地方,我通过路由器访问机器的主接口或管理接口。当我 ssh 到主界面时,没有问题。当我 ssh 到 mgmt 接口时,我的数据包到达服务器,但服务器通过主接口上的默认网关发回其响应。因此,我的连接没有建立。如何使服务器通过 mgmt 网络响应在 mgmt 网络上收到的入站请求?
我在这里找到了大部分答案: https: //unix.stackexchange.com/questions/4420/reply-on-same-interface-as-incoming
更多信息在这里: http: //linux-ip.net/html/routing-tables.html
另外,感谢 Tom Yan,提供了包含大部分所需部分的答案。但我发布这个答案是因为其他答案都不是真正完整、完全准确或易于理解的。
以下过程适用于 Centos 7。我无法让它与 NetworkManager 一起使用,因为 NetworkManager 不读取/etc/sysconfig/network-scripts/rule-*和route-*,并且我找不到等效的nmcli命令来使这些更改持久化。如果有人有这样的命令,请分享。因此,第一个必需步骤是禁用 NetworkManager:
systemctl disable NetworkManager
systemctl enable network
systemctl stop NetworkManager
systemctl start network
Run Code Online (Sandbox Code Playgroud)
Linux内核2.2和2.4支持多个路由表,每个路由表编号为0到255。通常使用的两个路由表是local(路由表255)和main(路由表254)。这些都列在 中/etc/iproute2/rt_tables。您可以通过选择未使用的号码(查看/etc/iproute2/rt_tables)并将其添加到 来创建新的路由表/etc/iproute2/rt_tables。
在我的例子中,“主”接口是eth0192.168.20.20,网关为 192.168.20.1,“管理”接口为eth1192.168.5.5,网关为 192.168.5.1。
我选择新的路由表编号 200 和新的路由表名称mgmt。
echo "200 mgmt" >> /etc/iproute2/rt_tables
Run Code Online (Sandbox Code Playgroud)
接下来,您需要创建一条规则,以便对 mgmt 接口上接收的流量使用新的路由表。互联网上的其他资源说您只需要对一个接口执行此操作,但实际上您需要在两个接口上执行此操作,原因如下:注意,如果您仅启动一个接口,则该接口能够响应 ping,但是,如果您同时启动两个接口,则第一个启动的接口会响应 ping,而第二个接口则不会响应。这意味着,如果您先打开mgmt接口,然后打开主接口,则主接口将不会响应。因此,最好在两个接口上定义规则。
这可以一次性完成(非持久),如下所示:
ip rule add from 192.168.20.20 table main
ip route add default via 192.168.20.1 dev eth0 table main
ip rule add from 192.168.5.5 table mgmt
ip route add default via 192.168.5.1 dev eth1 table mgmt
Run Code Online (Sandbox Code Playgroud)
此时,两个接口都应该响应。现在,为了使其持久化,请注意,如果您阅读/etc/sysconfig/network-scripts/ifup-routes,它将解析所有rule-*和route-*文件,并将每一行作为参数传递给ip rule addor ip route add。因此创建四个新文件,如下:
echo "from 192.168.20.20 table main" > /etc/sysconfig/network-scripts/rule-eth0
echo "default via 192.168.20.1 dev eth0 table main" > /etc/sysconfig/network-scripts/route-eth0
echo "from 192.168.5.5 table mgmt" > /etc/sysconfig/network-scripts/rule-eth1
echo "default via 192.168.5.1 dev eth1 table mgmt" > /etc/sysconfig/network-scripts/route-eth1
Run Code Online (Sandbox Code Playgroud)
重启后,您应该会发现两个界面都默认工作。