如果有一台 Linux 主机在两个不同的网络上有两个接口(主网络和带外管理网络,称为“主”和“mgmt”),那么返回流量如何通过其来源的同一接口路由回来?
换句话说:从我所在的位置,我通过路由器访问机器的主接口或管理接口。当我通过 ssh 连接到主接口时,没有问题。当我通过 ssh 连接到管理接口时,我的数据包到达服务器,但服务器通过主接口上的默认网关将其响应发回。因此,我的连接未建立。我如何让服务器通过管理网络响应在管理网络上接收的入站请求?
答案1
我在这里找到了大部分答案: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
Linux 内核 2.2 和 2.4 支持多个路由表,每个路由表的编号为 0 到 255。通常使用的两个路由表是local
(路由表 255) 和main
(路由表 254)。这些路由表列在 中/etc/iproute2/rt_tables
。您可以通过选择一个未使用的编号(查看/etc/iproute2/rt_tables
)并将其添加到 来创建新的路由表/etc/iproute2/rt_tables
。
就我而言,“主”接口是eth0
192.168.20.20,网关是 192.168.20.1,“mgmt”接口是eth1
192.168.5.5,网关是 192.168.5.1。
我选择新的路由表编号200和新路由表名称mgmt
。
echo "200 mgmt" >> /etc/iproute2/rt_tables
接下来,您需要创建一条规则,以将新的路由表用于管理接口上收到的流量。互联网上的其他资源说您只需要对一个接口执行此操作,但您实际上需要在两个接口上执行此操作,原因如下:请注意,如果您只启动一个接口,则该接口能够响应 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
此时,两个接口都应该响应。现在,为了使其持久化,请注意,如果您读取/etc/sysconfig/network-scripts/ifup-routes
,它将解析所有rule-*
和route-*
文件,并相应地将每行作为参数传递给ip rule add
或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
重新启动后,您会发现两个接口都默认正常工作。
答案2
基于源的路由/ ip rule
。
假设primary
有1.2.3.4
和mgmt
有2.3.4.5
(它们的默认网关分别为1.2.3.1
和2.3.4.1
):
ip rule add from 1.2.3.4 table 234
ip route add default via 1.2.3.1 dev primary table 234
(以上内容为可选)
ip rule add from 2.3.4.5 table 345
ip route add default via 2.3.4.1 dev mgmt table 345